首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个多类分类问题中,如何获得每一个类别的精确分数?

在一个多类分类问题中,如何获得每一个类别的精确分数?
EN

Stack Overflow用户
提问于 2019-08-07 15:37:48
回答 1查看 414关注 0票数 1

我正在做情感分析分类,我正在做它与Scikit-学习。这有三个标签,积极,中立和消极。我的训练数据的形状是(14640, 15),其中

代码语言:javascript
复制
negative    9178
neutral     3099
positive    2363

我已经对数据进行了预处理,并将bag-of-words单词矢量化技术应用于twitter文本,因为还有许多其他属性,其大小为(14640, 1000)。作为Y,意味着标签以文本形式存在,所以我将LabelEncoder应用于它。我就是这样分裂数据集的-

代码语言:javascript
复制
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,)

这是我的分类器

代码语言:javascript
复制
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,因为要为每一堂课做一个单独的精确评分。另外,我不确定这个预测,它是否正确,因为我写它的二进制分类?你能帮我调试一下使它更好吗?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-07 15:50:53

正如警告所解释的那样:

代码语言:javascript
复制
UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples.

您的3个类中似乎有一个类是,您的预测中缺少了(也就是说,您从未预测过);您可以很容易地检查是否存在这种情况

代码语言:javascript
复制
set(Y_test) - set(prediction_int)

如果不是这样的话,哪一个应该是空集{}

如果确实如此,并且上面的操作给出了{1}{2},那么最可能的原因是您的数据集不平衡(您有更多的negative示例),并且您不要求分层拆分;将train_test_split修改为

代码语言:javascript
复制
X_train, X_test, Y_train, Y_test = train_test_split(bow, Y, test_size=0.3, stratify=Y, random_state=42)

再试一次。

更新(注释后):

事实证明,您有一个类不平衡问题(而不是编码问题),它阻止分类器成功地预测第三个类(positive)。阶级不平衡本身就是一个巨大的子话题,并提出了几种解决办法.虽然更详细的内容可以说超出了单个SO线程的范围,但您首先要尝试的(在上面的建议之上)是在分类器的定义中使用class_weight='balanced'参数,即:

代码语言:javascript
复制
svc = svm.SVC(kernel='linear', C=1, probability=True, class_weight='balanced').fit(X_train, Y_train) 

有关更多选项,请查看专用的不平衡-学习 Python库( 坐骨木-学习-比较项目的一部分)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57397957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档