期刊复现:随机森林+相关性筛选+穷举优化的特征选择与建模

机器学习算法大数据

picture.image

背景

picture.image

picture.image

文献中图3的可视化实现原理主要基于机器学习中的特征重要性分析、相关性筛选和回归建模。以下是具体的实现逻辑:

特征筛选与相关性分析:

  • 图(a)-(c)显示了排名前15的特征之间的Pearson相关系数矩阵,用于表示特征之间的线性相关性
  • 通过去除相关性较强的冗余特征(即|r| > 0.95的特征),减少特征数量,保留信息最丰富的特征
  • 填充的圆圈部分表示相关系数的绝对值大小,颜色则区分正相关(红色)和负相关(蓝色)

特征重要性排名:

  • 使用随机森林算法评估132个构造的特征(称为合金因子)对目标属性(UTS、KIC、ISSRT)的影响
  • 随机森林通过计数决策树分裂节点时使用每个特征的频次,并计算其对目标变量的解释力,得出特征的重要性排名(图(d)-(f))【里面包含基于相关系数剔除特征信息】

穷举计算与模型构建:

  • 在经过相关性筛选后的10个候选特征中,进行所有特征组合的穷举计算,选择可以最大化决定系数 的特征组合,作为最终的关键特征
  • 图(g)-(i)展示了对特征数量的变化进行穷举计算时的决定系数 结果。其中星号标注了最佳特征组合

回归模型的预测验证:

  • 基于筛选出的关键特征,构建预测模型,计算实验数据与预测数据的拟合度,决定系数达到很高的水平(图(j)-(l))
  • 通过实验数据的分布与拟合线对比,验证模型的预测精度

这些方法综合运用了特征工程(相关性筛选、特征重要性分析)、机器学习建模(随机森林、穷举计算)和可视化技术(相关矩阵图、重要性柱状图、拟合散点图)来系统分析高端铝合金性能的影响因素,文献中并没有具体说明哪一步(如随机森林特征排名、基于筛选特征进行最终模型构建等)对机器学习模型进行了调参处理。因此,接下来基于模拟数据按照这个步骤流程进行模拟实现,仅是一个算法和流程的实现,并没有任何现实意义,并不保证和文献是一模一样

代码实现

数据预处理


          
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
          
import warnings
          
# 忽略所有警告
          
warnings.filterwarnings("ignore")
          
