如何获得决策树的ROC曲线?
How to get ROC curve for decision tree?
我正在尝试为决策树找到 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
以及如何解决这个问题?
首先,DecisionTreeClassifier
没有属性decision_function
。
如果我从你的代码结构猜测,你看到了这个 example
在这种情况下,classifier 不是决策树,而是支持 decision_function 方法的 OneVsRestClassifier。
可以看到DecisionTreeClassifier
here
的可用属性
一种可能的方法是二值化classes,然后计算每个class的auc:
示例:
from sklearn import datasets
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
认为对于决策树你可以使用 .predict_proba() 而不是 .decision_function() 所以你会得到如下内容:
y_score = classifier.fit(X_train, y_train).predict_proba(X_test)
那么,剩下的代码就一样了。
事实上,来自 scikit learn 的 roc_curve 函数可以采用两种类型的输入:
"Target scores, can either be probability estimates of the positive class, confidence values, or non-thresholded measure of decisions (as returned by “decision_function” on some classifiers)."
有关详细信息,请参阅 here。
我正在尝试为决策树找到 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
以及如何解决这个问题?
首先,DecisionTreeClassifier
没有属性decision_function
。
如果我从你的代码结构猜测,你看到了这个 example
在这种情况下,classifier 不是决策树,而是支持 decision_function 方法的 OneVsRestClassifier。
可以看到DecisionTreeClassifier
here
一种可能的方法是二值化classes,然后计算每个class的auc:
示例:
from sklearn import datasets
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
认为对于决策树你可以使用 .predict_proba() 而不是 .decision_function() 所以你会得到如下内容:
y_score = classifier.fit(X_train, y_train).predict_proba(X_test)
那么,剩下的代码就一样了。 事实上,来自 scikit learn 的 roc_curve 函数可以采用两种类型的输入: "Target scores, can either be probability estimates of the positive class, confidence values, or non-thresholded measure of decisions (as returned by “decision_function” on some classifiers)." 有关详细信息,请参阅 here。