如何获得决策树的ROC曲线?

时间:2017-07-28 14:46:49

标签: python scikit-learn data-science auc

我正在尝试为决策树找到 ROC曲线 AUROC曲线。我的代码就像

clf.fit(x,y)
y_score = clf.fit(x,y).decision_function(test[col])
pred = clf.predict_proba(test[col])
print(sklearn.metrics.roc_auc_score(actual,y_score))
fpr,tpr,thre = sklearn.metrics.roc_curve(actual,y_score)

输出:

 Error()
'DecisionTreeClassifier' object has no attribute 'decision_function'

基本上,在找到y_score时出现错误。请解释什么是y_score以及如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

首先,DecisionTreeClassifier 没有属性decision_function

如果我从代码的结构中猜测,您看到了这个example

在这种情况下,分类器不是决策树,而是支持decision_function方法的OneVsRestClassifier。

您可以看到DecisionTreeClassifier here

的可用属性

一种可行的方法是对类进行二值化,然后计算每个类的auc:

示例:

from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.tree import DecisionTreeClassifier
from scipy import interp


iris = datasets.load_iris()
X = iris.data
y = iris.target

y = label_binarize(y, classes=[0, 1, 2])
n_classes = y.shape[1]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=0)

classifier = DecisionTreeClassifier()

y_score = classifier.fit(X_train, y_train).predict(X_test)

fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

#ROC curve for a specific class here for the class 2
roc_auc[2]

<强>结果

0.94852941176470573

答案 1 :(得分:1)

认为对于决策树,您可以使用.predict_proba()而不是.decision_function(),这样您将得到如下内容:

y_score = classifier.fit(X_train, y_train).predict_proba(X_test)

然后,其余代码将是相同的。 事实上,来自scikit learn的roc_curve函数可以采用两种类型的输入: “目标分数,可以是正类的概率估计,置信度值,也可以是决策的非阈值测量(由某些分类器上的”decision_function“返回)。” 有关详细信息,请参阅here