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

Roh*_*hil 3 python machine-learning svm random-forest text-classification

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

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

我对此推文进行了预处理,以删除停用词、词干和词性标记。

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

vectorizer=TfidfVectorizer(vocabulary=mydict,min_df=1)
x=vectorizer.fit_transform(corpus).toarray()
Run Code Online (Sandbox Code Playgroud)

其中语料库是所有推文的列表。然后,我使用以下方法将其xy(每条推文 1-16 个类)结合起来:

result=np.append(x,y,axis=1)
X=pandas.DataFrame(result)
X.to_csv('vectorized500.csv')
Run Code Online (Sandbox Code Playgroud)

我使用这个(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)
Run Code Online (Sandbox Code Playgroud)

然而,无论我运行什么算法,我都会得到非常糟糕的结果:

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

如果我跑步RandomForestClassifier,我会得到 52% 的准确率。

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

有没有有效的方法来运行这种多类文本分类,或者我做错了什么?准确率太低,我想提高它。

Gio*_*ous 5

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

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
Run Code Online (Sandbox Code Playgroud)

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

  1. 收集更多数据

    如果可能的话,尝试通过少量示例为班级收集更多数据。

  2. 使用其他性能指标

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

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

    尝试丢弃最受欢迎的类中的示例,以便所有类都有大约相同数量的示例。丢弃数据可能不是一个好主意,因此请尽量避免采样不足。