我正在进行一个项目,利用用户的推文来预测其个性。
在训练过程中,我有一个包含350000条推文的大型语料库,这些推文来自已经进行过个性测试的用户,每条推文都与特定的个性类型相关联。共有16种不同的个性类型(1-16)。
我对这些推文进行了预处理,删除了停用词,进行了词干提取和词性标注。
我有一个包含500个最常用词的大型词典,这些词将作为我的训练特征。随后,我使用预定义的500个词的词典对每条推文进行了tfidf向量化处理,以创建每条推文的词向量。
vectorizer=TfidfVectorizer(vocabulary=mydict,min_df=1)x=vectorizer.fit_transform(corpus).toarray()
其中corpus是一系列所有推文的列表。然后我将这个x
和y
(每条推文的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
不平衡数据,指的是类别分布不均匀的问题。处理这种现象有很多技术。
-
收集更多数据
如果可能,尝试为示例较少的类别收集更多数据。
-
使用其他性能指标
当你的数据集不平衡时,准确率并不是一个可用的指标。想象一下,你有两个类别(
0
和1
),其中99个示例属于类别0
,只有1个示例属于类别1
。如果你构建一个模型,总是将每个测试点分配给类别0
,你最终会得到99%的准确率,但显然这不是你想要的。除了准确率之外,一些有用的指标包括以下内容:- 精确度/召回率/F分数(从混淆矩阵中提取)
- ROC曲线
-
欠采样
尝试从最常见的类别中丢弃一些示例,以便所有类别拥有大致相同数量的示例。丢弃数据可能不是一个好主意,所以尽量避免欠采样。