【问题标题】:How to get ROC curve for decision tree?如何获得决策树的 ROC 曲线?
【发布时间】:2018-01-04 16:41:39
【问题描述】:

我正在尝试为决策树找到 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是什么以及如何解决这个问题?

【问题讨论】:

    标签: python scikit-learn data-science auc


    【解决方案1】:

    首先,DecisionTreeClassifier没有属性decision_function

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

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

    可以看到DecisionTreeClassifierhere的可用属性

    一种可能的方法是对类进行二值化,然后计算每个类的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
    

    【讨论】:

      【解决方案2】:

      认为对于决策树,您可以使用 .predict_proba() 而不是 .decision_function(),因此您将得到如下结果:

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

      然后,其余代码将相同。 事实上,scikit learn 的 roc_curve 函数可以接受两种类型的输入: “目标分数,可以是正类的概率估计、置信度值或决策的非阈值度量(由某些分类器上的“decision_function”返回)。” 详情请见here

      【讨论】:

      • 你可以使用正类 y_score = tree_model.predict_proba(X_test)[:, 1],或者仅仅使用预测 y_score = tree_model.predict(X_test)
      猜你喜欢
      • 2021-01-13
      • 2016-05-26
      • 2020-10-05
      • 2020-05-18
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 2021-05-25
      相关资源
      最近更新 更多