Scikit-Learn - 没有真阳性 - 标准化数据的最佳方法

Posted

技术标签:

【中文标题】Scikit-Learn - 没有真阳性 - 标准化数据的最佳方法【英文标题】:Scikit-Learn - No True Positives - Best Way to Normalize Data 【发布时间】:2017-12-05 21:41:33 【问题描述】:

感谢您花时间阅读我的问题!

所以我正在进行一项实验,看看我是否可以根据他们在推文中使用的词(或标记)来预测个人是否被诊断出患有抑郁症(或者至少说他们已经被诊断出患有抑郁症)。我发现有 139 位用户在某些时候发推文说“我被诊断出患有抑郁症”或在认真的语境中使用该短语的某些变体(例如,不是开玩笑或讽刺。使用了以推文语言为母语的人来辨别所发布的推文是否真实)。

然后我收集了所有这些用户推文的整个公共时间线,给了我一个大约 17000 条推文的“抑郁用户推文语料库”。

接下来,我创建了一个包含大约 4000 个随机“控制”用户的数据库,并根据他们的时间线创建了一个包含大约 800,000 条推文的“控制推文语料库”。

然后我将它们组合成一个大数据框,如下所示:

,class,tweet
0,depressed,tweet text .. *
1,depressed,tweet text.
2,depressed,@ tweet text
3,depressed,저 tweet text
4,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 text
11,depressed,tweet text *
12,depressed,#tweet text
13,depressed,
14,depressed,tweet text !
15,depressed,tweet text
16,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?"t
150600,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'].values
classifier.fit(counts, targets)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior= True)

不幸的是,在运行了 6 次交叉验证测试后,结果很糟糕,我正试图找出原因。

Total tweets classified: 613952
Score: 0.0
Confusion matrix:
[[596070    743]
 [ 17139      0]]

所以,我没有正确预测一个抑郁者的推文!我最初的想法是我没有正确标准化对照组的计数,因此即使是在抑郁用户语料库中出现得更频繁的标记,由于其更大的尺寸,在控制推文语料库中也出现了过度表示。我的印象是 .fit() 已经这样做了,所以也许我在这里走错了路?如果没有,对在两组不同大小的数据之间进行标准化的最有效方法有何建议?

【问题讨论】:

你试过其他分类器吗? @ser 我也将尝试使用伯努利分类器。在这种情况下你会推荐其他的吗? 由于您有字符串/单词作为输入数据,您还可以查看 Kmeans 以对单词进行分类。 1) 使用 Python 进行文档聚类link 2) 使用 Python 中的 scikit-learn kmeans 对文本文档进行聚类link 3) 将一长串字符串(单词)聚类到相似组中link 这可能是我探索性数据分析的一部分,我会研究一下。谢谢! 当然。试一试。 【参考方案1】:

您应该使用重采样技术来处理不平衡的类。在 Python 中有很多“手动”的方法,但我推荐 unbalanced learn,它编译了数据集中常用的重采样技术,显示出严重的类间不平衡。

如果你使用 Anaconda,你可以使用:

conda install -c glemaitre imbalanced-learn.

或者简单地说:

pip install -U imbalanced-learn

此库可与 sci-kit learn 兼容。你的数据集看起来很有趣,它是公开的吗?希望这会有所帮助。

【讨论】:

我将看看不平衡学习,并使用精确召回曲线来查看不同的决策阈值是否可能会有所帮助。我所有的数据都是从公共推特账户的公共推文中汇编而成的。感谢您的回复!

以上是关于Scikit-Learn - 没有真阳性 - 标准化数据的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法用已知的真阳性、真阴性、假阳性和假阴性来绘制混淆矩阵?

生信代码:机器学习-模型评价

机器学习之roc曲线

人脸识别中的假阳性

02_精确度,召回率,真阳性,假阳性

Adaboost weka 真阳性与假阳性识别问题