如何利用特征重要性定位「最差」特征并关联对应ID?
波士顿房价数据集特征分析相关问题
本人工作数据涉及保密,故以波士顿房价数据集为例:已通过特征重要性分析找到对因变量MEDV影响最大的自变量RM、LSTAT、DIS。现请教两个问题:
- 如何利用训练好的模型找到这三个特征对应的样本ID?
- 查看特征重要性图后,是否只需按RM、LSTAT、DIS降序排序DataFrame即可?结合业务场景,这三个特征属于「最差」特征。
提供的代码
from sklearn.datasets import load_boston import pandas as pd import numpy as np import matplotlib import matplotlib.pyplot as plt import seaborn as sns import statsmodels.api as sm from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.feature_selection import RFE from sklearn.linear_model import RidgeCV, LassoCV, Ridge, Lasso from sklearn.ensemble import RandomForestRegressor # 加载数据集 x = load_boston() df = pd.DataFrame(x.data, columns = x.feature_names) df["MEDV"] = x.target X = df.drop("MEDV",1) # 特征矩阵 y = df["MEDV"] # 目标变量 df.head() df['id'] = df.groupby(['MEDV']).ngroup() df = df.sort_values(by=['MEDV'], ascending=True) df.head(10) names = df.columns reg = RandomForestRegressor() reg.fit(X, y) print("特征按重要性得分排序:") print(sorted(zip(map(lambda x: round(x, 4), reg.feature_importances_), names), reverse=True)) features = names importances = reg.feature_importances_ indices = np.argsort(importances) plt.title('特征重要性') plt.barh(range(len(indices)), importances[indices], color='#8f63f4', align='center') plt.yticks(range(len(indices)), features[indices]) plt.xlabel('相对重要性') plt.show()
相关图表


问题解答
1. 定位三个特征对应的样本ID
样本ID是你通过df['id'] = df.groupby(['MEDV']).ngroup()生成的列,完全不需要依赖训练好的模型就能获取:
- 若要获取所有样本的ID及对应三个特征值,直接提取列即可:
id_with_features = df[['id', 'RM', 'LSTAT', 'DIS']] - 结合「最差」业务场景,若要筛选符合特征极端值的样本ID,可按业务逻辑过滤(比如RM偏小、LSTAT偏大、DIS偏小的样本):
# 示例:筛选RM低于均值、LSTAT高于均值、DIS低于均值的"最差"样本ID bad_samples_ids = df[(df['RM'] < df['RM'].mean()) & (df['LSTAT'] > df['LSTAT'].mean()) & (df['DIS'] < df['DIS'].mean())]['id'].tolist()
模型仅用于识别特征重要性,样本ID的定位本质是数据筛选,直接操作DataFrame更高效。
2. 关于样本排序的问题
不能直接按三个特征全部降序排序,因为它们对MEDV的影响方向完全不同:
- RM(平均房间数)与MEDV正相关:RM越大,房价越高;
- LSTAT(低收入人群占比)与MEDV负相关:LSTAT越大,房价越低;
- DIS(到就业中心距离)与MEDV正相关:DIS越大,房价越高;
结合「最差」业务场景,应该按RM升序、LSTAT降序、DIS升序排序,这样排在前列的就是符合业务定义的「最差」样本。示例代码:
# 按业务定义的"最差"特征排序 df_sorted = df.sort_values(by=['RM', 'LSTAT', 'DIS'], ascending=[True, False, True])
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

