我正在开发一个项目,用他的推文来预测用户的个性。
对于培训,我有一个350000个用户推文的大型语料库已经进行了个性测试,每个推文都与特定的个性类型相关联。有16种不同的人格类型(1-16)
我已对此推文进行了预处理,以删除停用词,词干和POS标记。
我有一个包含500个最常用单词的大型词典,我将用它作为我的训练功能。在此之后,我使用500字的预定义字典在每条推文上执行了tfidf矢量化,为每条推文创建一个字向量。
vectorizer=TfidfVectorizer(vocabulary=mydict,min_df=1)
x=vectorizer.fit_transform(corpus).toarray()
语料库是所有推文的列表。然后我使用以下方法将这个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 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%。
如果我运行Naive Bayes,Logistic回归或线性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个例子属于class 0
,只有1个例子属于class 1
。如果你建立一个总是将class 0
分配给每个测试点的模型,你最终会得到99%的准确率,但显然这不是你想要的。除准确性之外的一些有用指标如下:
精确/召回/ F分数(从混淆矩阵中提取)
ROC曲线