如何改进分类问题(SVM、Logistic Regression 和 MultiNaive Bayes)的结果?

数据挖掘 机器学习 预测建模 逻辑回归 支持向量机 朴素贝叶斯分类器
2022-03-03 10:18:45

我是机器学习和构建模型的新手,但是很多教程让我有机会了解更多关于这个主题的信息。我正在尝试建立一个预测模型来检测假新闻。标签为 1 e 0 的数据百分比如下:

       T
0    2015
1     798

如您所见,不幸的是,它的平衡并不好。我将数据集拆分如下:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, stratify=y)

即 70% 的训练和 30% 的测试。我希望这是有道理的,尽管我的课程不平衡。然后,在通过删除停用词和标点符号(我应该做其他事情吗?)来清理文本之后,我运行了不同的模型,特别是 MultiNaive Bayes、SVM 和 Logistic Regression,得到以下结果:

MNB : 84%

  precision    recall  f1-score   support

           0       0.88      0.90      0.89       476
           1       0.45      0.40      0.42        95

    accuracy                           0.82       571
   macro avg       0.66      0.65      0.66       571
weighted avg       0.81      0.82      0.81       571

支持向量机:准确度: 0.8336252189141856

精度:0.5 召回率:0.2736842105263158(可怕的结果!)

逻辑回归: 0.8546409807355516

所有教程都表明,当你有一些文本时,构建一个好的模型的步骤是删除停用词、标点符号和多余的词。我已经完成了所有这些事情,但可能会有一些我可以做更多的事情来改善结果。我读到,一般来说,谁得到高于 99% 的结果会遇到过拟合等问题:然而,我真的很想得到 92%(至少)。你怎么看?我怎样才能进一步改进模型?你认为不平衡的班级会影响结果吗?

任何建议将不胜感激。

4个回答

如果您有大量数据 - 对您的负面类别进行下采样,以在您的假新闻/真实新闻分类上实现 50/50 的分割。如果您没有太多数据 - 您可以使用 SMOTE 等技术对较小的类进行上采样。

您似乎比随机选择假/真具有更好的准确性,这是一个好兆头。基于数据拆分的负类概率为 71.6% - 使用 LogReg 可以达到 85.4% 的准确率。不要对此太失望(尤其是如果您是 ML 新手)。

如果这是一个 NLP 问题,我建议检查 Gradient Boosting 或 Bagging 算法——当我在分类中遇到稀疏文本数据时,这些通常会为我带来最好的结果。

至于标点符号和停用词,这是常见的第一步 - 但是对于任何问题,这都不是一个好的一般建议。您是否认为感叹号的存在可能会清除数据中的一些假新闻?如果是这样,我会包括标点符号。如果没有 - 您可能已经走在正确的轨道上。仅当您的特定问题的上下文需要时,删除停用词和双引号才有意义。

更一般地说 - 考虑到您的问题的难度,您可能无法达到 92% 的准确率。这并不是说不可能,但请记住,您可能在线遵循的教程是预先确定的,以表明您可以获得良好的结果。有些项目只是比其他项目更难(有些甚至在上下文中是不可能的)。

祝你好运!

一些想法:

  • 正如@weareglenn 所提到的,通常没有办法知道在某些数据上获得的性能是好是坏,除非我们知道已应用于相同任务和数据集的其他系统的性能。所以是的,你的结果是“可以接受的”(至少它完成了击败随机基线的最低工作)。但是,鉴于您的方法非常基本(没有冒犯!),因此性能有可能得到改善。但这只是一个有根据的猜测,没有办法知道它可以改进多少。
  • 对我来说,不平衡的程度并没有那么糟糕。鉴于少数类(假新闻)的低召回率,如果您想增加召回率,您可以尝试对其进行过采样,但请注意这可能会降低精度(即增加 False Positive 错误 = 0 类预测为 1)。在我看来,您不必这样做,除非您的任务必须尽量减少 False Negative 错误。
  • 您可以尝试使用这些功能做很多事情,我非常有信心在这个级别上还有改进的空间:
    • 首先,正如@weareglenn 所述,您应该尝试不删除标点符号,甚至不删除停用词。
    • 然后你可以玩频率:经常排除全局训练词汇中频率较低的单词可以让模型更好地概括(即避免过度拟合)。尝试使用不同的最小频率阈值:2,3,4,...(取决于您的数据有多大)。
    • 更高级:使用特征选择,最好使用遗传学习等方法,但可能需要时间,因为它会多次重做训练+测试过程。单独的特征选择(例如信息增益或条件熵)可能会起作用,但它很少非常好。
    • 如果你想更高级,你甚至可以借用自动文体测量的方法,即用于识别文档/作者风格的方法(PAN 共享任务是数据/系统的良好来源)。有些使用相当复杂的方法和特征,这些方法和特征可能与识别假新闻有关。我喜欢尝试的一个简单的事情是使用字符 n-gram 作为特征,它有时非常有效。您还可以想象使用更高级的语言功能:引理、词性 (POS) 标签。
  • 你没有在你的方法中提到决策树,我肯定会试一试(集成方法版本的随机森林)。

在不平衡数据集中,我们不会将准确性视为一个整体
检查精确率/召回率或单个类的准确性。

有了这个,我相信你 85% 的准确率并没有多大用处。
个人召回是 -
Class_0 - 0.90
Class_1
-0.40
这意味着,100 条假新闻中有 60 条被遗漏了

此外,95 和 471 的支持相当于总数据的 20%,并且也没有在 y 上分层当拆分为 30% 且分层时,不知道为什么会这样。

这意味着,模型可能因为 Class Imbalance 而无法学习虽然798:2015不是太不平衡。

请遵循处理不平衡数据集的策略,例如欠采样、过采样、使用适当的指标等。 [检查互联网/SE]

是的,不平衡的课程会影响你的成绩。除了上面建议的数据增强技术外,您还可以考虑使用具有基于风险的性能评分的 Optuna,该评分说明了不良假阴性与假阳性的关系。

这是我硕士论文的动机,我很想看到它在某个地方实现。即使使用 ROC 曲线下面积 (AUC) 也没有风险那么有意义;有关说明图,请参阅此答案底部的最后一个链接。