磨快斧头:在 R 中执行 Principal Component Analysis (PCA) 用于现代机器学习

发布: (2026年1月7日 GMT+8 13:44)
8 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的完整文本(除代码块和 URL 之外),我将把它翻译成简体中文并保留原有的 Markdown 格式。

“给我六个小时砍倒一棵树,我会把前四个小时用来磨斧头。”

亚伯拉罕·林肯

这句话与现代机器学习和数据科学产生了强烈共鸣。在实际项目中,大部分时间并不花在建模上,而是花在 数据预处理、特征工程和降维 上。

最强大且广泛使用的降维技术之一是 主成分分析(PCA)。PCA 帮助我们将高维数据转换为更小、更具信息量的特征空间——通常能提升模型性能、可解释性和计算效率。

在本文中,你将学习:

  • PCA 的概念基础
  • 如何使用 R 按照现代行业标准实践实现 PCA。

目录

  1. 用主成分分析解除维度诅咒
  2. 维度灾难的简明解释
  3. Shlens 对 PCA 视角的关键洞见
  4. PCA 的概念背景
  5. 在 R 中实现 PCA(现代方法)
    • 加载并准备 Iris 数据集
    • 缩放与标准化
    • 协方差矩阵与特征分解
    • 使用 prcomp() 进行 PCA
  6. 理解 PCA 输出
    • 解释的方差
    • 载荷与得分
    • 碎石图与双变量图
  7. 建模工作流中的 PCA(朴素贝叶斯示例)
  8. 总结与实用要点

用主成分分析解除诅咒

一个在分析领域常见的误区是:

“特征越多、数据越多,模型准确率就会一直提升。”

实际上,这往往是 错误的。当特征数量的增长速度超过观测样本的数量时,模型会出现:

  • 不稳定
  • 难以泛化
  • 易于过拟合

这种现象被称为 维度灾难。主成分分析(PCA)通过在保留大部分信息的前提下降低维度,从而帮助缓解这一问题。

维度灾难简明解释

  • 添加更多特征可能会降低模型准确率。
  • 随着维度的增加,模型复杂度呈指数增长。
  • 基于距离和概率的模型会快速退化。

缓解维度灾难的两种通用方法:

  1. 收集更多数据——通常成本高昂或不可行。
  2. 减少特征数量——更可取且实用的方法。

像 PCA 这样的降维技术属于第二类。

Shlens对PCA的视角

在他那篇广为人知的论文中,Jonathon Shlens 用一个简单的类比来描述 PCA:观察摆的运动。

  • 如果摆向某个方向运动,但我们不知道那个方向,可能需要多个摄像头(特征)来捕捉它的运动。
  • PCA 通过旋转坐标系,使我们能够用更少、正交的视角捕捉运动。

本质上,PCA:

  • 将相关变量转换为无相关(正交)成分
  • 解释的方差对这些成分进行排序。
  • 只保留最具信息量的成分

PCA的概念背景

假设有一个数据集,包含:

  • m 个观测
  • n 个特征

表示为一个 ( m \times n ) 矩阵 A

PCA 将 A 转换为大小为 ( m \times k )(其中 ( k \le n ))的新矩阵 A′。该转换基于协方差矩阵的特征分解(或奇异值分解)。

# eigen_data$values  -> eigenvalues (variance explained)
# eigen_data$vectors -> eigenvectors (principal axes)

在 R 中实现 PCA(现代方法)

加载并准备 Iris 数据集

data(iris)
df <- iris[, 1:4]   # use only numeric features
head(df)

缩放与标准化

df_scaled <- scale(df)   # zero‑mean, unit‑variance scaling

协方差矩阵与特征分解

cov_mat <- cov(df_scaled)
eigen_data <- eigen(cov_mat)

# eigen_data$values  -> eigenvalues (variance explained)
# eigen_data$vectors -> eigenvectors (principal axes)

使用 prcomp() 执行 PCA

# Why prcomp()?
# • Uses singular value decomposition (SVD)
# • Numerically more stable
# • Works better for high‑dimensional data

pca_res <- prcomp(df_scaled, center = FALSE, scale. = FALSE)
summary(pca_res)

就像磨快斧头一样,投入时间进行特征工程和降维会产生指数级的回报。

我们的使命是 “帮助企业释放数据价值”。 我们开展了许多活动来实现这一目标——帮助您解决棘手问题只是其中之一。二十多年来,我们已与超过 100 家客户合作——从《财富》500 强公司到中型企业——解决复杂的数据分析挑战。

我们的服务包括:

将原始数据转化为战略洞察。

理解 PCA 输出

解释的方差

explained_variance <- pca_res$sdev^2 / sum(pca_res$sdev^2)
explained_variance

载荷和得分

loadings <- pca_res$rotation
scores   <- pca_res$x
head(loadings)
head(scores)

碎石图和双标图

# Scree plot
plot(explained_variance, type = "b", xlab = "Principal Component",
     ylab = "Proportion of Variance Explained")

# Biplot
biplot(pca_res)

主成分分析在建模工作流中的应用(朴素贝叶斯示例)

  1. 将数据划分为训练集和测试集。
  2. 对训练集使用 prcomp(),保留前 k 个主成分。
  3. 使用相同的旋转矩阵对训练集和测试集进行转换。
  4. 在降维后的训练数据上训练朴素贝叶斯分类器。
  5. 在测试集上评估模型性能。
library(e1071)   # for Naïve Bayes
set.seed(123)
train_idx <- sample(seq_len(nrow(df_scaled)), size = 0.7 * nrow(df_scaled))
train_data <- df_scaled[train_idx, ]
test_data  <- df_scaled[-train_idx, ]

pca_train <- prcomp(train_data)
k <- 2   # keep first two PCs
train_pc  <- predict(pca_train, train_data)[, 1:k]
test_pc   <- predict(pca_train, test_data)[, 1:k]

nb_model <- naiveBayes(train_pc, iris$Species[train_idx])
pred    <- predict(nb_model, test_pc)
confusionMatrix <- table(Predicted = pred, Actual = iris$Species[-train_idx])
confusionMatrix

摘要与实用要点

  • PCA 是应对维度灾难的基石技术。
  • 在使用 PCA 之前,对特征进行 缩放 是必不可少的。
  • prcomp()(基于 SVD)是进行稳健 PCA 的首选 R 函数。
  • 检查 解释方差 以决定保留多少主成分。
  • 在建模流程的早期整合 PCA,可提升速度和泛化能力。

通过对数据进行细致的预处理和降维——即为数据“磨刀”,你为构建更可靠、可解释且高效的机器学习模型奠定了基础。

Back to Blog

相关文章

阅读更多 »

使用 AI 代理自动化机器学习

概述 在Kaggle上参加比赛时,你会很快注意到一个模式:Baseline——上传数据,运行CatBoost或LightGBM,得到约为 ½ 的基线指标。

机器学习中的数据泄漏

Data Leakage 在 Machine Learning 中 常常受指导者在 Machine Learning 工作流中犯下基本错误:Exploratory Data Analysis (EDA) → preprocessing…