感谢您抽时间阅读我的问题!
我正在进行一个实验,试图通过推文中的词语(或标记)来预测一个人是否被诊断患有抑郁症(或者至少他们自称被诊断)。我找到了139个用户,他们在某个时候曾认真地(即不是开玩笑或讽刺)在推文中写道“我被诊断患有抑郁症”或类似这句话。由推文语言的母语者来判断这些推文是否真实。
然后,我收集了这些用户的所有公开推文时间线,形成了一个包含大约17000条推文的“抑郁用户推文语料库”。
接下来,我创建了一个包含大约4000个随机“对照”用户的数据库,并通过他们的时间线创建了一个包含大约800,000条推文的“对照推文语料库”。
然后,我将它们合并成一个大的数据框,结构如下:
,class,tweet0,depressed,tweet text .. *1,depressed,tweet text.2,depressed,@ tweet text3,depressed,저 tweet text4,depressed,@ tweet text😚5,depressed,@ tweet text😍6,depressed,@ tweet text ?7,depressed,@ tweet text ?8,depressed,tweet text *9,depressed,@ tweet text ?10,depressed,@ tweet text11,depressed,tweet text *12,depressed,#tweet text13,depressed,14,depressed,tweet text !15,depressed,tweet text16,depressed,tweet text. .17,depressed,tweet text...50595,control,@tweet text?150596,control,"@ tweet text."150597,control,@ tweet text.150598,control,"@ tweet text. *"150599,control,"@tweet text?"t150600,control,"@ tweet text?"150601,control,@ tweet text?150602,control,@ tweet text.150603,control,@tweet text~150604,control,@ tweet text.
然后,我使用从sklearn库导入的CountVectorizer()类对象训练了一个多项式朴素贝叶斯分类器:
count_vectorizer = CountVectorizer()counts = count_vectorizer.fit_transform(tweet_corpus['tweet'].values)classifier = MultinomialNB()targets = tweet_corpus['class'].valuesclassifier.fit(counts, targets)MultinomialNB(alpha=1.0, class_prior=None, fit_prior= True)
不幸的是,在进行了6折交叉验证测试后,结果很糟糕,我正在试图找出原因。
Total tweets classified: 613952Score: 0.0Confusion matrix:[[596070 743] [ 17139 0]]
所以,我没有正确预测到任何一条抑郁用户的推文!我的初步想法是我没有正确地标准化对照组的计数,因此即使在抑郁用户语料库中更频繁出现的标记,由于对照推文语料库的规模更大,也在其中被过度表示。我原以为.fit()已经完成了这个操作,所以我可能走错了方向?如果不是这样,有没有关于如何在两个规模差异较大的组之间最有效地标准化数据的建议?
回答:
您应该使用重新采样的技术来处理不平衡的类别。有很多方法可以在Python中手动完成,但我推荐imbalanced-learn,它编译了常用于显示类间严重不平衡的数据集的重新采样技术。
如果您使用的是Anaconda,您可以使用:
conda install -c glemaitre imbalanced-learn.
或者简单地使用:
pip install -U imbalanced-learn
这个库与sci-kit learn兼容。您的数据集看起来非常有趣,它是公开的吗?希望这对您有帮助。