2017-07-28 2846 views
2

我正在嘗試爲決策樹找到ROC曲線和AUROC曲線。我的代碼是像如何獲得決策樹的ROC曲線?

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,以及如何解決這個問題?

回答

4

首先,DecisionTreeClassifier沒有屬性decision_function

如果我從你的代碼的結構猜測,您看到這個example

在這種情況下,分類不在決策樹,但它是支持decision_function方法OneVsRestClassifier。

你可以看到DecisionTreeClassifierhere

可用屬性的一種可能的方法來做到這一點是雙穩態類,然後計算每個類的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 
0

認爲,對於一個決策樹,您可以使用.predict_proba()代替.decision_function(),所以你會得到如下的內容:

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

然後,代碼的其餘部分將是相同。 事實上,從scikit的roc_curve功能學習可以採取兩種類型的輸入: 「目標分數,可以是正類的概率估計,置信度值,或決定(如返回非閾值的測量‘decision_function’上一些分類器)「。 有關更多詳細信息,請參閱here