✨ 欢迎关注 ✨
本节介绍:随机打乱获取特征重要性结合递归特征选择:双重优化提升模型表现。数据采用模拟数据,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式
。 购买前请咨询,避免不必要的问题。
✨ 流程介绍 ✨
通过使用机器学习中的随机森林回归模型来预测目标。首先,数据集被分割为训练集和测试集,然后对特征进行选择,提取出影响预测结果的最重要特征。在特征选择后,使用K折交叉验证评估每个特征对模型性能的贡献,并计算其置信区间。接着,通过不同的特征选择方法(如基于特征重要性的选择和使用Eli5工具的排列重要性)训练模型,并评估不同特征集对模型表现的影响,以提取出能保证模型精确度的同时又能低维建模,当然这里主要是对比两种完全不一样的特征排序对这个过程的影响
基于特征重要性的选择通常依赖于模型的内部机制(如决策树中的信息增益或基尼指数),适用于特定模型,且实现较简单。但其解释性受限于模型本身,且可能存在过拟合风险
Eli5的排列重要性则是一种模型无关、计算更精确的特征重要性评估方法,能够提供更可靠的特征影响度评估,尤其在模型解释上更为直观,但计算成本较高——可以参考往期文章——Eli5解释:通过随机打乱特征评估其对模型性能的重要性
当然在此基础上,还使用训练集和测试集上的R²分数来评估模型的性能,并绘制多种图形,如特征重要性条形图、R²曲线以及预测值与真实值的散点图,展示每种模型情况的拟合效果。最终,模型的表现通过R²值来比较,包括所有特征、特征重要性选择后的模型以及Eli5选择后的模型
✨ 基础代码 ✨
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
from sklearn.model_selection import train_test_split
df = pd.read_excel('2025-7-14公众号Python机器学习AI.xlsx')
from sklearn.model_selection import train_test_split
# 划分特征和目标变量
X = df.drop(['Tensile strength/MPa'], axis=1)
y = df['Tensile strength/MPa']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42)
from sklearn.ensemble import RandomForestRegressor
# 初始化随机森林回归模型,使用默认参数
model_rf = RandomForestRegressor(random_state=1314)
# 训练模型
model_rf.fit(X_train, y_train)
加载数据,划分特征和目标变量,并使用随机森林回归模型训练数据以预测Tensile strength/MPa。原始数据有31个特征,目标是通过特征选择方法减少模型的特征数量,确保在保持较高模型精度的同时提高计算效率。当然,这里训练了一个所有特征下的随机森林模型,这里是回归数据集,分类模型本质不变代码类似
# 获取特征重要性
feature_importances = model_rf.feature_importances_
# 构建特征重要性排名
feature_importance_df = pd.DataFrame({
'Feature': X.columns,
'Importance': feature_importances
}).sort_values(by='Importance', ascending=False)
# 只取前30个重要特征
top_n = 30
top_features = feature_importance_df.head(top_n)
# 调整字体大小
plt.figure(figsize=(12, 8))
plt.barh(top_features['Feature'], top_features['Importance'], color='skyblue')
plt.xlabel('Importance', fontsize=14)
plt.ylabel('Feature', fontsize=14)
plt.title(f'Top {top_n} Feature Importance', fontsize=16)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.gca().invert_yaxis()
plt.savefig("feature_importances.pdf", format='pdf', bbox_inches='tight', dpi=1200)
plt.show()
通过随机森林模型提取特征重要性,并绘制前30个重要特征的排名图,旨在告诉读者,当特征数量很多时(例如500个特征),可以通过排序仅筛选排名前几十个特征,从而加快计算速度,避免对所有特征进行处理,因为在某些特征子集下模型性能已达到最优或趋于平缓,后续特征的引入反而可能降低模型精度,对于特征子集确定意义不大
基于特征重要性 贡献排名逐步进行特征筛选,并利用 K折交叉验证 来评估每个特征子集的模型稳定性(即可视化图中的置信区间)。通过每次在K折验证集上训练和评估模型,计算并记录每折的 R² 分数,最后选取在K折验证集上均值R²分数最高的特征子集,这样能够更好地反映模型的稳定性。如果不采用K折交叉验证,而是直接使用测试集,目标将是找到使得测试集 R² 分数最高的特征子集
import eli5
from eli5.sklearn import PermutationImportance
# 创建一个 PermutationImportance 实例并拟合模型
# PermutationImportance 是一种模型解释工具,能够通过随机打乱特征值来评估每个特征对模型性能的贡献
# 这里,model 是已训练好的机器学习模型,x_test 和 y_test 是用于评估模型性能的测试数据和标签
# n_ite迭代多少次
perm = PermutationImportance(model_rf, n_iter=20, scoring='r2', random_state=1314).fit(X_test, y_test)
# 使用 eli5 显示特征的重要性
# 该函数将展示每个特征的贡献度,通过打乱每个特征并观察性能下降的幅度来计算每个特征的重要性
weights = eli5.show_weights(perm, feature_names=X_train.columns.tolist())
import matplotlib as mpl
plot_df = feature_importances.head(30).sort_values(by='Weight', ascending=True)
# 创建颜色映射:根据权重大小,使用颜色渐变
norm = plt.Normalize(vmin=plot_df['Weight'].min(), vmax=plot_df['Weight'].max()) # 规范化
colors = mpl.colormaps['coolwarm'](norm(plot_df['Weight'])) # 使用新的方式获取颜色映射
# 绘制水平柱状图,并添加误差条
fig, ax = plt.subplots(figsize=(10, 8))
ax.barh(
plot_df.index,
plot_df['Weight'],
xerr=plot_df['std'],
align='center',
capsize=5,
color=colors # 使用颜色映射
)
ax.set_xlabel('Weight', fontsize=14)
ax.set_ylabel('Feature', fontsize=14)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.tight_layout()
plt.savefig("Weight.pdf", format='pdf', bbox_inches='tight', dpi=1200)
plt.show()
使用Eli5的排列重要性方法,通过随机打乱每个特征并观察模型性能的变化,评估每个特征对模型的贡献度,并通过绘制带有误差条的水平柱状图展示特征的重要性
根据Eli5的排列重要性方法和之前的特征选择方法,最终选择的特征有所不同。虽然最终都选择了前10个特征,但通过两种方法得到的排名存在差异。例如,Eli5方法选择的前10个特征为 ['E12-2', 'C3-2', 'S2-1', 'E11-2', 'A6-1', 'E4-1', 'C12-2', 'S2-2', 'E9-2', 'E10-1'] ,而第一种特征选择方法的前10个特征为 ['E12-2', 'C3-2', 'E11-2', 'S2-1', 'S2-2', 'E9-2', 'G3-1', 'E4-1', 'C8-2', 'E10-1'] 。可以看到,A6-1在 Eli5 方法中被选择,但在第一种方法中未出现,而G3-1则只在第一种方法中排名较高。这些差异表明,特征排名的选择受不同特征重要性评估方法的影响,可能会导致选择不同的特征子集,当然最终都得看不同特征子集的模型精确度
X_train_feature_importances = X_train[list(selection_results['Feature'][0:10])] # 提取各自的筛选特征结果
X_test_feature_importances = X_test[list(selection_results['Feature'][0:10])]
X_train_eli5 = X_train[list(eli5_selection_results['Feature'][0:10])]
X_test_eli5 = X_test[list(eli5_selection_results['Feature'][0:10])]
# 创建并训练基于 selection_results 前 10 个特征的随机森林回归模型
rf_feature_importances = RandomForestRegressor(random_state=1314)
rf_feature_importances.fit(X_train_feature_importances, y_train)
# 创建并训练基于 eli5_selection_results 前 10 个特征的随机森林回归模型
rf_eli5 = RandomForestRegressor(random_state=1314)
rf_eli5.fit(X_train_eli5, y_train)
分别使用selection_results和eli5_selection_results中前10个特征,训练两个随机森林回归模型,随机种子都设为1314,且均使用默认参数,以便与完整特征子集的模型进行比较;实际应用中,得到特征子集后,训练的模型通常会进行相应的调参优化
从可视化结果可以看出,使用原始数据的31个特征时,模型在测试集上的 R² 为0.911。经过两种特征选择方法后,模型分别得到了0.905和0.909的 R² ,即模型性能变化不大。在特征选择过程中,通过使用 K折交叉验证 来评估模型稳定性(K折验证集上均值R²分数,并不是这里的测试集为目标),确保了在减少特征数量的同时,仍能维持较高的模型精度。此外,Eli5方法的结果略高于基于特征重要性的方法,但是差异并不显著,当然这个过程和数据质量相关,模拟数据集本身性能就好所以这个差异体现不大,不同的数据集上可能会有不同的表现。总的来说,最终选择最适合你数据的方法,而非寻找绝对最优的方法
当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息
✨ 该文章案例 ✨
在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。
同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。
✨ 介绍 ✨
本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,下方提供淘宝店铺二维码获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。
更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。
✨ 群友反馈 ✨
✨ 淘宝店铺 ✨
请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!
往期推荐
期刊复现:连续数据与分类数据共存的SHAP可视化散点图与箱形图组合形式
期刊复现:多分类任务如何拆分为二分类任务并进行堆叠预测提高模型预测性能
期刊配图:SHAP值分析模型可解释性在柱状图与蜂窝图中的进阶组合展示
期刊配图:通过堆叠Mean|SHAP|展示不同区间对模型贡献度的可视化分析
期刊复现:利用UMAP降维算法可视化深度学习随着训练次数的增加模型区分能力的变化
期刊配图:PCA、t-SNE与UMAP三种降维方法简化高维数据的展示应用对比
Science期刊复现:分类、回归与Shap分析多角度揭示同一数据集变量对目标的影响
多模型SHAP+PDP解读Stacking集成模型:从基学习器到元学习器的可解释性与模型调参实现
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考