期刊复现:材料领域中的特征选择与建模LightGBM+相关性去除多重共线性+穷举优化策略

机器学习算法数据库

picture.image

✨ 欢迎关注Python机器学习AI ✨

本节介绍: 材料领域中的特征选择与建模LightGBM+相关性去除多重共线性+穷举优化策略 ,数据采用模拟数据无任何现实意义 ,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。文末提供高效的AI工具~!

✨ 文章信息 ✨

picture.image

文献中这部分工作展示通过机器学习方法优化铝合金的设计,特别是在强度(UTS)、断裂韧性(KIC)和应力腐蚀敏感度(ISSRT)这三项关键性能的同步提升。

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

  • 特征筛选与相关性分析:图(a)-(c)展示了排名前15的特征之间的 Pearson相关系数矩阵 ,用于表示特征之间的线性相关性,通过去除相关性较强的冗余特征(即 |r| > 0.95 的特征),减少特征数量,保留信息最丰富的特征
  • 特征重要性排名:使用 随机森林算法 评估132个构造的特征(即合金因子)对目标属性( UTSKICISSRT )的影响,随机森林通过计数决策树分裂节点时使用每个特征的频次,并计算其对目标变量的解释力,得出特征的重要性排名(图(d)-(f))。其中,图中也包含了基于相关系数剔除特征信息
  • 穷举计算与模型构建:在经过相关性筛选后的10个候选特征中,进行所有特征组合的穷举计算,选择可以最大化决定系数( )的特征组合,作为最终的关键特征,图(g)-(i)展示了对特征数量变化进行穷举计算时的决定系数 结果,星号标注了最佳特征组合
  • 回归模型的预测验证:基于筛选出的关键特征,构建预测模型,计算实验数据与预测数据的拟合度,决定系数达到很高的水平(图(j)-(l)),过实验数据的分布与拟合线对比,验证模型的预测精度

这些方法综合运用了 特征工程 (相关性筛选、特征重要性分析)、 机器学习建模 (随机森林、穷举计算)和 可视化技术 (相关矩阵图、重要性柱状图、拟合散点图)来系统分析高端铝合金性能的影响因素

文献中使用的模型为 随机森林 (RF) 模型,在往期的公众号文章中已经有了相关实现。本次实现将模型替换为 LightGBM 模型,并对相关图表进行美化,旨在教会大家如何灵活运用这种方法进行 材料领域中的特征选择与建模 。当然,这种方法并不限于材料领域,其他领域同样可以采用类似的方式进行特征选择、模型构建和优化

✨ 代码实现 ✨

  
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-11-11公众号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.model_selection import train_test_split  
from lightgbm import LGBMRegressor  
  
# 构建 LightGBM 模型(默认参数)   
lgb_model = LGBMRegressor(random_state=42)  
lgb_model.fit(X_train, y_train)  
  
# 提取特征重要性  
feature_importance = lgb_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)  
import matplotlib.cm as cm  
import matplotlib.colors as mcolors  
  
# 按特征重要性降序排列,并选取前15个特征  
top_features = feature_importance_df.head(15)  
importances = top_features['Importance']  
features = top_features['Feature']  
norm = mcolors.Normalize(vmin=importances.min(), vmax=importances.max())  
colors = cm.Blues(norm(importances))  
  
# 绘制单个模型的特征重要性柱状图  
plt.figure(figsize=(12, 8), dpi=1200)  # 调整图像大小以配合更大的字体  
plt.barh(features, importances, color=colors)  
plt.title("Top 15 Feature Importances", fontsize=18)  # 设置标题字体大小  
plt.xlabel("Importance", fontsize=14)  # 设置 x 轴标签字体大小  
plt.ylabel("Features", fontsize=14)  # 设置 y 轴标签字体大小  
plt.xticks(fontsize=12)  # 设置 x 轴刻度字体大小  
plt.yticks(fontsize=12)  # 设置 y 轴刻度字体大小  
plt.gca().invert_yaxis()  # 让特征重要性高的在顶部  
plt.tight_layout()  
plt.savefig('LightGBM.pdf', format='pdf', bbox_inches='tight', dpi=1200)  
plt.show()                                                    

picture.image

使用LightGBM回归模型对数据进行训练,并计算每个特征对预测目标(即拉伸强度)的重要性。接着,代码提取出前15个最重要的特征,按照其重要性排序,并绘制特征重要性的水平柱状图。柱状图通过颜色深浅表示特征的重要性,特征重要性较高的特征位于图表的顶部

