我正在做情感分析分类,我正在做它与Scikit-学习。这有三个标签,积极,中立和消极。我的训练数据的形状是(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,因为要为每一堂课做一个单独的精确评分。另外,我不确定这个预测,它是否正确,因为我写它的二进制分类?你能帮我调试一下使它更好吗?提前谢谢。
发布于 2019-08-07 15:50:53
正如警告所解释的那样:
UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples.您的3个类中似乎有一个类是,您的预测中缺少了(也就是说,您从未预测过);您可以很容易地检查是否存在这种情况
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)再试一次。
更新(注释后):
事实证明,您有一个类不平衡问题(而不是编码问题),它阻止分类器成功地预测第三个类(positive)。阶级不平衡本身就是一个巨大的子话题,并提出了几种解决办法.虽然更详细的内容可以说超出了单个SO线程的范围,但您首先要尝试的(在上面的建议之上)是在分类器的定义中使用class_weight='balanced'参数,即:
svc = svm.SVC(kernel='linear', C=1, probability=True, class_weight='balanced').fit(X_train, Y_train) https://stackoverflow.com/questions/57397957
复制相似问题