机器学习特征工程之特征降维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。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