考虑到机器学习中的 峰值定理 ——即在有限的特征组合下,模型的性能通常在某个特定点达到最优,因此这里只可视化了前15个最重要的特征。这是为了确保特征选择的效率和模型性能的平衡,避免引入过多冗余特征导致的计算开销和过拟合风险。值得注意的是, 15 只是一个示例阈值,具体的特征数量应根据不同数据集的特点进行调整,读者可以根据实际需求选择适合的特征数量

picture.image

分析排名前15特征数据集中各特征之间的相关性解决多重共线性问题,首先计算相关系数矩阵和p值矩阵。接着,使用气泡图和数值可视化展示了各特征对之间的相关性强度和显著性。 下三角区域 采用正方形气泡图展示相关性强度,气泡大小表示相关系数的绝对值,且通过星号标记显著性(p < 0.05)。 上三角区域 则显示了相关系数的数值,并根据 p 值的显著性区别显示:显著性(p < 0.05)使用 黑色字体 ,无显著性(p ≥ 0.05)使用 红色字体

  
def select_top_features_by_correlation(corr_matrix, features, top_features, threshold=0.95):  
    """  
    根据相关系数矩阵剔除多重共线性特征,同时打印出被剔除的特征对。  
  
    参数:  
        corr_matrix (pd.DataFrame): 特征的相关系数矩阵。  
        features (list): 特征名称列表,按重要性降序排列。  
        top_features (pd.DataFrame): 包含特征及其重要性排序的数据框。  
        threshold (float): 剔除线性相关特征的相关系数阈值(绝对值)。  
  
    返回:  
        list: 最终保留的特征列表。  
    """  
    selected_features = []  
    discarded_features = set()  
    removed_pairs = []  # 用于保存高相关特征对信息  
  
    for feature in features:  
        if feature in discarded_features:  
            continue  
  
        for selected in selected_features:  
            corr_value = corr_matrix.loc[feature, selected]  
            if abs(corr_value) > threshold:  # 超过阈值  
                # 找出重要性  
                imp_f = float(top_features.loc[top_features['Feature'] == feature, 'Importance'].values[0])  
                imp_s = float(top_features.loc[top_features['Feature'] == selected, 'Importance'].values[0])  
                .......  
                break  # 当前特征处理完,跳出内层循环  
  
        # 如果当前特征没被丢弃,则加入选中列表  
        if feature not in discarded_features:  
            selected_features.append(feature)  
  
    # 打印高相关特征对信息  
    if removed_pairs:  
        print("发现高相关特征对(|corr| > {:.2f}):\n".format(threshold))  
        for pair in removed_pairs:  
            print(f"{pair['Feature_A']}{pair['Feature_B']} | corr={pair['Correlation']:.3f} | 保留: {pair['Kept']} | 剔除: {pair['Dropped']}")  
    else:  
        print("未发现相关系数超过阈值的特征对。")  
  
    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_features, threshold=0.95  
)  
print(" 最终保留的特征:", final_features)

通过计算特征的 皮尔逊相关系数矩阵 ,根据设定的相关性阈值(默认为 0.95 )筛选特征,剔除高度相关的冗余特征,并打印出被剔除的特征对。阈值 threshold=0.95 用于控制多重共线性的严格程度,读者可以根据自己的研究背景进行调整,例如某些文献中可能设置为 0.75 ,较高的阈值允许更多的特征共线性,较低的阈值则更严格地剔除高相关特征

  
发现高相关特征对(|corr| > 0.95):  
E7-2E8-2 | corr=0.961 | 保留: E8-2 | 剔除: E7-2  
 最终保留的特征: ['A6-2', 'S4-2', 'A4-2', 'C6-2', 'S13-2', 'E4-2', 'E8-2', 'S3-2', 'S6-2', 'E15-1', 'S14-1', 'E4-1', 'S8-2', 'A5-1']

结果表明,特征 E7-2 和 E8-2 具有较强的相关性(相关系数为 0.961),因此E7-2被剔除,保留了E8-2(根据更高的贡献度原则)。最终,剩下的特征包括:A6-2、S4-2、A4-2、C6-2、S13-2、E4-2、E8-2、S3-2、S6-2、E15-1、S14-1、E4-1、S8-2 和 A5-1

