python - 尝试通过 Twitter 预测用户的个性时,文本分类的准确性较低

标签 python machine-learning svm random-forest text-classification

我正在开展一个项目,通过推文预测用户的性格。

为了进行训练,我有一个大型语料库,其中包含 350000 条已经接受过性格测试的用户的推文,每条推文都与特定的性格类型相关联。 有16种不同的性格类型(1-16)

我已经对这条推文进行了预处理,以删除停用词、词干提取和 POS 标记。

我有一个包含 500 个最常用词的大词典,我将使用这些词作为我的训练特征。 在此之后,我使用包含 500 个单词的预定义字典对每条推文执行了 tfidf 向量化,为每条推文创建了一个词向量。

vectorizer=TfidfVectorizer(vocabulary=mydict,min_df=1)
x=vectorizer.fit_transform(corpus).toarray()

其中语料库是所有推文的列表。 然后,我将此 xy(每条推文 1-16 个类)组合在一起,使用:

result=np.append(x,y,axis=1)
X=pandas.DataFrame(result)
X.to_csv('vectorized500.csv')

我将这个 (350000*500) 数据框用作 X 并将我的 1-16 编号人格类型用作我的 Y 数据框 (350000*1),它分为训练和测试同样使用:

X=pd.read_csv('vectorized500.csv')
train = X.sample(frac=0.8, random_state=200)
test=X.drop(train.index)
y_train=train["501"] #501 is the column name where Y is in the csv file
y_test=test["501"]
xtrain=train.drop("501",axis=1)
xtest=test.drop("501",axis=1)

但是,无论我运行什么算法,我得到的结果都很差:

model=RandomForestClassifier()
model.fit(xtrain,y_train)
pickle.dump(model, open('rf1000.sav', 'wb'))
print(model.score(xtest,y_test))

如果我运行 RandomForestClassifier,我得到 52% 的准确率。

如果我运行朴素贝叶斯、逻辑回归或线性 SVM,我得到的准确率低于 20%。

是否有任何有效的方法来运行这种多类文本分类,或者我做错了什么? 准确率太低,我想改进一下。

最佳答案

问题可能是您使用的数据集不平衡。

0. 56887 INFP 1. 54607 INFJ 2. 52511 INTJ 3. 52028 ENFP 4. 24294 INTP 5. 19032 ENTJ 6. 14284 ENFJ 7. 12502 ISFJ 8. 12268 ISTP 9. 10713 ISTJ 10. 10523 ESFP 11. 8103 ESTP 12. 7436 ESFJ 13. 7016 ESTJ 14. 6725 ISFP

不平衡的数据,指的是类别不均等表示的问题。有许多技术可用于处理这种现象。

  1. 收集更多数据

    如果可能,请尝试为具有少量示例的类收集更多数据。

  2. 使用其他性能指标

    准确性不是可以在数据集不平衡时使用的指标。假设您有两个类(01),其中 99 个示例属于 class 0,只有 1 个示例属于 class 1。如果您构建的模型始终将 class 0 分配给每个测试点,您最终的准确度将达到 99%,但显然这不是您想要的。以下是除准确性之外的一些有用指标:

    • Precision/Recall/F-score(从混淆矩阵中提取)
    • ROC 曲线
  3. 欠采样

    尝试从您最流行的类中丢弃示例,以便所有类都具有大致相同数量的示例。丢弃数据可能不是一个好主意,因此请尽量避免欠采样。

关于python - 尝试通过 Twitter 预测用户的个性时,文本分类的准确性较低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42735189/

相关文章:

machine-learning - 支持向量机中的 "support"是什么意思?

python - 跨文件 Python 更改变量

python - 将嵌套的 for 循环转换为列表 comp 并从结果列表中过滤完全平方数

algorithm - 如何对大量用户输入的公司名称进行分类?

machine-learning - 有没有术语识别的算法或解决方案?

matlab - 弃用后哪个函数代替了R2016a的svmtrain?

python - 如何在 if 语句中使用两个条件

python - 无法使用 rPython 导入包

python - 未知的初始化程序 : GlorotUniform when loading Keras model

ruby - 如何让 ruby​​-svm 在 macports'/opt/local 中查找库?