gpt4 book ai didi

python - 如何使用 scikit learn 计算多类案例的准确率、召回率、准确率和 f1 分数?

转载 作者:IT老高 更新时间:2023-10-28 21:08:30 25 4
gpt4 key购买 nike

我正在处理情感分析问题,数据如下所示:

label instances
5 1190
4 838
3 239
1 204
2 127

所以我的数据自 1190 instances 以来是不平衡的标有 5 .对于使用 scikit 的分类 Im 的 SVC .问题是我不知道如何以正确的方式平衡我的数据,以便准确计算多类案例的准确率、召回率、准确率和 f1 分数。所以我尝试了以下方法:

首先:
    wclf = SVC(kernel='linear', C= 1, class_weight={1: 10})
wclf.fit(X, y)
weighted_prediction = wclf.predict(X_test)

print 'Accuracy:', accuracy_score(y_test, weighted_prediction)
print 'F1 score:', f1_score(y_test, weighted_prediction,average='weighted')
print 'Recall:', recall_score(y_test, weighted_prediction,
average='weighted')
print 'Precision:', precision_score(y_test, weighted_prediction,
average='weighted')
print '\n clasification report:\n', classification_report(y_test, weighted_prediction)
print '\n confussion matrix:\n',confusion_matrix(y_test, weighted_prediction)

第二:
auto_wclf = SVC(kernel='linear', C= 1, class_weight='auto')
auto_wclf.fit(X, y)
auto_weighted_prediction = auto_wclf.predict(X_test)

print 'Accuracy:', accuracy_score(y_test, auto_weighted_prediction)

print 'F1 score:', f1_score(y_test, auto_weighted_prediction,
average='weighted')

print 'Recall:', recall_score(y_test, auto_weighted_prediction,
average='weighted')

print 'Precision:', precision_score(y_test, auto_weighted_prediction,
average='weighted')

print '\n clasification report:\n', classification_report(y_test,auto_weighted_prediction)

print '\n confussion matrix:\n',confusion_matrix(y_test, auto_weighted_prediction)

第三:
clf = SVC(kernel='linear', C= 1)
clf.fit(X, y)
prediction = clf.predict(X_test)


from sklearn.metrics import precision_score, \
recall_score, confusion_matrix, classification_report, \
accuracy_score, f1_score

print 'Accuracy:', accuracy_score(y_test, prediction)
print 'F1 score:', f1_score(y_test, prediction)
print 'Recall:', recall_score(y_test, prediction)
print 'Precision:', precision_score(y_test, prediction)
print '\n clasification report:\n', classification_report(y_test,prediction)
print '\n confussion matrix:\n',confusion_matrix(y_test, prediction)


F1 score:/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:676: DeprecationWarning: The default `weighted` averaging is deprecated, and from version 0.18, use of precision, recall or F-score with multiclass or multilabel data or pos_label=None will result in an exception. Please set an explicit value for `average`, one of (None, 'micro', 'macro', 'weighted', 'samples'). In cross validation use, for instance, scoring="f1_weighted" instead of scoring="f1".
sample_weight=sample_weight)
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1172: DeprecationWarning: The default `weighted` averaging is deprecated, and from version 0.18, use of precision, recall or F-score with multiclass or multilabel data or pos_label=None will result in an exception. Please set an explicit value for `average`, one of (None, 'micro', 'macro', 'weighted', 'samples'). In cross validation use, for instance, scoring="f1_weighted" instead of scoring="f1".
sample_weight=sample_weight)
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1082: DeprecationWarning: The default `weighted` averaging is deprecated, and from version 0.18, use of precision, recall or F-score with multiclass or multilabel data or pos_label=None will result in an exception. Please set an explicit value for `average`, one of (None, 'micro', 'macro', 'weighted', 'samples'). In cross validation use, for instance, scoring="f1_weighted" instead of scoring="f1".
sample_weight=sample_weight)
0.930416613529

但是,我收到这样的警告:
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1172:
DeprecationWarning: The default `weighted` averaging is deprecated,
and from version 0.18, use of precision, recall or F-score with
multiclass or multilabel data or pos_label=None will result in an
exception. Please set an explicit value for `average`, one of (None,
'micro', 'macro', 'weighted', 'samples'). In cross validation use, for
instance, scoring="f1_weighted" instead of scoring="f1"

如何正确处理不平衡的数据,以便以正确的方式计算分类器的指标?

最佳答案

