我认为对于将哪些砝码用于什么有很多困惑。我不确定我是否确切地知道您会打扰您,所以我将涉及不同的话题,请耐心等待;)。
班级重量
来自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
:这就是上面的avg / total
结果。也称为宏平均。
- 使用真实阳性/阴性阴性等的全局计数来计算f1-分数(您将每个类别的真实阳性/阴性阴性的总数相加)。又名微平均。
- 计算f1分数的加权平均值。在scikit-learn中使用
'weighted'
将通过类的支持权衡f1分数:类具有的元素越多,则该类的f1分数在计算中就越重要。
这是scikit-learn中的3个选项,警告是说您必须选择一个 。因此,您必须为score方法指定一个average
参数。
选择哪种方法取决于您如何衡量分类器的性能:例如,宏平均不考虑类的不平衡,并且类1的f1分数与类的f1分数一样重要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"))
希望这可以帮助。
0
我正在研究情绪分析问题,数据看起来像这样:
由于1190个
instances
标记为5
因此我的数据不平衡。对于使用scikit的SVC进行的分类Im。问题是我不知道如何以正确的方式平衡我的数据,以便准确计算多类案例的精度,查全率,准确性和f1得分。因此,我尝试了以下方法:第一:
第二:
第三:
但是,我收到这样的警告:
如何正确处理我的不平衡数据,以便以正确的方式计算分类器的指标?