我正在建立一个分类器,以检测唐纳德·特朗普何时从@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%。从本质上讲,这句话的分析无济于事。我猜这不是一件坏事,但它会使算法更加脆弱。有什么明显的事情我可以解决吗?
最佳答案
您可以尝试“随机不足”或“过度”采样,以平衡数据的分布。但是,过度采样会产生内存错误。尝试过采样可能会产生差的结果,具体取决于您的数据,因此我想尝试一下。
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
或者,您可以结合使用欠采样和过采样:http://contrib.scikit-learn.org/imbalanced-learn/stable/generated/imblearn.combine.SMOTETomek.html#imblearn.combine.SMOTETomek