Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在多类分类问题中,如何得到每个类的精度分数?_Python_Machine Learning_Scikit Learn_Svm_Multiclass Classification - Fatal编程技术网

Python 在多类分类问题中,如何得到每个类的精度分数?

Python 在多类分类问题中,如何得到每个类的精度分数?,python,machine-learning,scikit-learn,svm,multiclass-classification,Python,Machine Learning,Scikit Learn,Svm,Multiclass Classification,我正在进行情绪分析分类,我正在使用Scikit learn进行分类。它有3个标签,正极、中性和负极。我的培训数据的形状是(14640,15),其中 negative 9178 neutral 3099 positive 2363 我已经对数据进行了预处理,并将bag of wordsword矢量化技术应用到twitter的文本中,因为还有许多其他属性,它们的大小是(146401000)。 因为Y表示标签是文本形式,所以我对其应用了LabelEncoder。这就是我分割数据集

我正在进行情绪分析分类,我正在使用Scikit learn进行分类。它有3个标签,正极、中性和负极。我的培训数据的形状是
(14640,15)
,其中

negative    9178
neutral     3099
positive    2363
我已经对数据进行了预处理,并将
bag of words
word矢量化技术应用到twitter的文本中,因为还有许多其他属性,它们的大小是
(146401000)
。 因为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
,因为我想为每门课单独打分。另外,我不确定这个预测是否正确,因为我是为二进制分类写的?你能帮我调试一下使它更好吗。提前感谢。

如警告所述:

UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples.
从您的预测来看,您的三个类中似乎有一个缺失了
prediction\u int
(即,您从未预测过它);您可以很容易地检查是否存在这种情况

set(Y_test) - set(prediction_int)
如果不是这种情况,则应为空集
{}

如果确实是这样,并且上面的操作给出了
{1}
{2}
,最可能的原因是您的数据集不平衡(您有更多的
样本),并且您不要求分层拆分;将您的
train\u test\u split
修改为

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\u weight='balanced'
参数,即:

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

有关更多选项,请查看专用Python库(项目的一部分)。

这样做了,但当我执行
set(Y\u test)-set(prediction\u int)
时,会返回
{2}
,因此您的话非常正确。接下来我做了
X\u-train,X\u-test,Y\u-train,Y\u-test=train\u-test\u-split(bow,Y,test\u-size=0.3,random\u-state=42)
to
X\u-train,X\u-test,Y\u-train,Y\u-test=train\u-test\u-test\u-split(bow,Y,test\u-size=0.3,stratify,random\u-state=42)
并运行它,但仍然没有结果,和以前一样,就像最后一个精度缺失和
{>2}/code>。你认为我的预测有什么不对吗?@DebPrakashChatterjee,那是因为事实上你没有任何编码问题(可以说这就是全部),而是一个数据问题(类不平衡)。请注意,我只是建议“再试一次”(而不是“它应该起作用”或其他东西),也就是说,我写的是正确的操作,但仍然不意味着它足以处理不平衡的数据……这很清楚,但有任何选择吗?我知道这可能会失败,但我仍然想这样做,我即将完成我的最后一个项目。那么,我在请求,有成功的机会吗?我得到了,我已经打印了
预测_int
,结果是,它没有打印第三类
[0 0 0…1 0 0]
。很有问题。@DebPrakashChatterjee您的意思是,在使用了
class_weights='balanced'
之后,检查您的预测结果(测试数据),看起来没有一个数据点被预测为第三个class@SincoleBrans答案中已经指出了这一点,OP在其中的评论中也证实了这一点。