我正在建立一个分类器,以检测唐纳德·特朗普何时从@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

08-25 04:46