将 RandomForestClassifier Predict_Proba 结果添加到原始数据帧

Posted

技术标签:

【中文标题】将 RandomForestClassifier Predict_Proba 结果添加到原始数据帧【英文标题】:Add RandomForestClassifier Predict_Proba Results to Original Dataframe 【发布时间】:2018-08-03 11:18:17 【问题描述】:

我是一名新手,正在研究我的第一个“真正的”机器学习算法。抱歉,如果这是重复的,但我在 SO 上找不到答案。

我有以下数据框 (df):

index    Feature1  Feature2  Feature3  Target
001       01         01        03        0
002       03         03        01        1
003       03         02        02        1

我的代码如下所示:

data = df[['Feature1', 'Feature2', 'Feature3']]
labels = df['Target']
X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size = 0.8)

clf = RandomForestClassifier().fit(X_train, y_train)

prediction_of_probability = clf.predict_proba(X_test)

我正在努力解决的是如何将'prediction_of_probability' 重新放入数据框df

我了解预测不会针对原始数据框中的所有项目。

提前感谢您帮助像我这样的新手!

【问题讨论】:

您想替换y_test 还是想要全新的列? 另外,prediction_of_probability 的数据框是什么样的?你能分享几行它的输出吗? 【参考方案1】:

您可以尝试保留 train 和 test 的索引,然后以这种方式将它们放在一起:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

data = df[['Feature1', 'Feature2', 'Feature3']]
labels = df['Target']
indices = df.index.values 

# use the indices instead the labels to save the order of the split.

X_train, X_test,indices_train,indices_test = train_test_split(data,indices, test_size=0.33, random_state=42)

y_train, y_test = labels[indices_train],  labels[indices_test]


clf = RandomForestClassifier().fit(X_train, y_train)

prediction_of_probability = clf.predict_proba(X_test)

然后你可以把概率放到新的df_new

>>> df_new = df.copy()
>>> df_new.loc[indices_test,'pred_test'] = prediction_of_probability # clf.predict_proba(X_test)
>>> print(df_new)

   Feature1  Feature2  Feature3  Target  pred_test
1         3         3         1       1        NaN
2         3         2         2       1        NaN
0         1         1         3       0        1.0

甚至是对火车的预测:

>>> df_new.loc[indices_train,'pred_train'] = clf.predict_proba(X_train)
>>> print(df_new)

   Feature1  Feature2  Feature3  Target  pred_test  pred_train
1         3         3         1       1        NaN         1.0
2         3         2         2       1        NaN         1.0
0         1         1         3       0        1.0         NaN

或者如果你想混合训练和测试的概率,只需使用相同的列名(即pred)。

【讨论】:

【参考方案2】:

您所做的是训练模型。这意味着使用您拥有的特征和标签,您可以为未来的数据训练模型。 为了测试模型的质量(例如特征的选择),模型在 X_test 和 y_test 上进行测试。 在这种情况下,你没有未来的数据,所以你没有应用你的模型,你只是在训练它。您可以使用 AUC 或 ROC 曲线查看模型的质量。

无论如何,您都可以通过这种方式将结果附加到数据框中:

df_test = pd.DataFrame(X_test)
df_test['Target'] = y_test
df_test['prob_0'] = prediction_of_probability[:,0] 
df_test['prob_1'] = prediction_of_probability[:,1]

【讨论】:

【参考方案3】:

你需要这样的东西:

# Create new dataframe to store test data.
df1 = pd.DataFrame(X_test)
df1['Target'] = y_test
df1['prob'] = prediction_of_probability[:,0]  

# Create another dataframe to store train data
df2 = pd.DataFrame(X_train)
df2['Target'] = y_train

# Append both dataframes
df = df1.append(df2).sort_index()

【讨论】:

以上是关于将 RandomForestClassifier Predict_Proba 结果添加到原始数据帧的主要内容,如果未能解决你的问题,请参考以下文章

RandomForestClassifier 如何进行分类?

将 RandomForestClassifier Predict_Proba 结果添加到原始数据帧

scikit-learn RandomForestClassifier 产生“意外”结果

RandomForestClassifier 与 BaggingClassifier 不同

RandomForestClassifier 导入

ValueError:未知标签类型:RandomForestClassifier 中的“未知”