如何在朴素贝叶斯分类中获取特征重要性与样本高概率关键词?
嘿,这个需求很常见——想拆解朴素贝叶斯的分类决策,找到每个测试样本里对结果影响最大的词对吧?我来一步步帮你实现,先顺便提下你代码里的小笔误:optimal_aplha拼写错了(应该是optimal_alpha),还有X_tr应该是X_1哦,先修正这些避免后续运行出错~
实现步骤
1. 构建索引到词汇的映射
CountVectorizer的vocabulary_是词到特征索引的字典,我们需要反转它,方便后续通过特征索引找到对应的词:
# 反转词汇表:从特征索引映射到对应的词 idx_to_word = {v: k for k, v in count_vect.vocabulary_.items()}
2. 理解BernoulliNB的概率属性
BernoulliNB训练完成后,有个核心属性feature_log_prob_:它是一个二维数组,形状为(类别数, 特征数)。比如你的正负类别是0和1的话,feature_log_prob_[0]代表负类下每个特征的对数概率,feature_log_prob_[1]代表正类下的对数概率。
注:用对数概率是为了避免数值下溢,数值越大,代表该特征在对应类别中出现的概率越高。
3. 遍历每个测试样本,提取关键影响词
对于每个测试样本,我们需要聚焦样本中实际出现过的词(没出现的词对当前样本的分类没有贡献),然后找到这些词里在预测类别下概率最高的那个,就是决定分类结果的关键词。具体代码如下:
import numpy as np # 遍历所有测试样本 for sample_idx in range(len(X_test)): # 获取当前样本的预测类别 predicted_class = pred[sample_idx] # 获取当前样本中存在的特征索引(即样本里出现过的词的索引) # X_test是稀疏矩阵,nonzero()[1]返回非零元素的列索引(对应特征索引) present_feature_indices = X_test[sample_idx].nonzero()[1] if len(present_feature_indices) == 0: print(f"样本{sample_idx}: 无有效词汇,无法定位关键影响词") continue # 提取预测类别下,当前样本所有存在特征的对数概率 class_feature_probs = NB_optimal.feature_log_prob_[predicted_class][present_feature_indices] # 找到概率最高的特征在present_feature_indices中的位置 max_prob_pos = np.argmax(class_feature_probs) # 映射回对应的词 key_word = idx_to_word[present_feature_indices[max_prob_pos]] # 输出结果(根据你的类别标签调整正负判断逻辑) class_label = "正" if predicted_class == 1 else "负" print(f"样本{sample_idx}被分类为{class_label}类,最具影响力的词是: {key_word}")
可选:提取Top N个关键影响词
如果想查看对分类贡献最大的前N个词,只需要把np.argmax改成排序取前N个即可:
top_n = 3 # 自定义要取的数量 # 对概率降序排序,取前top_n的索引 sorted_prob_positions = np.argsort(class_feature_probs)[::-1][:top_n] # 映射成对应的词 top_key_words = [idx_to_word[present_feature_indices[pos]] for pos in sorted_prob_positions] print(f"样本{sample_idx}被分类为{class_label}类,Top{top_n}关键影响词: {', '.join(top_key_words)}")
内容的提问来源于stack exchange,提问作者merkle
相关产品推荐
相关产品推荐