picture.image

  
# 划分特征和目标变量  
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)  
import itertools  
# 穷举所有特征组合  
all_combinations = []  
for r in range(1, len(final_features) + 1):  
    combinations = list(itertools.combinations(final_features, r))  
    all_combinations.extend(combinations)  
  
all_combinations                                                     

通过使用 itertools.combinations 函数穷举了 final_features 中所有可能的特征组合,并将其存储在 all_combinations 列表中,用于后续的模型训练和评估

  
[('A6-2',),   ('S4-2',),   ('A4-2',),   ('C6-2',),   ('S13-2',),   ('E4-2',),   ('E8-2',),   ('S3-2',),   ('S6-2',),   ('E15-1',),   ('S14-1',),   ......    ('A4-2', 'C6-2', 'E4-2', 'A5-1'),   ('A4-2', 'C6-2', 'E8-2', 'S3-2'),   ('A4-2', 'C6-2', 'E8-2', 'S6-2'),   ('A4-2', 'C6-2', 'E8-2', 'E15-1'),   ('A4-2', 'C6-2', 'E8-2', 'S14-1'),   ('A4-2', 'C6-2', 'E8-2', 'E4-1'),   ('A4-2', 'C6-2', 'E8-2', 'S8-2'),   ('A4-2', 'C6-2', 'E8-2', 'A5-1'),   ('A4-2', 'C6-2', 'S3-2', 'S6-2'),   ...]

picture.image

