如何在“多类别分类问题”中获取每个类别的精度得分?

德布·普拉卡什·查特吉

我正在进行情感分析分类,并且正在使用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,因为要为每个班级单独分配一个精度分数。另外,我不确定该预测是否正确,因为我是针对二进制分类编写的?您能帮我调试一下使其更好吗?提前致谢。

Desertnaut

如警告所述:

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}{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项目的一部分)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Caffe中获取每个类别进行多标签分类的概率

如何在WordPress查询中获取所有分类类别的记录?

如何获得分类变量中类别的各种组合并同时进行汇总?

如何从表格中获取每个类别的名字?PostgreSQL

如何获取表中每个类别的最新日期?

如何在Python中获取多类分类问题的相邻准确性得分?

如何在每个类别的加载页面中仅获取 2 个产品

如何在Excel中根据每个类别的项目编号获取连续编号?

如何在 Django 中获取每个类别的唯一记录

如何在sql中从上到下获得分层类别的产品

如何从类别表中获取 5 个类别并在 Laravel 中获得每个类别的 4 个帖子

如何在vue中获取特定类别的产品列表

WEKA中的多类别分类

如何使用分组依据获取每个类别的计数?

如何按 ID 分组并获取每个类别的计数

如何获取每个类别的订单数量?

获取MySQL表中每个类别的行数

Mongoose 一对多,如何获取类别的字段值

如何在 Kotlin 中按类别获取问题

Seaborn如何在sns.catplot中添加每个类别的样本数量

如何在laravel中雄辩地显示每个类别的视频

如何在Hive SQL中列出每个类别的前10行

获取每个类别的每月价格?

SQL获取每个类别的计数

获取每个类别的最新状态

CategoryAxis (xAxis) 获取每个类别的位置

如何计算列中每个类别的份额?

如何计算或绘制CNN中每个类别的误差?

查询以获取每个类别+子类别的相等行数