磨快斧头:在 R 中执行 Principal Component Analysis (PCA) 用于现代机器学习
Source: Dev.to
请提供您希望翻译的完整文本(除代码块和 URL 之外),我将把它翻译成简体中文并保留原有的 Markdown 格式。
“给我六个小时砍倒一棵树,我会把前四个小时用来磨斧头。”
— 亚伯拉罕·林肯
这句话与现代机器学习和数据科学产生了强烈共鸣。在实际项目中,大部分时间并不花在建模上,而是花在 数据预处理、特征工程和降维 上。
最强大且广泛使用的降维技术之一是 主成分分析(PCA)。PCA 帮助我们将高维数据转换为更小、更具信息量的特征空间——通常能提升模型性能、可解释性和计算效率。
在本文中,你将学习:
- PCA 的概念基础
- 如何使用 R 按照现代行业标准实践实现 PCA。
目录
- 用主成分分析解除维度诅咒
- 维度灾难的简明解释
- Shlens 对 PCA 视角的关键洞见
- PCA 的概念背景
- 在 R 中实现 PCA(现代方法)
- 加载并准备 Iris 数据集
- 缩放与标准化
- 协方差矩阵与特征分解
- 使用
prcomp()进行 PCA
- 理解 PCA 输出
- 解释的方差
- 载荷与得分
- 碎石图与双变量图
- 建模工作流中的 PCA(朴素贝叶斯示例)
- 总结与实用要点
用主成分分析解除诅咒
一个在分析领域常见的误区是:
“特征越多、数据越多,模型准确率就会一直提升。”
实际上,这往往是 错误的。当特征数量的增长速度超过观测样本的数量时,模型会出现:
- 不稳定
- 难以泛化
- 易于过拟合
这种现象被称为 维度灾难。主成分分析(PCA)通过在保留大部分信息的前提下降低维度,从而帮助缓解这一问题。
维度灾难简明解释
- 添加更多特征可能会降低模型准确率。
- 随着维度的增加,模型复杂度呈指数增长。
- 基于距离和概率的模型会快速退化。
缓解维度灾难的两种通用方法:
- 收集更多数据——通常成本高昂或不可行。
- 减少特征数量——更可取且实用的方法。
像 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)
主成分分析在建模工作流中的应用(朴素贝叶斯示例)
- 将数据划分为训练集和测试集。
- 对训练集使用
prcomp(),保留前 k 个主成分。 - 使用相同的旋转矩阵对训练集和测试集进行转换。
- 在降维后的训练数据上训练朴素贝叶斯分类器。
- 在测试集上评估模型性能。
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,可提升速度和泛化能力。
通过对数据进行细致的预处理和降维——即为数据“磨刀”,你为构建更可靠、可解释且高效的机器学习模型奠定了基础。