机器学习特征工程之特征降维PCA
·
机器学习特征工程之特征降维PCA
人工构造带冗余、噪声的3D数据 → 用PCA降为2D → 验证“降维不丢核心信息”,掌握PCA基础用法和核心逻辑。
二、核心知识点(必记)
-
PCA本质:找数据“方差最大的方向”,将高维数据投影到低维,减少维度、保留核心信息(丢弃冗余和噪声)。
-
方差与信息量:方差越大 → 数据波动越大 → 信息量越多(核心:pc1>pc2>噪声)。
-
关键输入输出:3D特征矩阵(样本数×3)→ PCA降维 → 2D特征矩阵(样本数×2)。
-
核心函数:PCA(n_components=目标维度)、fit_transform(原始数据)(fit学主成分,transform做投影)。
# 1. 导入必备库 import numpy as np # 生成数据、矩阵运算的核心库 import matplotlib.pyplot as plt # 画图(支持3D/2D可视化) from sklearn.decomposition import PCA # 导入PCA降维工具 ''' PCA 降维的经典模板:构造有规律的高维数据 → PCA 降维 → 3D/2D 可视化对比 PCA 通过找 “方差最大的方向”,把高维数据投影到低维,既减少特征数,又保留核心信息; 3D 转 2D 的对比图,一眼看懂 “PCA 降维没丢关键信息” ''' # 2. 设定样本数量:生成1000个样本 n = 1000 # 3.故意构造 “有规律的 3D 数据”,让 PCA 能精准找到主成分 # 3.1 PC1:主成分1,标准正态分布(均值0,标准差1),方差=1 → 信息量最大,是数据的 “核心信息”(比如房价预测里的 “面积”) pc1 = np.random.normal(0, 1, n) # 3.2 PC2:主成分2,正态分布(均值0,标准差0.2),方差=0.04 → 是次要信息(比如 “房间数”) pc2 = np.random.normal(0, 0.2, n) # 3.3 生成噪声:标准差0.1,方差=0.01 → 几乎无信息量,是无用的噪声(比如 “房主年龄”)。 noise = np.random.normal(0, 0.1, n) # 4. 构造3维特征(把主成分和噪声组合成“带冗余/噪声的高维数据”) # Feature1 = PC1 - PC2 → 由核心主成分构成,含有效信息 feature1 = pc1 - pc2 # Feature2 = PC1 + PC2 → 由核心主成分构成,和Feature1高度相关(冗余) feature2 = pc1 + pc2 # Feature3 = PC2 + 噪声 → 含少量有效信息+噪声,信息量最少 feature3 = pc2 + noise # 合并成3维特征矩阵:vstack垂直堆叠后转置,得到 (1000,3)(1000样本,3特征) X = np.vstack([feature1, feature2, feature3]).T # 打印原始数据形状,验证是3维 print(X.shape) # 输出 (1000, 3) # 5. 初始化PCA模型:n_components=2 → 把3维数据降到2维 pca = PCA(n_components=2) # 6. 核心操作:训练PCA+降维 # fit:让PCA学习3维数据的主成分方向(找方差最大的2个方向) # transform:把3维数据投影到这2个主成分方向,得到2维数据 X_pca = pca.fit_transform(X) # 打印降维后形状,验证是2维 print(X_pca.shape) # 输出 (1000, 2) # 7. 可视化:画“降维前3D”和“降维后2D”对比图 # 7.1 创建画布:尺寸12×4,足够放下两个子图 fig = plt.figure(figsize=(12, 4)) # 7.2 第一个子图:降维前的3D散点图 ax1 = fig.add_subplot(121, projection='3d') # 121=1行2列第1个图,projection='3d'启用3D ax1.scatter(X[:, 0], X[:, 1], X[:, 2], c="g") # 画3D散点,c="g"设为绿色 ax1.set_title('Before PCA(3D)') # 标题 ax1.set_xlabel('Feature1') # x轴:原始特征1 ax1.set_ylabel('Feature2') # y轴:原始特征2 ax1.set_zlabel('Feature3') # z轴:原始特征3 # 7.3 第二个子图:降维后的2D散点图 ax2 = fig.add_subplot(122) # 122=1行2列第2个图,默认2D ax2.scatter(X_pca[:, 0], X_pca[:, 1], c="g") # 画2D散点,颜色和3D一致 ax2.set_title('After PCA(2D)') # 标题 ax2.set_xlabel('PC1') # x轴:主成分1(方差最大的方向) ax2.set_ylabel('PC2') # y轴:主成分2(方差次大的方向) # 7.4 显示图表 plt.show()
三、代码流程
1. 导入库(必写)
import numpy as np # 造数据、矩阵运算
import matplotlib.pyplot as plt # 可视化
from sklearn.decomposition import PCA # PCA工具
2. 设定样本与构造核心数据
n = 1000 # 1000个样本
pc1 = np.random.normal(0, 1, n) # 主成分1(方差1,信息量最大)
pc2 = np.random.normal(0, 0.2, n) # 主成分2(方差0.04,次要信息)
noise = np.random.normal(0, 0.1, n) # 噪声(方差0.01,无用)
3. 构造3D原始数据(模拟冗余)
feature1 = pc1 - pc2 # 含核心信息
feature2 = pc1 + pc2 # 与feature1冗余(均含pc1)
feature3 = pc2 + noise # 含少量信息+噪声
X = np.vstack([feature1, feature2, feature3]).T # 形状(1000,3)(样本×特征)
4. PCA降维(核心步骤)
pca = PCA(n_components=2) # 初始化,指定降为2维
X_pca = pca.fit_transform(X) # 训练+降维,输出(1000,2)
5. 可视化对比(验证效果)
核心:左图3D散点(呈长条状),右图2D散点(形状与3D一致),证明降维未丢关键信息。
fig = plt.figure(figsize=(12,4))
# 3D图(1行2列第1个)
ax1 = fig.add_subplot(121, projection='3d')
ax1.scatter(X[:,0], X[:,1], X[:,2], c='g')
# 2D图(1行2列第2个)
ax2 = fig.add_subplot(122)
ax2.scatter(X_pca[:,0], X_pca[:,1], c='g')
plt.show()
四、关键结果与结论(必记)
- 形状变化:(1000,3) → (1000,2),维度减少1个。
- 可视化结论:3D长条 → 2D长条,数据结构不变,证明PCA有效保留核心信息。
- 应用场景:特征冗余、维度过高时(如高维数据可视化、机器学习特征压缩)。
五、易错点提醒
- X的形状必须是(样本数,特征数),需用.T转置(vstack后默认特征在行)。
- n_components指定目标维度,需小于原始特征数。
- fit_transform一步完成训练和降维,无需分开写fit和transform。
更多推荐


所有评论(0)