如何绘制逻辑回归生成的高方差特征重要性?请求检查代码
逻辑回归特征重要性计算与绘图优化方案
一、你代码里的核心问题
当前计算和绘图的代码存在两个关键问题:
- 用
pow(math.e, np.array(w))对逻辑回归系数取指数,这会极端放大系数差异——指数函数的特性就是让大数值变得更大,小数值相对被压得更小,这直接导致了你看到的最高值132、次高仅17的悬殊差距。 - 排序代码
feature_importance.sort_values(...).reset_index()没有赋值回变量,所以你的feature_importance其实还是未排序的状态,绘图时取前7个可能根本不是真正的Top7特征。
另外补充:逻辑回归的特征重要性一般不用指数转换后的优势比衡量,更合理的是用系数的绝对值——系数正负代表影响方向,绝对值代表影响程度,不会放大数值差异。
二、修正特征重要性计算代码
方案1:用系数绝对值计算(推荐)
import pandas as pd import numpy as np # 注意:sklearn的LogisticRegression.coef_是二维数组,需要用flatten转成一维 feature_importance = pd.DataFrame({ 'feature': xtest.columns, 'importance': np.abs(w.flatten()) # 取系数绝对值作为重要性 }) # 排序后必须赋值回变量,否则排序不生效 feature_importance = feature_importance.sort_values(by='importance', ascending=False).reset_index(drop=True)
方案2:如果一定要用优势比(需处理差异)
如果需要展示优势比,建议对其取对数来缩小数值差距:
import pandas as pd import numpy as np feature_importance = pd.DataFrame({ 'feature': xtest.columns, 'odds_ratio': np.exp(w.flatten()), # 计算优势比 'log_odds_ratio': np.log(np.exp(w.flatten())) # 对优势比取对数,缩小差异 }) feature_importance = feature_importance.sort_values(by='odds_ratio', ascending=False).reset_index(drop=True)
三、优化绘图代码
针对数值差异大的情况,给你两种实用的绘图优化方式:
方式1:用对数坐标轴(最直接解决差距问题)
把y轴改成对数刻度,小数值的特征也能清晰展示:
import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(25,10)) # 取Top7特征 top7_features = feature_importance.iloc[:7, :] sns.barplot(data=top7_features, x='feature', y='importance') plt.yscale('log') # 设置y轴为对数刻度 plt.title('Top7 特征重要性(对数刻度)') plt.xlabel('特征') plt.ylabel('重要性(系数绝对值)') plt.show()
方式2:添加数值标签(保留原始刻度,提升可读性)
如果不想用对数轴,可以给每个柱子加上具体数值,让小数值的特征也能看到具体大小:
import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(25,10)) ax = sns.barplot(data=top7_features, x='feature', y='importance') # 给每个柱子添加数值标签 for p in ax.patches: height = p.get_height() ax.text(p.get_x() + p.get_width()/2., height, f'{height:.2f}', ha='center', va='bottom') plt.title('Top7 特征重要性') plt.xlabel('特征') plt.ylabel('重要性(系数绝对值)') plt.show()
四、关键提醒
- 逻辑回归特征重要性优先用系数绝对值,避免指数转换放大差异
- 排序后一定要赋值回变量,否则排序操作等于白做
- 数值差异过大时,对数坐标轴或数值标签能有效提升图表可读性
内容的提问来源于stack exchange,提问作者Pranav167
相关产品推荐
相关产品推荐

