【问题标题】:How to get the only the scores that we need in classification report in sklearn?如何在sklearn的分类报告中获得我们唯一需要的分数?
【发布时间】:2020-04-06 09:39:36
【问题描述】:

我正在使用 sklearn cross_val_score 得到如下结果。

import numpy as np
my_results = cross_val_score(clf, X, y, cv=10, scoring = 'accuracy')
print(np.mean(my_results))

因此,这使我的交叉验证更加准确。要获得我的其他分数,我必须再次执行分类才能获得结果。

precision = cross_val_score(clf, X, y, cv=k_fold, scoring = 'precision_weighted')
#print(precision.mean())
recall = cross_val_score(clf, X, y, cv=k_fold, scoring = 'recall_weighted')
#print(recall.mean())
f1 = cross_val_score(clf, X, y, cv=k_fold, scoring = 'f1_weighted')
#print(f1.mean())

我只对accuracy, weighted average precision, weighted average recall, weighted avareage f-measure and auc 感兴趣,想通过只执行一次cross_val_score 来获得这些分数。

我遇到了sklearn的classification_report:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html。

但是,它不支持cross_val_score。我想知道在 sklearn 中是否有办法做到这一点。

如果需要,我很乐意提供更多详细信息。

编辑:

我尝试按照@t_e_o 的建议执行此操作。但是,它产生的结果是错误的。例如,考虑 iris 数据集。

from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:, :2]  # we only take the first two features.
y = iris.target

from sklearn.ensemble import RandomForestClassifier
clf=RandomForestClassifier(random_state = 0, class_weight="balanced")

from sklearn.model_selection cross_val_score, cross_validate
cross_val_score(clf, X, y, cv=10, scoring = 'accuracy')
cross_validate(clf, X, y, cv=10, scoring = ('accuracy'))

我得到的结果如下。

#cross_val_score
array([0.53333333, 0.73333333, 0.66666667, 0.8       , 0.73333333,
       0.6       , 0.86666667, 0.86666667, 0.6       , 0.8       ])
#cross_validate
{'fit_time': array([0.01695228, 0.01396275, 0.01296329, 0.01496124, 0.0149579 ,
        0.01097107, 0.01395988, 0.01495957, 0.01396394, 0.0149579 ]),
 'score_time': array([0.00199723, 0.00199652, 0.00199461, 0.00199294, 0.00199652,
        0.00199389, 0.00199485, 0.00199366, 0.00099611, 0.00099897]),
 'test_score': array([0.53333333, 0.73333333, 0.66666667, 0.8       , 0.73333333,
        0.6       , 0.86666667, 0.86666667, 0.6       , 0.8       ]),
 'train_score': array([0.94074074, 0.91851852, 0.92592593, 0.93333333, 0.91851852,
        0.91851852, 0.91111111, 0.8962963 , 0.91851852, 0.91851852])}

【问题讨论】:

  • 您得到了正确的结果。 cross_validate 函数的“test_score”与 cross_val_score 相同,即测试分数。 “cross_validate”函数用于多重评分,如scikit-learn.org/stable/modules/cross_validation.html 中所述。没有其他办法。要查找指标列表,请查看 sklearn.metrics.SCORERS.keys()
  • @ShaurabhBharti 感谢您的评论。 train_score 是什么意思?这是我们从训练数据中得到的结果吗?如果是这样,这个结果是否显示过度拟合? :)
  • 如您所知,在交叉验证中,数据 X 被多次拆分为训练集和验证集,轮流进行。模型使用训练数据进行训练,其准确性使用验证数据进行测试。但是,您也可以针对训练数据(此处为“train_score”)测试模型。这可能会给你一些见解。例如,您的 test_score 和 train_score 之间的不匹配程度很高,因为您的数据没有被打乱。改组后,该类将平均分布在训练集和验证集之间,因此分数会更接近。
  • @ShaurabhBharti 感谢您的有用评论。你的意思是stratified cross validation 随机播放吗?如果我错了,请纠正我:)

标签: python scikit-learn


【解决方案1】:

你听说过cross_validate 函数吗?它可能是您的正确选择,因此您可以计算多个值。示例:

>>> scores = cross_validate(lasso, X, y, cv=3,
     ...                         scoring=('r2', 'neg_mean_squared_error'),
      ...                         return_train_score=True)
>>> print(scores['test_neg_mean_squared_error'])
    [-3635.5... -3573.3... -6114.7...]
>>> print(scores['train_r2'])
    [0.28010158 0.39088426 0.22784852]

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_validate.html#sklearn.model_selection.cross_validate

希望对你有一个好的解决方案!

【讨论】:

  • 感谢您的建议。我尝试了以下代码scores = cross_validate(clf, X, y, cv=k_fold, scoring=("accuracy", "f1_weighted")) 并将结果与​​cross_val_score(clf, X, y, cv=k_fold, scoring = 'accuracy') 进行了比较。但是,我得到的结果完全不同。你知道为什么会这样吗?期待您的来信:)
  • 它们有何不同?通常在交叉验证过程中,每个折叠的样本是随机选择的,因此您会得到不同的结果。见stackoverflow.com/questions/39782243/…
  • 这是非常不同的。请参阅我的编辑以进行比较。你会明白我在说什么:)
  • 结果正确。 cross_validate 函数的“test_score”与该 cross_val_score 匹配。这是正确的答案。
【解决方案2】:

我遇到了类似的问题,但我找不到最佳解决方案,所以我只是使用字典来解决这个问题。在您的情况下,我认为您应该查看以下内容:

metrics = {'precision_weighted':[],'recall_weighted':[],'f1_weighted':[],'accuracy':[]}
for i in metrics:
   metrics[i].append(cross_val_score(clf, X, y, cv=k_fold, scoring = i)

【讨论】:

  • 非常感谢您的出色回答。但是,在您的解决方案(与我的相同)中,我需要执行 cross_val_predict 多次。问题是我的数据集非常大,运行一次大约需要 1 小时。所以,如果我要获得 5 个措施,总共需要 5 个小时。如果您找到解决此问题的好方法,请告诉我:)
  • Sklearn 文档声明“与 cross_validate 类似,但只允许使用一个指标。”。至于我等到周六我的 Elmo 完成的时间!如果我遇到解决方案,我会确保让您知道!快乐编码:)
  • 非常感谢。如果您找到了一个好的解决方案,请务必这样做。快乐编码:)
猜你喜欢
  • 2017-03-29
  • 2018-07-03
  • 2019-01-09
  • 2020-05-04
  • 2018-10-16
  • 2017-05-25
  • 2015-09-16
  • 2014-10-28
  • 2021-04-28
相关资源
最近更新 更多