【问题标题】:Why is this accuracy of this Random forest sentiment classification so low?为什么这个随机森林情感分类的准确率这么低?
【发布时间】:2022-01-15 02:31:17
【问题描述】:

我想使用 RandomForestClassifier 进行情绪分类。 x 包含字符串文本中的数据,所以我使用 LabelEncoder 来转换字符串。 Y 包含数字数据。我的代码是这样的:

import pandas as pd
import numpy as np
from sklearn.model_selection import *
from sklearn.ensemble import *
from sklearn import *
from sklearn.preprocessing.label import LabelEncoder

data = pd.read_csv('data.csv')

x = data['Reviews']
y = data['Ratings']

le = LabelEncoder()
x_encoded = le.fit_transform(x)

x_train, x_test, y_train, y_test = train_test_split(x_encoded,y, test_size = 0.2)

x_train = x_train.reshape(-1,1)
x_test = x_test.reshape(-1,1)

clf = RandomForestClassifier(n_estimators=100)

clf.fit(x_train, y_train)

y_pred = clf.predict(x_test)

然后我打印出如下精度:

print("Accuracy:", metrics.accuracy_score(y_test, y_pred))

这是输出:

Accuracy: 0.5975

我读到随机森林具有很高的准确性,因为参与该过程的决策树的数量。但我认为准确度远低于应有的水平。我在 Stack Overflow 上寻找了一些类似的问题,但我找不到我的问题的解决方案。

我的代码使用随机森林库有什么问题吗?或者在使用随机森林时是否有任何例外情况?

【问题讨论】:

  • 你应该专注于预处理reviews
  • sklearn doc for LabelEncoder 提到:“这个转换器应该用于编码目标值,即 y,而不是输入 X”。如果您想为文本数据训练体面的模型,您应该熟悉文本表示方法。顺便说一句,如果您在编码后查看功能,您就会明白问题所在。

标签: python scikit-learn random-forest text-classification


【解决方案1】:

这不是随机森林或库的问题,而是如何将文本输入转换为特征或特征向量的问题。

LabelEncoding 所做的是;给定一些标签,如 ["a", "b", "c"],它将这些标签转换为 0 到 n-1 之间的数值,其中 n-是不同输入标签的数量。但是,我假设评论包含文本而不是纯粹的标签。这意味着,您的所有评论(如果不是 100% 相同)都将转换为不同的标签。最终,这会导致您的分类器执行随机操作。给出那个输入。这意味着您需要一些不同的东西来将您的文本输入转换为随机森林可以处理的数字输入。

作为一个简单的开始,您可以尝试 TfIDF 或一些简单的计数矢量化器。这些可从 sklearn https://scikit-learn.org/stable/modules/feature_extraction.html 第 6.2.3 节获得。文本特征提取。有更复杂的方法可以将文本转换为数字向量,但这应该是您理解概念上必须发生的事情的良好开端。

最后一个重要注意事项是,您仅将这些矢量化器拟合在训练集上,而不是在完整数据集上。否则,您可能会将信息从培训泄漏到评估/测试。这样做的一个好方法是构建一个由特征转换步骤和分类器组成的 sklearn 管道。

【讨论】:

  • 最后一点,从训练到评估的泄漏信息是什么意思?你的意思是如果在train_test_split之前对x的整个数据集进行预处理?
  • 是的。因此,您可以在训练集中包含您在现实中没有的信息。
  • 但是,如果我只在训练集上拟合计数向量器,我应该如何测试训练好的模型?我想我应该通过矢量化测试数据集来预测 y 标签。是否需要分别处理训练集和测试集?
  • 你在训练集上拟合了 Vectorizer,你在测试集上使用它。这与分类器相同。这就是为什么我的意思是你应该看看构建一个管道,它暴露了 fit 和 predict api,在那里它可能更明显。看这个例子stackoverflow.com/questions/33091376/…
  • 谢谢!我通过矢量化和 tfid 转换解决了这个问题。准确性也提高了!
猜你喜欢
  • 2019-08-21
  • 2020-08-25
  • 2019-04-15
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2015-09-16
  • 2020-11-10
相关资源
最近更新 更多