df = pd.read_excel('2025-1-12公众号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)
      

读取数据集、划分特征和目标变量,并将数据集分为训练集和测试集,旨在为后续机器学习模型的训练和特征贡献度分析(如特征重要性评估)做准备

排名前15特征获取


          
from sklearn.model_selection import train_test_split
          
from sklearn.ensemble import RandomForestRegressor
          

          
# 构建随机森林模型(默认参数) # 建议调参
          
rf_model = RandomForestRegressor(random_state=42)
          
rf_model.fit(X_train, y_train)
          

          
# 提取特征重要性
          
feature_importance = rf_model.feature_importances_
          

          
# 构建特征重要性 DataFrame
          
feature_importance_df = pd.DataFrame({
          
    'Feature': X.columns,
          
    'Importance': feature_importance
          
})
          

          
# 按重要性降序排序
          
feature_importance_df = feature_importance_df.sort_values(by='Importance', ascending=False)
      

picture.image

使用随机森林算法训练模型并提取特征重要性,通过统计每个特征在决策树分裂节点中的使用频次及其对目标变量的解释力,计算特征的重要性并进行降序排名,从而评估各特征对目标属性的影响,从而获取排名前15的特征

特征筛选与相关性分析


          
# 定义函数:基于皮尔逊相关系数矩阵剔除多重共线性
          
def select_top_features_by_correlation(corr_matrix, features, top_n=10, threshold=0.95):
          
    selected_features = []  # 初始化保留特征列表
          

          
    for feature in features:
          
        # 检查当前特征与已选择特征的相关性
          
        is_highly_correlated = False
          
        for selected in selected_features:
          
            if abs(corr_matrix.loc[feature, selected]) > threshold:  # 如果超过阈值
          
                is_highly_correlated = True
          
                break
          

          
        # 如果当前特征没有与已选择特征强相关,则保留
          
        if not is_highly_correlated:
          
            selected_features.append(feature)
          

          
        # 如果已选择的特征数量达到 top_n,则停止筛选
          
        if len(selected_features) == top_n:
          
            break
          

          
    return selected_features
          

          
# 计算皮尔逊相关系数矩阵
          
pearson_corr_matrix = selected_features_df.corr(method='pearson')
          

          
# 获取排名前15的特征名称
          
sorted_features = list(top_features['Feature'][:15])
          
final_features = select_top_features_by_correlation(pearson_corr_matrix, sorted_features, top_n=10, threshold=0.95)
          
print("最终保留的10个合金因子:", final_features)
      

picture.image

picture.image

通过计算特征的皮尔逊相关系数矩阵,逐步筛选掉与已选择特征之间线性相关性较强(相关系数绝对值大于阈值 threshold)的特征,从排名前15的重要特征中保留相关性较低的特征,最终筛选出10个特征(top_n)。这个过程确保选出的特征既具有较高的重要性,又能最大程度避免多重共线性对模型的影响,完整 代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系


          
# 15个特征的重要性
          
feature_names = selected_features_df.columns  # 特征名称
          
feature_importances = feature_importance_df.iloc[0:15]['Importance']  # 特征重要性
          
selected_features = final_features  # 保留的前10特征
          

          
# 设置颜色:保留的特征为红色,剔除的特征为蓝色
          
colors = ['red' if feature in selected_features else 'blue' for feature in feature_names]
          

          
# 创建柱状图
          
plt.figure(figsize=(10, 6), dpi=300)
          
bars = plt.bar(feature_names, feature_importances, color=colors, edgecolor='black', alpha=0.85)
          

          
# 添加图例
          
red_patch = plt.Line2D([0], [0], color='red', lw=4, label='Features of exhaustion')  # 红色图例
          
blue_patch = plt.Line2D([0], [0], color='blue', lw=4, label='Removed features')  # 蓝色图例
          
plt.legend(handles=[red_patch, blue_patch], loc='upper right', fontsize=12)
          

          
# 设置图形标题和标签
          
plt.title('Feature Importances', fontsize=16)
          
plt.xlabel('Features', fontsize=14)
          
plt.ylabel('Feature-Importances', fontsize=14)
          
plt.xticks(rotation=45, fontsize=10, ha='right')
          
plt.tight_layout()
          
plt.savefig('3.png', format='png', bbox_inches='tight')
          
plt.show()
      

picture.image

根据特征重要性绘制柱状图,通过颜色区分被保留的特征(红色)和被剔除的特征(蓝色),并添加图例以直观展示前15个特征的筛选结果及其重要性

穷举计算


          
# 划分特征和目标变量
          
X = df.drop(['序号', 'Tensile strength/MPa'], axis=1)[final_features]
          
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.model_selection import cross_val_score
          
# 初始化结果存储
          
results = []
          

          
# 逐个特征组合建模并评估
          
for combination in all_combinations:
          
    selected_features = list(combination)
          
    X_train_subset = X_train[selected_features]
          
    X_test_subset = X_test[selected_features]
          
    
          
    # 创建随机森林模型(默认参数)
          
    rf_model = RandomForestRegressor(random_state=42)
          
    
          
    # 进行5折交叉验证,计算平均 R^2 分数
          
    cv_scores = cross_val_score(rf_model, X_train_subset, y_train, cv=5, scoring='r2')
          
    mean_cv_score = np.mean(cv_scores)
          
    
          
    # 记录结果
          
    results.append({
          
        'Features': selected_features,
          
        'Mean CV R^2': mean_cv_score
          
    })
          

          
# 将结果转换为 DataFrame 并按 R^2 分数排序
          
results_df = pd.DataFrame(results)
          
results_df = results_df.sort_values(by='Mean CV R^2', ascending=False).reset_index(drop=True)
          
results_df
      

picture.image

穷举所有特征组合,并对每个特征组合使用随机森林模型进行5折交叉验证,计算平均
分数,记录每个组合的表现并排 序,以找到性能最佳的特征组合;记录的是5折交叉验证的平均成绩,从而避免因某一特定数据划分导致的偶然最优结果,提高模型评估的稳定性和可靠性

picture.image

最后对所有特征组合及其模型评价指标进行可视化,其中星号标注了最佳特征组合

最终特征组合回归模型的预测


          
# 划分特征和目标变量
          
X = df[['E12-2', 'C3-2', 'E11-2', 'S2-1', 'E4-1', 'C16-2', 'E10-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.model_selection import GridSearchCV, KFold
          

          
# 定义随机森林模型
          
rf_model = RandomForestRegressor(random_state=42)
          

          
param_grid = {
          
    'n_estimators': [50, 80],             # 减少树的数量范围
          
    'max_depth': [5, 10, 15],             # 限制树的深度
          
    'min_samples_split': [5, 10],         # 增加节点分裂所需的最小样本数
          
    'min_samples_leaf': [5, 10],          # 增加叶节点的最小样本数
          
    'max_features': ['sqrt', 'log2']      # 避免使用 None
          
}
          

          
# 设置更严格的交叉验证
          
cv = KFold(n_splits=10, shuffle=True, random_state=42)
          

          
# 网格搜索
          
grid_search = GridSearchCV(estimator=rf_model, param_grid=param_grid,
          
                           cv=cv, scoring='neg_mean_absolute_error', n_jobs=-1, verbose=2)
          

          
# 训练模型
          
grid_search.fit(X_train, y_train)
          

          
# 使用最佳参数训练模型
          
rf_model = grid_search.best_estimator_
          

          
from sklearn import metrics
          
# 预测
          
y_pred_train = rf_model.predict(X_train)
          
y_pred_test = rf_model.predict(X_test)
          

          
# 转换为列表(可选,避免可能的兼容性问题)
          
y_pred_train_list = y_pred_train.tolist()
          
y_pred_test_list = y_pred_test.tolist()
          

          
# 计算训练集的指标
          
mse_train = metrics.mean_squared_error(y_train, y_pred_train_list)
          
rmse_train = np.sqrt(mse_train)
          
mae_train = metrics.mean_absolute_error(y_train, y_pred_train_list)
          
r2_train = metrics.r2_score(y_train, y_pred_train_list)
          

          
# 计算测试集的指标
          
mse_test = metrics.mean_squared_error(y_test, y_pred_test_list)
          
rmse_test = np.sqrt(mse_test)
          
mae_test = metrics.mean_absolute_error(y_test, y_pred_test_list)
          
r2_test = metrics.r2_score(y_test, y_pred_test_list)
          

          
# 打印结果
          
print("训练集评价指标:")
          
print("均方误差 (MSE):", mse_train)
          
print("均方根误差 (RMSE):", rmse_train)
          
print("平均绝对误差 (MAE):", mae_train)
          
print("拟合优度 (R-squared):", r2_train)
          

          
print("\n测试集评价指标:")
          
print("均方误差 (MSE):", mse_test)
          
print("均方根误差 (RMSE):", rmse_test)
          
print("平均绝对误差 (MAE):", mae_test)
          
print("拟合优度 (R-squared):", r2_test)                                                                                                      
      

picture.image

对最终特征组合通过网格搜索对随机森林模型进行超参数调优,使用最优参数训练模型,并评估训练集和测试集的回归性能指标(MSE、RMSE、MAE、R²);同时,文献中对模型调参的具体方法和步骤并不清晰,仅在图3部分中隐含模型性能优化的过程,作者最后才对模型进行调参处理,这可能是作者个人对文献内容的理解,而实际文献中是否进行了调参或如何调参尚不明确,当然也可能是作者阅读不够仔细 🤔🐕

picture.image

最后通过可视化,将随机森林模型在训练集和测试集上的预测值与真实值进行可视化对比,同时标注拟合优度 和参考线x=y,直观展示模型的预测性能和偏差分布,完整 代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系

往期推荐

SHAP值+模型预测概率解读机器学习模型的决策过程

聚类与解释的结合:利用K-Means聚类辅助SHAP模型解释并可视化

期刊配图:RFE结合随机森林与K折交叉验证的特征筛选可视化

期刊配图:变量重要性排序与顺序正向选择的特征筛选可视化

期刊配图:SHAP可视化改进依赖图+拟合线+边缘密度+分组对比

期刊配图:SHAP蜂巢图与柱状图多维组合解读特征对模型的影响

基于mRMR筛选和递归特征选择的多模型性能评估与AUC可视化对比

期刊配图:SHAP可视化进阶蜂巢图与特征重要性环形图的联合展示方法

期刊配图:基于t-sne降维与模型预测概率的分类效果可视化

期刊配图:多种机器学习算法在递归特征筛选中的性能变化图示

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
相关资源
火山引擎大规模机器学习平台架构设计与应用实践
围绕数据加速、模型分布式训练框架建设、大规模异构集群调度、模型开发过程标准化等AI工程化实践,全面分享如何以开发者的极致体验为核心,进行机器学习平台的设计与实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论