Python 如何从多个模型中附加回归系数?

Python 如何从多个模型中附加回归系数?,python,pandas,numpy,logistic-regression,Python,Pandas,Numpy,Logistic Regression,我有多个Y变量,我正在运行一个循环来创建多个模型。我必须创建一个包含所有系数的二维numpy数组。在相同的情况下面临错误 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42) accuracy_logistic = np.ones(100,dtype = float) model_log = [] y_pred_output = np.array([])

我有多个Y变量,我正在运行一个循环来创建多个模型。我必须创建一个包含所有系数的二维numpy数组。在相同的情况下面临错误

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)    
accuracy_logistic = np.ones(100,dtype = float)
model_log = []
y_pred_output = np.array([])
    pred_coef = pd.DataFrame()
    for i in range(0,100):  

        model_log = LogisticRegression(class_weight='balanced')
        model_log.fit(X_train,y_train[:,i])
        log_prediction = model_log.predict(X_test)
        accuracy_logistic[i] = accuracy_score(y_test[:,i],log_prediction)

       ##Error inline below##

        pred_coef = np.append(pred_coef, np.transpose(np.array(model_log.coef_)), axis= 0)
错误消息



也许我误解了你的目标,但我认为你的错误如下:

pred_coef = np.append(pred_coef, np.transpose(np.array(model_log.coef_)), axis= 0)
您已经创建了一个DataFrame pred_coef,因此似乎应该使用df.append功能

pred_coef = pred_coef.append(pd.Series(model_log.coef_[0]), ignore_index=True)
这将为您提供一个数据帧,每一行都是给定y的系数

EDIT:@Alollz提出了一个很好的观点,即迭代附加到数据帧是低效的。这可以通过在循环之前创建一个列表来完成,而不是创建pred_coef数据帧并将系数附加到其中。然后可以从列表中构造数据帧。比如说,

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)    
accuracy_logistic = np.ones(y.shape[1],dtype = float)
model_log = []
y_pred_output = np.array([])
coef_list = []

for i in range(0,y.shape[1]):  
    model_log = LogisticRegression(class_weight='balanced')
    model_log.fit(X_train,y_train[:,i])
    log_prediction = model_log.predict(X_test)
    accuracy_logistic[i] = accuracy_score(y_test[:,i],log_prediction)
    coef_list.append(model_log.coef_[0])

pred_coef = pd.DataFrame(coef_list)

也许我误解了你的目标,但我认为你的错误如下:

pred_coef = np.append(pred_coef, np.transpose(np.array(model_log.coef_)), axis= 0)
您已经创建了一个DataFrame pred_coef,因此似乎应该使用df.append功能

pred_coef = pred_coef.append(pd.Series(model_log.coef_[0]), ignore_index=True)
这将为您提供一个数据帧,每一行都是给定y的系数

EDIT:@Alollz提出了一个很好的观点,即迭代附加到数据帧是低效的。这可以通过在循环之前创建一个列表来完成,而不是创建pred_coef数据帧并将系数附加到其中。然后可以从列表中构造数据帧。比如说,

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)    
accuracy_logistic = np.ones(y.shape[1],dtype = float)
model_log = []
y_pred_output = np.array([])
coef_list = []

for i in range(0,y.shape[1]):  
    model_log = LogisticRegression(class_weight='balanced')
    model_log.fit(X_train,y_train[:,i])
    log_prediction = model_log.predict(X_test)
    accuracy_logistic[i] = accuracy_score(y_test[:,i],log_prediction)
    coef_list.append(model_log.coef_[0])

pred_coef = pd.DataFrame(coef_list)

尽管您不应该在循环中附加到
数据帧
,因为它在每次迭代中都不必要地复制数据,而且效率极低。最好附加到一个列表,并在末尾调用一次
DataFrame
构造函数。@Alolz我已经读过,这被称为“二次复制”,并使迭代附加O(n^2),因此倾向于避免它。我相信这是因为数据帧本质上是堆叠的序列,序列不是大小可变的,而是值可变的(尽管我不应该被引用)。我将编辑我的答案。尽管你不应该在循环中附加到
数据帧
,因为它在每次迭代中都不必要地复制数据,而且效率极低。最好附加到一个列表,并在末尾调用一次
DataFrame
构造函数。@Alolz我已经读过,这被称为“二次复制”,并使迭代附加O(n^2),因此倾向于避免它。我相信这是因为数据帧本质上是堆叠的序列,序列不是大小可变的,而是值可变的(尽管我不应该被引用)。我将编辑我的答案。