我认为对于哪些权重用于什么存在很多混淆。我不确定我确切地知道是什么困扰着您,所以我将涵盖不同的主题,请耐心等待;)。

类(class)权重

来自 class_weight 的权重参数用于训练分类器 .
他们不用于计算您使用的任何指标 : 不同的类权重,数字也会不同,因为分类器不同。

基本上在每个 scikit-learn 分类器中,类权重用于告诉您的模型一个类的重要性。这意味着在训练过程中,分类器会做出额外的努力来正确地对高权重的类进行分类。
他们如何做到这一点是特定于算法的。如果您想了解有关 SVC 如何工作的详细信息,并且该文档对您没有意义,请随时提及。

指标

一旦你有了一个分类器,你就想知道它的表现如何。
您可以在这里使用您提到的指标:accuracy , recall_score , f1_score ...

通常,当类别分布不平衡时,准确性被认为是一个糟糕的选择,因为它会给仅预测最频繁类别的模型提供高分。

我不会详细说明所有这些指标,但请注意,除了 accuracy ,它们自然应用于类级别:正如您在此 print 中看到的那样在分类报告中,它们是为每个类定义的。他们依赖于诸如 true positives 之类的概念。或 false negative这需要定义哪个类是正类。

             precision    recall  f1-score   support

0 0.65 1.00 0.79 17
1 0.57 0.75 0.65 16
2 0.33 0.06 0.10 17
avg / total 0.52 0.60 0.51 50

警告
F1 score:/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:676: DeprecationWarning: The 
default `weighted` averaging is deprecated, and from version 0.18,
use of precision, recall or F-score with multiclass or multilabel data
or pos_label=None will result in an exception. Please set an explicit
value for `average`, one of (None, 'micro', 'macro', 'weighted',
'samples'). In cross validation use, for instance,
scoring="f1_weighted" instead of scoring="f1".

您收到此警告是因为您使用了 f1 分数、召回率和准确率,而没有定义它们的计算方式!
问题可以改写:从上面的分类报告中,你如何输出 f1 分数的全局数字?
你可以:
  • 取每个类的 f1 分数的平均值:即 avg / total结果如上。它也称为宏平均。
  • 使用真阳性/假阴性等的全局计数计算 f1 分数(您对每个类的真阳性/假阴性的数量求和)。又名微平均。
  • 计算 f1 分数的加权平均值。使用 'weighted'在 scikit-learn 中,会通过类的支持来衡量 f1-score:一个类的元素越多,这个类在计算中的 f1-score 就越重要。

  • 这些是 scikit-learn 中的 3 个选项,警告是说你 必须挑一个 .所以你必须指定一个 average score 方法的参数。

    你选择哪一个取决于你想如何衡量分类器的性能:例如宏观平均不考虑类不平衡,类 1 的 f1-score 将与类的 f1-score 一样重要5. 但是,如果您使用加权平均,您将获得第 5 类的更多重要性。

    这些指标中的整个参数规范现在在 scikit-learn 中还不是很清楚,根据文档,它会在 0.18 版中变得更好。他们正在删除一些不明显的标准行为,并发布警告以便开发人员注意到它。

    计算分数

    最后我想说的(如果你知道可以跳过它)是,分数只有在分类器 的数据上计算时才有意义。没见过 .
    这非常重要,因为您在用于拟合分类器的数据上获得的任何分数都完全无关紧要。

    这是一种使用 StratifiedShuffleSplit 的方法,它为您提供了保留标签分布的数据的随机拆分(混洗后)。
    from sklearn.datasets import make_classification
    from sklearn.cross_validation import StratifiedShuffleSplit
    from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, classification_report, confusion_matrix

    # We use a utility to generate artificial classification data.
    X, y = make_classification(n_samples=100, n_informative=10, n_classes=3)
    sss = StratifiedShuffleSplit(y, n_iter=1, test_size=0.5, random_state=0)
    for train_idx, test_idx in sss:
    X_train, X_test, y_train, y_test = X[train_idx], X[test_idx], y[train_idx], y[test_idx]
    svc.fit(X_train, y_train)
    y_pred = svc.predict(X_test)
    print(f1_score(y_test, y_pred, average="macro"))
    print(precision_score(y_test, y_pred, average="macro"))
    print(recall_score(y_test, y_pred, average="macro"))

    希望这会有所帮助。

    关于python - 如何使用 scikit learn 计算多类案例的准确率、召回率、准确率和 f1 分数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31421413/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com