✨ 欢迎关注Python机器学习AI ✨
本节介绍: 通过机器学习算法+相关系数优化特征选择避免多重共线性 。数据采用模拟数据,作者根据个人对机器学习的理解进行代码实现与图表输出,细节并不保证与原文一定相同,仅供参考。 详细数据和代码、文献将在稍后上传至交流群,付费成员可在交流群中获取下载。需要的朋友可关注公众文末提供的购买方式。 购买前请咨询,避免不必要的问题。
✨ 文献信息 ✨
在这篇文献中,特征选择和多重共线性剔除的过程如下:
- 相关性分析和多重共线性剔除: 文章首先通过皮尔逊相关系数分析,排除了具有高度相关性的变量(相关系数大于0.5),以避免多重共线性问题。多重共线性会导致模型参数估计的不稳定,进而影响预测模型的可靠性
- 特征选择: 接下来,研究者使用了三种机器学习算法(LightGBM、随机森林等)对训练数据集中的特征进行排序,选取了排名前10的特征用于后续的模型构建。为了进一步确认所选特征的有效性,选出的特征再次通过皮尔逊相关系数和方差膨胀因子(VIF)测试,确保它们之间没有显著的多重共线性
- 特征进一步筛选和验证: 最终,这些选择的特征被输入到多个机器学习模型中进行训练,并在内外部验证数据集中进行了测试
通过这一系列的步骤,研究确保了所使用的特征在模型中具有独立性,并最大限度地减少了多重共线性对模型效果的影响
✨ 代码实现 ✨
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")
path = r"2025-5-12公众号Python机器学习AI.xlsx"
df = pd.read_excel(path)
import seaborn as sns
features = [
"Feature_1", "Feature_4", "Feature_5", "Feature_6", "Feature_7", "Feature_8", "Feature_9",
"Feature_10", "Feature_11", "Feature_12", "Feature_13", "Feature_14", "Feature_17", "Feature_18",
"Feature_19", "Feature_20", "Feature_21", "Feature_22", "Feature_23", "Feature_24", "Feature_25",
"Feature_26", "Feature_44", "Feature_45", "Feature_46", "Feature_47", "Feature_48", "Feature_49",
"Feature_50", "Feature_51", "Feature_52", "Feature_53", "Feature_54", "Feature_55", "Feature_56",
"Feature_57"
] # 连续性变量
# 计算相关系数矩阵
correlation_matrix = df[features].corr()
# 创建热图,不显示数值
plt.figure(figsize=(12, 8))
sns.heatmap(correlation_matrix, annot=False, cmap='coolwarm', fmt='.2f', linewidths=0.5,
vmin=-1, vmax=1, cbar_kws={'shrink': 0.8})
plt.title('Correlation Matrix of Continuous Variables', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.savefig('Correlation Matrix of Continuous Variables.pdf', format='pdf', bbox_inches='tight', dpi=1200)
plt.show()
计算并可视化一个包含连续变量的相关系数矩阵,并以热图形式展示了变量之间的相关性
# 获取大于0.5的相关系数对
high_correlation_pairs = []
# 遍历矩阵,获取相关系数大于0.5且不在对角线上的特征对
for column in correlation_matrix.columns:
for row in correlation_matrix.index:
if correlation_matrix.loc[row, column] > 0.5 and row != column:
high_correlation_pairs.append((row, column, correlation_matrix.loc[row, column]))
# 输出相关系数大于0.5的特征对
high_correlation_pairs
遍历相关系数矩阵,提取出相关系数大于0.5且不在对角线上的特征对,并将这些特征对及其相关系数存储在 high_correlation_pairs 列表中
# 遍历矩阵,获取相关系数大于0.5且不在对角线上的特征对
for column in correlation_matrix.columns:
for row in correlation_matrix.index:
if correlation_matrix.loc[row, column] > 0.5 and row != column:
high_correlation_pairs.append((row, column, correlation_matrix.loc[row, column]))
# 将需要删除的特征加入到删除列表中
to_delete_features = []
# 排除已处理的特征,防止重复删除
for pair in high_correlation_pairs:
feature1, feature2, correlation = pair
# 如果这两个特征中的一个已经被标记为删除,跳过
if feature1 in to_delete_features or feature2 in to_delete_features:
continue
# 删除其中一个特征
if feature1 not in to_delete_features:
to_delete_features.append(feature1)
print(f"删除了特征: {feature1},保留了特征: {feature2}")
else:
to_delete_features.append(feature2)
print(f"删除了特征: {feature2},保留了特征: {feature1}")
# 输出最终应删除的特征列表
to_delete_features
遍历相关系数大于0.5的特征对,依次删除每对中其中一个特征,以消除多重共线性,并最终输出被删除的特征列表
from sklearn.model_selection import train_test_split
# 划分特征和目标变量
X = df.drop(['Feature_6','Feature_7','Feature_13','Feature_9','Feature_11','Feature_20',
'Feature_21','Feature_25','Feature_26','Feature_46','Feature_49','Feature_52', 'Feature_70'], axis=1)
y = df['Feature_70']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.3,
random_state=42,
stratify=df['Feature_70']
)
rom sklearn.ensemble import RandomForestClassifier
# 构建默认的随机森林模型
RF_model = RandomForestClassifier(random_state=42)
# 训练模型
RF_model.fit(X_train, y_train)
# 获取特征重要性
RF_feature_importances = RF_model.feature_importances_
# 将特征重要性与特征名称一起整理成一个DataFrame
RF_feature_importance_df = pd.DataFrame({
'Feature': X_train.columns,
'Importance': RF_feature_importances
})
# 按照重要性降序排序
RF_feature_importance_df = RF_feature_importance_df.sort_values(by='Importance', ascending=False)
# 获取前10个特征
top_10_rf_features = RF_feature_importance_df.head(10)['Feature'].tolist()
# 输出前10个特征及其重要性
print("Top 10 important features for Random Forest model:")
print(RF_feature_importance_df.head(10))
# 将前10个特征保存为一个列表变量
RF_top_10_features = top_10_rf_features
import lightgbm as lgb
lgbm_model = lgb.LGBMClassifier(random_state=42, verbose=-1)
lgbm_model.fit(X_train, y_train)
lgbm_feature_importances = lgbm_model.feature_importances_
lgbm_feature_importance_df = pd.DataFrame({
'Feature': X_train.columns,
'Importance': lgbm_feature_importances
})
lgbm_feature_importance_df = lgbm_feature_importance_df.sort_values(by='Importance', ascending=False)
lgbm_top_10_features = lgbm_feature_importance_df.head(10)['Feature'].tolist()
print("Top 10 important features for LightGBM model:")
print(lgbm_feature_importance_df.head(10))
import xgboost as xgb
xgb_model = xgb.XGBClassifier(random_state=42, verbosity=0)
xgb_model.fit(X_train, y_train)
xgb_feature_importances = xgb_model.feature_importances_
xgb_feature_importance_df = pd.DataFrame({
'Feature': X_train.columns,
'Importance': xgb_feature_importances
})
xgb_feature_importance_df = xgb_feature_importance_df.sort_values(by='Importance', ascending=False)
xgb_top_10_features = xgb_feature_importance_df.head(10)['Feature'].tolist()
print("Top 10 important features for XGBoost model:")
print(xgb_feature_importance_df.head(10))
# 计算三个列表的并集
all_top_features = list(set(RF_top_10_features) | set(lgbm_top_10_features) | set(xgb_top_10_features))
all_top_features
使用随机森林、LightGBM和XGBoost模型训练数据,获取每个模型的前10个重要特征,并计算这三个模型前10个特征的并集,最终输出所有模型共同选择的重要特征
# 计算相关系数矩阵
correlation_matrix = df[top_10_continuous_vars].corr()
# 创建热图,不显示数值
plt.figure(figsize=(12, 8))
sns.heatmap(correlation_matrix, annot=False, cmap='coolwarm', fmt='.2f', linewidths=0.5,
vmin=-1, vmax=1, cbar_kws={'shrink': 0.8})
plt.title('Correlation Matrix of Continuous Variables', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.savefig('Correlation Matrix of Continuous Variables-2.pdf', format='pdf', bbox_inches='tight', dpi=1200)
plt.show()
可视化选定的连续变量的相关系数矩阵,通过热图展示变量之间的相关性
from statsmodels.stats.outliers_influence import variance_inflation_factor
from statsmodels.tools.tools import add_constant
# 选择数据集中的前10个连续性变量
X_continuous = df[top_10_continuous_vars]
# 向数据集添加常数列,以便计算 VIF
X_continuous_with_const = add_constant(X_continuous)
# 计算每个特征的 VIF
vif_data = pd.DataFrame()
vif_data["Feature"] = X_continuous_with_const.columns
vif_data["VIF"] = [variance_inflation_factor(X_continuous_with_const.values, i)
for i in range(X_continuous_with_const.shape[1])]
vif_data
计算选定的前10个连续变量的方差膨胀因子(VIF),并将每个特征及其对应的VIF值输出,帮助识别是否存在多重共线性。若VIF值大于10,则表明该特征存在较强的多重共线性,而在这段代码中,VIF值为1.x,表明这些连续性变量之间没有严重的多重共线性
在处理相关系数较高的特征时,文章并未明确说明应剔除哪一个特征,所以这里通过随机选择其中一个进行剔除。然而,作者建议在实际操作中,除了依赖于随机选择,还可以结合专业知识来决定剔除哪个特征。例如,如果某个特征在领域知识中具有更高的意义或更强的解释性,可以优先保留该特征
此外还可以结合其他模型的特征贡献排名来辅助决策。具体来说,可以通过训练多个模型(如随机森林、XGBoost等)并评估每个特征的重要性,进而剔除那些贡献较低的特征,保留那些对模型性能提升有较大贡献的特征。这样,剔除的过程不仅依赖于统计结果,还能够结合模型的实际表现和业务理解,从而更有针对性地优化特征集
✨ 该文章案例 ✨
在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。
同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。
✨ 购买介绍 ✨
本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,或添加作者微信deep_ML联系,购买作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用,包括但不限于ChatGPT、Deepseek、Claude等。
更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 购买前请咨询,避免不必要的问题。
✨ 群友反馈 ✨
✨ 淘宝店铺 ✨
请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容,或者添加作者微信deep_ML联系 避免淘宝客服漏掉信息 ,希望能为您的学习之路提供帮助!
往期推荐
机器学习在临床数据分析中的应用:从数据预处理到Web应用实现的完整流程教学
因果推断:利用EconML实现双重机器学习估计条件平均处理效应 (CATE)
期刊复现:基于XGBoost模型的网页工具SHAP力图解释单样本预测结果
期刊配图:nature cities通过ALE(累积局部效应)解析特征对模型影响
期刊复现:结合因果推断与SHAP可解释性的机器学习实现应用流程
nature communications:基于Light GBM与随机森林结合的多模型特征选择方法
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考
