通过Twitter预测用户个性的文本分类准确率低

我正在进行一个项目,利用用户的推文来预测其个性。

在训练过程中,我有一个包含350000条推文的大型语料库,这些推文来自已经进行过个性测试的用户,每条推文都与特定的个性类型相关联。共有16种不同的个性类型(1-16)。

我对这些推文进行了预处理,删除了停用词,进行了词干提取和词性标注。

我有一个包含500个最常用词的大型词典,这些词将作为我的训练特征。随后,我使用预定义的500个词的词典对每条推文进行了tfidf向量化处理,以创建每条推文的词向量。

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

其中corpus是一系列所有推文的列表。然后我将这个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是csv文件中Y所在的列名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个示例属于类别0,只有1个示例属于类别1。如果你构建一个模型,总是将每个测试点分配给类别0,你最终会得到99%的准确率,但显然这不是你想要的。除了准确率之外,一些有用的指标包括以下内容:

    • 精确度/召回率/F分数(从混淆矩阵中提取)
    • ROC曲线
  3. 欠采样

    尝试从最常见的类别中丢弃一些示例,以便所有类别拥有大致相同数量的示例。丢弃数据可能不是一个好主意,所以尽量避免欠采样。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注