先利用PCA做主成分分析,通过累计贡献率确定最佳主成分数,然后再进行BP回归预测分析,两个算法已经都写在一起了,可以直接运行,不用分段运行,有需要的可以直接加好友我。

先看这段完整代码:

import numpy as np
from sklearn.decomposition import PCA
from sklearn.neural_network import MLPRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_diabetes
from sklearn.metrics import r2_score

# 糖尿病数据集走起
data = load_diabetes()
X, y = data.data, data.target

# 标准化是基操
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# PCA灵魂三问:多少主成分够用?
pca = PCA(n_components=0.95)  # 累计贡献率95%刹车
X_pca = pca.fit_transform(X_scaled)
print(f"主成分数从{X.shape[1]}砍到{X_pca.shape[1]},累计贡献率{np.sum(pca.explained_variance_ratio_):.2%}")

# 上菜!BP网络登场
bp = MLPRegressor(hidden_layer_sizes=(64,32), 
                 activation='relu',
                 solver='adam',
                 max_iter=2000,
                 random_state=42)
bp.fit(X_pca, y)

# 效果验货
pred = bp.predict(X_pca)
print(f"R²分数:{r2_score(y, pred):.2f}")

这段代码暗藏几个玄机:PCA的n_components设置成0.95意味着自动保留累计贡献率95%的主成分,比硬编码主成分数更智能。跑起来会发现原数据10个特征被压缩到7个,累计贡献率刚好卡在95.05%这个临界点,既省资源又不失信息。

重点看神经网络结构:

MLPRegressor(hidden_layer_sizes=(64,32), activation='relu')

这里搞了个双隐藏层结构,64-32的节点配置。个人习惯把隐藏层节点数设为主成分数的两倍,然后逐层减半,这个可以灵活调整。用ReLU激活函数主要是避免梯度消失,配合Adam优化器效果拔群。

运行结果R²分数通常能在0.5左右徘徊,对于医学数据来说还算能打。不过要注意这里是在训练集上测试,实际应用记得分训练集和测试集。

遇到特征间相关性强的数据集时,这个组合拳特别管用。PCA先把多重共线性按在地上摩擦,提炼出核心成分后再交给神经网络处理非线性关系,比直接无脑怼原始数据进网络效果稳定得多。

最后说个坑:PCA对异常值敏感,数据预处理时别忘了做标准化。代码里StandardScaler就是干这个的,别手贱跳过这步,不然主成分轴会被某些异常特征带偏,整个模型直接翻车。

需要数据集或者调参技巧的私聊,代码可以直接复制粘贴到Jupyter里跑。下期可能写写怎么用SHAP解释神经网络预测结果,看反馈情况吧~

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