首页 > 解决方案 > 如何获得多类分类问题中每个类的精度分数?

问题描述

我正在做情绪分析分类,我正在用 Scikit-learn 做。这有 3 个标签,正面、中性和负面。我的训练数据的形状(14640, 15)

negative    9178
neutral     3099
positive    2363

我已经对数据进行了预处理,并将bag-of-words词向量化技术应用于 twitter 的文本,因为还有许多其他属性,其大小为(14640, 1000). 由于 Y,表示标签采用文本形式,因此我对其应用了 LabelEncoder。这就是我拆分数据集的方式 -

X_train, X_test, Y_train, Y_test = train_test_split(bow, Y, test_size=0.3, random_state=42)
print(X_train.shape,Y_train.shape)
print(X_test.shape,Y_test.shape)

out: (10248, 1000) (10248,)
     (4392, 1000) (4392,)

这是我的分类器

svc = svm.SVC(kernel='linear', C=1, probability=True).fit(X_train, Y_train) 
prediction = svc.predict_proba(X_test) 
prediction_int = prediction[:,1] >= 0.3 
prediction_int = prediction_int.astype(np.int) 
print('Precision score: ', precision_score(Y_test, prediction_int, average=None))
print('Accuracy Score: ', accuracy_score(Y_test, prediction_int))

out:Precision score:  [0.73980398 0.48169243 0.        ]
Accuracy Score:  0.6675774134790529
/usr/local/lib/python3.6/dist-packages/sklearn/metrics/classification.py:1437: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples.
  'precision', 'predicted', average, warn_for)

现在我不确定为什么第三个,精度分数是空白的?我已经申请average=None了,因为要为每个班级单独打分。另外,我不确定预测是否正确,因为我是为二进制分类编写的?你能帮我调试一下,让它变得更好。提前致谢。

标签: pythonmachine-learningscikit-learnsvmmulticlass-classification

解决方案


正如警告所解释的:

UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples.

似乎您的预测中缺少您的 3 个类中的一个(从未预测过它);您可以轻松检查是否属于这种情况 prediction_int

set(Y_test) - set(prediction_int)

{}如果不是这种情况,它应该是空集。

如果确实如此,并且上述操作给出{1}or {2},最可能的原因是您的数据集不平衡(您有更多negative样本),并且您没有要求分层拆分;修改你train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(bow, Y, test_size=0.3, stratify=Y, random_state=42)

然后再试一次。

更新(评论后):

事实证明,您有一个类别不平衡问题(而不是编码问题),这会阻止您的分类器成功预测您的第 3 类 ( positive)。类不平衡本身就是一个巨大的子主题,并且提出了几种补救措施。尽管可以说更详细地超出了单个 SO 线程的范围,但您应该尝试的第一件事(除了上面的建议)是class_weight='balanced'在分类器的定义中使用参数,即:

svc = svm.SVC(kernel='linear', C=1, probability=True, class_weight='balanced').fit(X_train, Y_train) 

有关更多选项,请查看专用的不平衡学习Python 库(scikit-learn-contrib项目的一部分)。


推荐阅读