如何对 RandomForest 进行二值化以在 python 中绘制 ROC?
Posted
技术标签:
【中文标题】如何对 RandomForest 进行二值化以在 python 中绘制 ROC?【英文标题】:How to binarize RandomForest to plot a ROC in python? 【发布时间】:2017-10-29 21:03:46 【问题描述】:我有 21 节课。我正在使用随机森林。我想绘制一条ROC曲线,所以我查看了scikit中的例子ROC with SVM
该示例使用 SVM。 SVM 具有 RF 没有的参数,例如:probability 和 decision_function_shape。
那么我怎样才能对 RandomForest 进行二值化并绘制 ROC?
谢谢
编辑
创建虚假数据。所以有 20 个特征和 21 个类(每个类 3 个样本)。
df = pd.DataFrame(np.random.rand(63, 20))
label = np.arange(len(df)) // 3 + 1
df['label']=label
df
#TO TRAIN THE MODEL: IT IS A STRATIFIED SHUFFLED SPLIT
clf = make_pipeline(RandomForestClassifier())
xSSSmean10 = []
for i in range(10):
sss = StratifiedShuffleSplit(y, 10, test_size=0.1, random_state=i)
scoresSSS = cross_validation.cross_val_score(clf, x, y , cv=sss)
xSSSmean10.append(scoresSSS.mean())
result_list.append(xSSSmean10)
print("")
【问题讨论】:
predict_proba()
相当于decision_function()
。你可以使用它。
【参考方案1】:
对于多标签随机森林,您的 21 个标签中的每一个都有一个二元分类,您可以为 21 个类中的每一个创建一条 ROC 曲线。 您的 y_train 应该是每个标签的 0 和 1 矩阵。
假设您从 sklearn 拟合了一个多标签随机森林并将其称为 rf,并且在测试火车拆分后有一个 X_test 和 y_test。您可以使用以下方法在 python 中为您的第一个标签绘制 ROC 曲线:
from sklearn import metrics
probs = rf.predict_proba(X_test)
fpr, tpr, threshs = metrics.roc_curve(y_test['name_of_your_first_tag'],probs[0][:,1])
希望这会有所帮助。如果你提供你的代码和数据,我可以写得更具体。
【讨论】:
在我创建的模型中,y_train 是一个从 1 到 21 的矩阵(因为有 21 个类)。这就是为什么我想对其进行二值化。我的代码只是通过交叉验证训练模型。数据只是一个标签为 1 到 21 的矩阵。我将在 EDIT 中放置一些示例。以上是关于如何对 RandomForest 进行二值化以在 python 中绘制 ROC?的主要内容,如果未能解决你的问题,请参考以下文章
如何对您的数据框进行子集化以在 R 中保留前 3 个重复行?