在 for 循环中使用不同的名称保存模型预测

Posted

技术标签:

【中文标题】在 for 循环中使用不同的名称保存模型预测【英文标题】:Save models predictions inside for loop with different names 【发布时间】:2021-01-09 18:05:46 【问题描述】:

我在 roder 中使用 scikit learn 在我拥有的 3 个不同数据帧(aa、bb、cc)上运行随机森林模型。 为了做到这一点,我使用 for 循环并为每个模型混淆矩阵生成。 问题是我想保存每个模型的预测,以便以后可以将其用于 ROC 分析。

这是循环的原始脚本:


todrop=['name','code','date','nitrogen','Hour','growth_day']
col='test'

dfs=[aa,bb,cc]


for h in dfs:
    h.drop(todrop,axis=1,inplace=True)
    y=h[col]
    X=h.drop(col,axis=1)
    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,stratify=y,random_state=42)
    
    rfc = RandomForestClassifier()
    rfc.fit(X_train,y_train)
    predictions = rfc.predict(X_test)
    conf_mat = confusion_matrix(y_test, predictions)
    df_conf_norm = conf_mat / conf_mat.sum(axis=0)

    index = ['healthy','sick'] 
    columns = ['healthy','sick'] 
    cm_df = pd.DataFrame(df_conf_norm,columns,index)
    

    seaborn.heatmap(cm_df,annot=True, annot_kws="size": 15,linewidths=.5, cmap='YlOrRd')

    plt.title('Random Forest', fontsize = 20) # title with fontsize 20
    plt.xlabel('True Labels', fontsize = 17) # x-axis label with fontsize 15
    plt.ylabel('Prediction', fontsize = 17) # y-axis label with fontsize 15
    plt.show()

    print('Accuracy'+''.format(accuracy_score(y_test,predictions))) 

我已尝试通过以下方式保存模型:

  predictions[h] = rfc.predict(X_test)  

然后我得到错误:

IndexError: 只有整数、切片 (:)、省略号 (...)、 numpy.newaxis (None) 和整数或布尔数组是有效的索引

我也尝试过使用 zip,然后将其保存为名称:

names=['aa','bb','cc']

for h,n in (zip(dfs,names)):
...
    predictions[n] = rfc.predict(X_test)

但遇到了同样的错误。

我在这里的最终目标是保存(每个模型的)这些预测,以便最终创建 ROC 图。

【问题讨论】:

你检查predictions的类型了吗?您可能希望将其初始化为循环外的字典,但它看起来像是一个 numpy 数组。 @AryaMcCarthy 结果类型是 numpy.ndarray 【参考方案1】:

在循环的每次迭代中,您都会创建一个名为 predictions 的 np.array 变量:

predictions = rfc.predict(X_test)

因此,如果您想将每个模型保存在一个变量中,例如 dict,您需要在循环外用不同的名称声明它:

all_predictions = dict()

然后修改第二个示例中的代码应该可以工作:

names=['aa','bb','cc']

for h,n in (zip(dfs,names)):
...
    all_predictions[n] = rfc.predict(X_test)

【讨论】:

以上是关于在 for 循环中使用不同的名称保存模型预测的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中使用保存模型进行预测

Python时间序列模型推理预测实战:时序推理数据预处理(特征生成lstm输入结构组织)模型加载模型预测结果保存条件判断模型循环运行

使用保存的 sklearn 模型进行预测

保存的随机森林模型在同一数据集上产生不同的结果

For循环调用不同的函数变量

在 R 的 for 循环中计算均值