我正在做一个用推特预测用户个性的项目。
为了进行培训,我有350000条已经参加过人格测试的用户的大量微博,每条推文都链接到了一个特定的人格类型。有16种不同的人格类型(1-16)
我已经对这条推文进行了预处理,以删除停止词、词干和词性标注。
我有一本包含500个最常用单词的大字典,我将用它作为我训练的特色。在此之后,我使用预定义的500个单词的字典对每个tweet执行tfidf矢量化,为每个tweet创建一个单词向量。
vectorizer=TfidfVectorizer(vocabulary=mydict,min_df=1)
x=vectorizer.fit_transform(corpus).toarray()语料库是所有推特的列表。然后,我使用以下方法组合这个x和y(每个tweet有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%。
如果我运行朴素贝叶斯,Logistic回归或线性支持向量机,我得到的准确率低于20%。
有什么有效的方法来运行这种多类文本分类吗?还是我做错了什么?准确度太低了,我想改进一下。
发布于 2017-03-11 12:58:14
问题可能是您正在使用的不平衡数据集。
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,一个属于class 1。如果您构建的模型总是将class 0分配给每个测试点,您最终将获得99%的准确性,但这显然不是您想要的。除准确性外,其他一些有用的指标如下:- Precision/Recall/F-score (Extracted from a Confusion Matrix)
- ROC curves
https://stackoverflow.com/questions/42735189
复制相似问题