如何对 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何用C语言实现对图像的二值化?

二值化处理与边缘检测

如何对您的数据框进行子集化以在 R 中保留前 3 个重复行?

matlab怎么二值化

对图像进行二值化的处理方法,求源代码,最好是C++/C或者OPENCV

用opencv如何将一个二值化图像反色