Scikit-Learn - 没有真阳性 - 规范化数据的最佳方式
Scikit-Learn - No True Positives - Best Way to Normalize Data
感谢您花时间阅读我的问题!
所以我是 运行 一个实验,看看我是否可以根据他们在他们的语言中使用的词语(或标记)来预测一个人是否被诊断出患有抑郁症(或者至少说他们已经被诊断出患有抑郁症)推文。我发现有 139 位用户在某个时候发布了推文 "I have been diagnosed with depression" 或这个短语的一些变体(例如,不是开玩笑或讽刺。以推文语言为母语的人被用来辨别是否所发布的推文是否真实)。
然后我收集了所有这些用户的推文的整个 public 推文时间线,给我 "depressed user tweet corpus" 大约 17000 条推文。
接下来我创建了一个包含大约 4000 个随机 "control" 用户的数据库,并根据他们的时间线创建了一个 "control tweet corpus" 大约 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() class 中的对象训练了一个多项式朴素贝叶斯 classifier:
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() 已经这样做了,所以也许我在这里走错了路?如果没有,关于标准化两组不同大小的数据的最有效方法有什么建议吗?
您应该使用重新采样技术来处理不平衡的 classes。在 Python 中有很多方法可以做到这一点 "by hand",但我推荐 unbalanced learn,它编译了数据集中常用的重采样技术,显示出强烈的 between-class 不平衡。
如果你使用的是Anaconda,你可以使用:
conda install -c glemaitre imbalanced-learn.
或者简单地说:
pip install -U imbalanced-learn
这个库与 sci-kit learn 兼容。您的数据集看起来很有趣,是 public 吗?希望这有帮助。
感谢您花时间阅读我的问题!
所以我是 运行 一个实验,看看我是否可以根据他们在他们的语言中使用的词语(或标记)来预测一个人是否被诊断出患有抑郁症(或者至少说他们已经被诊断出患有抑郁症)推文。我发现有 139 位用户在某个时候发布了推文 "I have been diagnosed with depression" 或这个短语的一些变体(例如,不是开玩笑或讽刺。以推文语言为母语的人被用来辨别是否所发布的推文是否真实)。
然后我收集了所有这些用户的推文的整个 public 推文时间线,给我 "depressed user tweet corpus" 大约 17000 条推文。
接下来我创建了一个包含大约 4000 个随机 "control" 用户的数据库,并根据他们的时间线创建了一个 "control tweet corpus" 大约 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() class 中的对象训练了一个多项式朴素贝叶斯 classifier:
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() 已经这样做了,所以也许我在这里走错了路?如果没有,关于标准化两组不同大小的数据的最有效方法有什么建议吗?
您应该使用重新采样技术来处理不平衡的 classes。在 Python 中有很多方法可以做到这一点 "by hand",但我推荐 unbalanced learn,它编译了数据集中常用的重采样技术,显示出强烈的 between-class 不平衡。
如果你使用的是Anaconda,你可以使用:
conda install -c glemaitre imbalanced-learn.
或者简单地说:
pip install -U imbalanced-learn
这个库与 sci-kit learn 兼容。您的数据集看起来很有趣,是 public 吗?希望这有帮助。