【问题标题】:Computing scikit-learn multiclass ROC Curve with cross validation (CV)使用交叉验证 (CV) 计算 scikit-learn 多类 ROC 曲线
【发布时间】:2018-01-20 08:06:34
【问题描述】:

我想用 ROC 曲线评估我的分类模型。我正在努力为交叉验证的数据集计算多类 ROC 曲线。由于交叉验证,训练集和测试集没有划分。 在下面,您可以看到我已经尝试过的代码。

   scaler = StandardScaler(with_mean=False) 

   enc = LabelEncoder()
   y = enc.fit_transform(labels)
   vec = DictVectorizer()

   feat_sel = SelectKBest(mutual_info_classif, k=200)    

   n_classes = 3

# Pipeline for computing of ROC curves                 
  clf = OneVsRestClassifier(LogisticRegression(solver='newton-cg', multi_class='multinomial'))
  clf = clf.label_binarizer_
  pipe = Pipeline([('vectorizer', vec),
             ('scaler', scaler),
             ('Logreg', clf),
             ('mutual_info',feat_sel)])

  y_pred = model_selection.cross_val_predict(pipe, instances, y, cv=10) 


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

# Plot of a ROC curve for a specific class
for i in range(n_classes):
     plt.figure()
     plt.plot(fpr[i], tpr[i], label='ROC curve (area = %0.2f)' % roc_auc[i])
     plt.plot([0, 1], [0, 1], 'k--')
     plt.xlim([0.0, 1.0])
     plt.ylim([0.0, 1.05])
     plt.xlabel('False Positive Rate')
     plt.ylabel('True Positive Rate')
     plt.title('Receiver operating characteristic example')
     plt.legend(loc="lower right")
     plt.show()

我想我可以通过使用属性label_binarizer_ 对 OneVsRestclassifier 进行二值化处理,如下所述:sklearn.multiclass.OneVsRestclassifier

但是,我收到以下错误:AttributeError: 'OneVsRestClassifier' object has no attribute 'label_binarizer_'。我没有收到此错误,因为文档告诉我这是 此分类器的属性。

当我添加 instances = DataFrame(instances)clf.fit(instances, y) 时,我收到错误:ValueError: Input contains NaN, infinity or a value too large for dtype('float64'). 。 Instances 是特征向量字典的列表。我尝试添加instances = np.array(instances),但这给了我这个错误:TypeError: float() argument must be a string or a number, not 'dict'

我做错了什么?

【问题讨论】:

  • 你不适合clf
  • 您的问题是您似乎根本不了解多类 ROC。取出交叉验证并尝试再次计算多类 ROC。提示:你不可能“计算每个类的 ROC 曲线和 ROC 面积”,这根本没有意义。
  • @Calimo 因为我刚刚开始学习计算语言学,所以编程对我来说是新的。我在理解多类 ROC 方面确实有问题。我想既然我想评估一个交叉验证的模型,我需要把交叉验证放到 ROC 曲线的计算中
  • @Bambi 在交叉验证方案中将它们拼凑在一起之前,请确保您单独了解所有部分。否则,就像你意识到的那样,它变得无法理解。
  • @VivekKumar 我不是已经在与vec = DictVectorizer() 合作了吗?

标签: python machine-learning attributes scikit-learn roc


【解决方案1】:

您可以通过这种方式使用label_binarizer 并获得所需的绘图作为输出。

使用虹膜数据的示例:

import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.metrics import roc_curve, auc
from sklearn.multiclass import OneVsRestClassifier
from sklearn.model_selection import cross_val_predict
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression

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

# Binarize the output
y_bin = label_binarize(y, classes=[0, 1, 2])
n_classes = y_bin.shape[1]

pipe= Pipeline([('scaler', StandardScaler()), ('clf', LogisticRegression())])
# or
#clf = OneVsRestClassifier(LogisticRegression())
#pipe= Pipeline([('scaler', StandardScaler()), ('clf', clf)])
y_score = cross_val_predict(pipe, X, y, cv=10 ,method='predict_proba')

fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_bin[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])
colors = cycle(['blue', 'red', 'green'])
for i, color in zip(range(n_classes), colors):
    plt.plot(fpr[i], tpr[i], color=color, lw=lw,
             label='ROC curve of class {0} (area = {1:0.2f})'
             ''.format(i, roc_auc[i]))
plt.plot([0, 1], [0, 1], 'k--', lw=lw)
plt.xlim([-0.05, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic for multi-class data')
plt.legend(loc="lower right")
plt.show()

【讨论】:

    猜你喜欢
    • 2012-09-11
    • 2016-02-06
    • 2014-12-22
    • 2018-01-15
    • 2021-05-08
    • 2018-06-01
    • 2015-06-23
    • 2016-04-25
    • 2015-09-04
    相关资源
    最近更新 更多