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