背景
文献中图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)
使用随机森林算法训练模型并提取特征重要性,通过统计每个特征在决策树分裂节点中的使用频次及其对目标变量的解释力,计算特征的重要性并进行降序排名,从而评估各特征对目标属性的影响,从而获取排名前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)
通过计算特征的皮尔逊相关系数矩阵,逐步筛选掉与已选择特征之间线性相关性较强(相关系数绝对值大于阈值 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()
根据特征重要性绘制柱状图,通过颜色区分被保留的特征(红色)和被剔除的特征(蓝色),并添加图例以直观展示前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
穷举所有特征组合,并对每个特征组合使用随机森林模型进行5折交叉验证,计算平均
分数,记录每个组合的表现并排
序,以找到性能最佳的特征组合;记录的是5折交叉验证的平均成绩,从而避免因某一特定数据划分导致的偶然最优结果,提高模型评估的稳定性和可靠性
最后对所有特征组合及其模型评价指标进行可视化,其中星号标注了最佳特征组合
最终特征组合回归模型的预测
# 划分特征和目标变量
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)
对最终特征组合通过网格搜索对随机森林模型进行超参数调优,使用最优参数训练模型,并评估训练集和测试集的回归性能指标(MSE、RMSE、MAE、R²);同时,文献中对模型调参的具体方法和步骤并不清晰,仅在图3部分中隐含模型性能优化的过程,作者最后才对模型进行调参处理,这可能是作者个人对文献内容的理解,而实际文献中是否进行了调参或如何调参尚不明确,当然也可能是作者阅读不够仔细 🤔🐕
最后通过可视化,将随机森林模型在训练集和测试集上的预测值与真实值进行可视化对比,同时标注拟合优度 和参考线x=y,直观展示模型的预测性能和偏差分布,完整 代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
往期推荐
聚类与解释的结合:利用K-Means聚类辅助SHAP模型解释并可视化
期刊配图:SHAP可视化改进依赖图+拟合线+边缘密度+分组对比
期刊配图:SHAP蜂巢图与柱状图多维组合解读特征对模型的影响
基于mRMR筛选和递归特征选择的多模型性能评估与AUC可视化对比
期刊配图:SHAP可视化进阶蜂巢图与特征重要性环形图的联合展示方法
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考