如何保持一个高度相关的变量在scikit-learn中淹没其余部分?

问题描述 投票:2回答:1

我正在建立一个分类器来检测唐纳德特朗普何时从@realDonaldTrump而不是员工发推文。它使用2016年的推文来训练模型,使用推文设备推断作者身份 - 如果消息是从Android手机发送的,那就是特朗普;否则,它是一名职员。

现在,我正在使用Python sklearn BernoulliNB分类器,它使用两组功能。第一个是总统推文文本的词袋矢量。第二个是一个简单的二进制变量 - 推文是否有链接?

我正在使用pandas来处理数据和sklearn_pandas,以便更容易地组合这些功能。这是数据帧的片段:

                                                  text  year   type   link
0    RT @realDonaldTrump: Happy Birthday @DonaldJTr...  2016  staff   true
1    Happy Birthday @DonaldJTrumpJr!\nhttps://t.co/...  2016  staff   true
2    Happy New Year to all, including to my many en...  2016  trump  false
3    Russians are playing @CNN and @NBCNews for suc...  2016  trump  false
4    Join @AmerIcan32, founded by Hall of Fame lege...  2016  staff   true

这是我的代码的简化示例:

# Grab tweets, which have 'text', 'link' and 'type' columns
train_tweets = pd.read_json("data/condensed_2016.json")

vectorizer = DataFrameMapper([
('link', MultiLabelBinarizer()),
('text', CountVectorizer(
    analyzer = 'word', 
    tokenizer = None, 
    preprocessor = None, 
    stop_words = 'english', 
    max_features = 500) )
])

# Build vector of features from training set
train_data_features = vectorizer.fit_transform(train_tweets)

classify = BernoulliNB()
classify = classify.fit( train_data_features, train_tweets['type'] )

唯一的问题是link专栏与职员作者的关系非常密切 - 特朗普几乎从不在他的推文中包含任何类型的链接。因此,每当我对包含链接的推文进行分类并使用classify.predict_proba()检查概率时,我就会获得疯狂的特异性 - 比如职员编写推文的几率为99.999%。

这基本上使得词袋分析没有实际意义。我想这不是一件坏事,但它会使算法变得更脆弱。我能做些明显的事情来解决这个问题吗?

python machine-learning scikit-learn nltk sklearn-pandas
1个回答
1
投票

您可以尝试随机欠量或超量采样,这将平衡数据的分布。但是,过采样会产生内存错误。尝试过取样后,根据您的数据可能会产生不良结果,所以我只想尝试两种方法。

RandomOverSampler:http://contrib.scikit-learn.org/imbalanced-learn/stable/generated/imblearn.over_sampling.RandomOverSampler.html#imblearn.over_sampling.RandomOverSampler

RandomUnderSampler:http://contrib.scikit-learn.org/imbalanced-learn/stable/generated/imblearn.under_sampling.RandomUnderSampler.html#imblearn.under_sampling.RandomUnderSampler

或者你可以使用under和over sampling的组合:http://contrib.scikit-learn.org/imbalanced-learn/stable/generated/imblearn.combine.SMOTETomek.html#imblearn.combine.SMOTETomek

© www.soinside.com 2019 - 2024. All rights reserved.