通过穷举所有特征组合,使用LightGBM模型和5折交叉验证 计算每个特征组合的R²分数,最终可以发现在不同特征数量下模型的 系数,红色实心圆圈表示每个特征数量下的最佳表现,星号标记了最终的最佳特征组合(A6-2, S4-2, A4-2, E4-2, E8-2, S6-2, E15-1, S14-1, A5-1 ),该组合达到了最高的 分数

  
# 划分特征和目标变量  
X = df[results_df.loc[global_best_idx, '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 GridSearchCV, KFold  
  
# 定义 LightGBM 模型  
lgb_model = LGBMRegressor(random_state=42, verbose=-1)  
  
# 设置参数网格  
param_grid = {  
    'n_estimators': [50, 80],             # 减少树的数量范围  
    'max_depth': [5, 10, 15],             # 限制树的深度  
    'learning_rate': [0.01, 0.05],        # 学习率的设置  
    'num_leaves': [31, 50, 70],           # 控制树的形状  
    'min_child_samples': [20, 50],        # 每个叶子节点的最小样本数  
    'subsample': [0.8, 1.0],              # 数据采样比例  
    'colsample_bytree': [0.8, 1.0]        # 特征采样比例  
}  
  
# 设置更严格的交叉验证  
cv = KFold(n_splits=10, shuffle=True, random_state=42)  
  
# 网格搜索  
grid_search = GridSearchCV(estimator=lgb_model, param_grid=param_grid,  
                           cv=cv, scoring='neg_mean_absolute_error', n_jobs=-1, verbose=2)  
  
# 训练模型  
grid_search.fit(X_train, y_train)  
  
# 使用最佳参数训练模型  
lgb_model = grid_search.best_estimator_                                                    

根据从特征选择中得到的最佳特征子集,使用GridSearchCV对LightGBM模型进行超参数调优,通过10折交叉验证 找到最佳参数配置,最终训练出一个优化过的LightGBM模型

  
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score  
  
# 预测训练集和测试集的结果  
y_train_pred = lgb_model.predict(X_train)  
y_pred = lgb_model.predict(X_test)  
  
# 计算训练集性能指标  
mae_train = mean_absolute_error(y_train, y_train_pred)  
mse_train = mean_squared_error(y_train, y_train_pred)  
rmse_train = np.sqrt(mse_train)  
r2_train = r2_score(y_train, y_train_pred)  
  
# 打印训练集性能指标  
print(f'训练集Mean Absolute Error (MAE): {mae_train}')  
print(f'训练集Mean Squared Error (MSE): {mse_train}')  
print(f'训练集Root Mean Squared Error (RMSE): {rmse_train}')  
print(f'训练集R-squared (R2): {r2_train}')  
  
print(f'-------------------------')  
  
# 计算测试集性能指标  
mae_test = mean_absolute_error(y_test, y_pred)  
mse_test = mean_squared_error(y_test, y_pred)  
rmse_test = np.sqrt(mse_test)  
r2_test = r2_score(y_test, y_pred)  
  
# 打印测试集性能指标  
print(f'测试集Mean Absolute Error (MAE): {mae_test}')  
print(f'测试集Mean Squared Error (MSE): {mse_test}')  
print(f'测试集Root Mean Squared Error (RMSE): {rmse_test}')  
print(f'测试集R-squared (R2): {r2_test}')

使用训练好的 LightGBM 模型对训练集和测试集进行预测,计算打印 均方误差 (MSE)均方根误差 (RMSE)平均绝对误差 (MAE)决定系数 (R²) 性能指标,以评估模型在训练集和测试集上的表现

  
训练集Mean Absolute Error (MAE): 23.69612775599336  
训练集Mean Squared Error (MSE): 1069.8394269450541  
训练集Root Mean Squared Error (RMSE): 32.708399944739796  
训练集R-squared (R2): 0.9470954948250664  
-------------------------  
测试集Mean Absolute Error (MAE): 38.29118759258447  
测试集Mean Squared Error (MSE): 2616.7893673752833  
测试集Root Mean Squared Error (RMSE): 51.15456350488471  
测试集R-squared (R2): 0.9055116726965472

结果显示模型在训练集和测试集上的性能。训练集的 高达 0.95 ,说明模型在训练数据上拟合得非常好,误差较小(MAE为 23.7 )。在测试集上, 降至 0.91 ,表明模型的泛化能力稍有下降,预测误差增大(MAE为 38.3 )。这表明模型可能在训练集上存在一定的过拟合现象,尽管测试集的表现仍然较为理想,当然所谓的过拟合也需要根据不同的数据背景确定,过拟合有一定的容忍度,并不是训练集比测试集高就一定要说过拟合,理想情况下训练集和测试集应该报错一致

picture.image

最后绘制一个 散点图 ,比较 训练集测试集 的实际材料性能与预测材料性能之间的关系。图中的 主图 展示预测值与实际值的散点, 回归线 (灰色线)表示两者之间的拟合关系。 边缘直方图 显示了训练集和测试集实际值的分布,以及预测值的分布。图表的右下角标出了 MAE (平均绝对误差)、 RMSE (均方根误差)和 (决定系数)等性能指标,用以评估模型在测试集上的预测精度

当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息

picture.image

✨ 该文章案例 ✨

picture.image

在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。

同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。

✨ 介绍 ✨

本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,下方提供淘宝店铺二维码获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。

更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。

✨ 群友反馈 ✨

picture.image

✨ 淘宝店铺 ✨

picture.image

请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!

✨ 书籍推荐 ✨

无论你是零编程基础的科研新手,还是想提升机器学习技能的医学科研工作者,这本书都能带你从入门到进阶,掌握Python数据分析+医学AI应用的全流程技能

✨ AI工具推荐 ✨

picture.image

往期推荐

期刊配图:模型SHAP解释特征类别柱状图、饼图与蜂巢图的组合展示

期刊复现:基于自动机器学习的预测模型构建及其残差和部分依赖分析

期刊复现:SVM、RF、BDT、DT、Logit五大模型堆叠31种组合情况最优模型的SHAP解释

期刊复现:单变量特征降维与共线性分析结合RFE集成排名进行特征筛选下的组合拳流程

期刊复现:SVM、RF、BDT、DT、Logit五大模型堆叠31种组合情况优化与最优模型选择可视化

期刊复现:基于相关系数与AUC值优化特征选择剔除冗余特征精简模型(附代码)

期刊复现:如何正确使用LASSO进行二分类特征选择?避开常见误区,掌握实用技巧

期刊复现:融合聚类与多分类转二分类的亚型可解释SHAP机器学习模型构建

期刊复现:基于LightGBM、XGBoost与RF的Lasso回归堆叠模型在连续和分类特征上的模型解释

期刊复现:基于LightGBM、XGBoost与RF的堆叠模型贝叶斯优化调参与Lasso回归元模型,结合10倍交叉验证

picture.image

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

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
大规模高性能计算集群优化实践
随着机器学习的发展,数据量和训练模型都有越来越大的趋势,这对基础设施有了更高的要求,包括硬件、网络架构等。本次分享主要介绍火山引擎支撑大规模高性能计算集群的架构和优化实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论