【问题标题】:How to append regression coefficients from multiple models?如何附加来自多个模型的回归系数?
【发布时间】:2019-01-26 08:17:14
【问题描述】:

我有多个 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)

错误信息


ValueError                                Traceback (most recent call 
---> 12     pred_coef = np.append(pred_coef, np.transpose(np.array(model_log.coef_)), axis= 0)

~/anaconda3/lib/python3.7/site-packages/numpy/lib/function_base.py in append(arr, values, axis)
   4526         values = ravel(values)
   4527         axis = arr.ndim-1
-> 4528     return concatenate((arr, values), axis=axis)

ValueError: all the input arrays must have same number of dimensions

【问题讨论】:

    标签: python pandas numpy logistic-regression


    【解决方案1】:

    也许我误解了你的目标,但我认为你的错误在于以下几行:

    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)
    

    这应该为您提供一个 DataFrame,其中每一行都是给定 y 的系数。

    编辑:@Alollz 提出了一个很好的观点,即迭代地附加到 DataFrame 是低效的。这可以通过在循环之前创建一个列表而不是创建 pred_coef DataFrame 并将系数附加到它来简单地完成。然后你可以从列表中构建你的数据框。例如,

    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,因为它在每次迭代时都不必要地复制数据并且效率极低。最好追加到列表并在最后调用一次DataFrame 构造函数。
    • @ALollz 我读过这被称为“二次复制”,并使得迭代追加 O(n^2) 所以倾向于避免它。我相信这是因为 DataFrames 本质上是堆叠的系列,而系列不是大小可变的,而只是值可变的(尽管我不应该被引用)。我将编辑我的答案。
    猜你喜欢
    • 2023-03-19
    • 2014-10-13
    • 2016-08-18
    • 1970-01-01
    • 2020-10-27
    • 2021-12-24
    • 2021-02-02
    • 2019-12-20
    • 2020-12-22
    相关资源
    最近更新 更多