如何找出Python中MultinomialNB分类器用于文本分类决策的词汇?
解决朴素贝叶斯文本分类中提取关键特征词汇的问题
问题核心
你使用MultinomialNB做二分类文本分类时,无法通过旧方法提取分类依赖的关键词汇,原因是:
- 新版本scikit-learn中,
CountVectorizer的get_feature_names()已被get_feature_names_out()替代 MultinomialNB在二分类场景下没有coef_属性,但可以通过feature_log_prob_获取特征的类别概率
解决方案步骤
1. 获取特征名称
用vec.get_feature_names_out()替代旧的get_feature_names(),得到所有词袋特征的名称列表。
2. 提取类别特征概率
MultinomialNB.feature_log_prob_是一个二维数组,形状为[类别数, 特征数],对应每个类别下各个特征的对数概率。对于你的二分类任务:
feature_log_prob_[0]:类别0(非恐怖袭击)的特征对数概率feature_log_prob_[1]:类别1(恐怖袭击)的特征对数概率
3. 计算关键特征权重并排序
通过类别1的对数概率减去类别0的对数概率得到特征对恐怖袭击类的权重,权重越高说明该词汇越倾向于被分类为恐怖袭击相关;反之则倾向于非相关。
完整代码示例
# 导入必要库 from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB import pandas as pd # 原有代码:创建词袋 vec = CountVectorizer( ngram_range=(1, 3) ) x_train = vec.fit_transform(df_train.clean_text) x_test = vec.transform(df_test.clean_text) y_train = df_train.terror y_test = df_test.terror # 训练模型 nb = MultinomialNB() nb.fit(x_train, y_train) # 提取关键特征词汇 # 1. 获取所有特征名称 feature_names = vec.get_feature_names_out() # 2. 获取两个类别的特征对数概率 log_prob_class0 = nb.feature_log_prob_[0] log_prob_class1 = nb.feature_log_prob_[1] # 3. 计算特征对类别1的权重(类别1概率 - 类别0概率) feature_weights = log_prob_class1 - log_prob_class0 # 4. 按权重排序,得到关键特征 # 倾向于恐怖袭击的词汇(权重从高到低) top_terror_features = pd.DataFrame({ 'feature': feature_names, 'weight': feature_weights }).sort_values(by='weight', ascending=False).head(20) # 倾向于非恐怖袭击的词汇(权重从低到高) top_non_terror_features = pd.DataFrame({ 'feature': feature_names, 'weight': feature_weights }).sort_values(by='weight', ascending=True).head(20) # 打印结果 print("最能代表恐怖袭击类的词汇:") print(top_terror_features) print("\n最能代表非恐怖袭击类的词汇:") print(top_non_terror_features)
说明
feature_log_prob_是模型训练后计算的每个特征在对应类别下的概率对数,差异值直接反映了特征对类别的区分度- 你可以调整
head(20)中的数字来获取更多或更少的关键特征 - 如果想直接看类别1下概率最高的特征,也可以直接对
log_prob_class1排序,无需计算差值
内容的提问来源于stack exchange,提问作者user3992979
相关产品推荐
相关产品推荐

