Scikit-learn 中文教程

第二部分:Scikit-learn 核心基础
第 3 章 Scikit-learn 核心设计与 API 体系
第 4 章 数据集模块与数据划分
第三部分:数据预处理与特征工程
第 5 章 数据预处理核心模块(sklearn.preprocessing)
第 6 章 特征工程:提取、选择与构建
第四部分:模型评估与验证
第 7 章 模型评估指标(按任务类型划分)
第 8 章 模型验证与超参数调优
第五部分:Scikit-learn 核心算法模块
第 9 章 有监督学习:分类算法
第 10 章 有监督学习:回归算法
第 11 章 无监督学习:聚类与密度算法
第 12 章 半监督学习与其他常用算法
第八部分:性能优化与问题解决
第 18 章 Scikit-learn 性能优化
第 19 章 Scikit-learn 常见问题与解决方案

12.2 降维与特征提取算法

Scikit-learn降维教程:PCA、因子分析与流形学习详解

Scikit-learn 中文教程

本章节作为Scikit-learn学习教程的一部分,深入讲解降维与特征提取算法,包括主成分分析(PCA)、因子分析和流形学习(t-SNE/UMAP),内容简单易懂,适合新手入门机器学习。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Scikit-learn降维与特征提取算法教程

引言

降维是机器学习中一项重要技术,它通过减少数据的特征维度来简化模型、提升计算效率并帮助可视化高维数据。特征提取则旨在从原始数据中提取有意义的潜在特征。在本章中,我们将使用Scikit-learn库介绍三种核心算法:主成分分析(PCA)、因子分析和流形学习(t-SNE/UMAP)。

主成分分析(PCA)

什么是PCA?

PCA是一种无监督的降维方法,通过线性变换将数据投影到低维空间,同时最大化数据的方差(即信息保留)。它广泛应用于数据压缩、噪声去除和可视化。

工作原理

  1. 标准化数据:确保每个特征均值为0、方差为1。
  2. 计算协方差矩阵:衡量特征间的相关性。
  3. 特征值分解:找出主成分(特征向量),这些成分按方差大小排序。
  4. 选择主成分:保留前k个主成分以降低维度。

Scikit-learn实现

在Scikit-learn中,PCA通过sklearn.decomposition.PCA类实现。以下是一个简单示例:

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 应用PCA,降至2维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 可视化结果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y)
plt.xlabel('主成分1')
plt.ylabel('主成分2')
plt.title('PCA降维可视化')
plt.show()

优点与适用场景

  • 优点:计算简单、速度快,适合大规模数据。
  • 适用场景:数据线性可分、需要快速降维时。

因子分析(Factor Analysis)

什么是因子分析?

因子分析是一种无监督方法,用于提取数据中的潜在因子(latent factors)。与PCA类似,但它假设数据是由一些潜在变量(因子)生成的,常用于社会科学和心理学领域。

与PCA的区别

  • PCA聚焦于方差最大化,而因子分析聚焦于解释变量间的协方差结构。
  • PCA是确定性方法,因子分析基于概率模型(如高斯分布)。

Scikit-learn实现

因子分析在Scikit-learn中通过sklearn.decomposition.FactorAnalysis类实现。示例代码如下:

from sklearn.decomposition import FactorAnalysis
from sklearn.datasets import load_digits
from sklearn.preprocessing import StandardScaler

# 加载数据
digits = load_digits()
X = digits.data

# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 应用因子分析,提取2个因子
fa = FactorAnalysis(n_components=2)
X_fa = fa.fit_transform(X_scaled)

print("因子分析后的维度:", X_fa.shape)

优点与适用场景

  • 优点:能捕捉变量间的潜在关系。
  • 适用场景:数据具有复杂依赖关系时。

流形学习:t-SNE和UMAP

什么是流形学习?

流形学习是一种非线性降维方法,用于将高维数据映射到低维空间,同时保留数据的内在结构(如局部邻居关系)。它常用于数据可视化和探索性分析。

t-SNE(t-Distributed Stochastic Neighbor Embedding)

t-SNE通过优化数据点在低维空间中的分布,以保持高维数据的相似性。在Scikit-learn中,使用sklearn.manifold.TSNE类。

from sklearn.manifold import TSNE
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 应用t-SNE,降至2维
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)

# 可视化结果
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y)
plt.xlabel('t-SNE维度1')
plt.ylabel('t-SNE维度2')
plt.title('t-SNE降维可视化')
plt.show()

UMAP(Uniform Manifold Approximation and Projection)

UMAP是一种较新的流形学习方法,比t-SNE更快且能更好地保留全局结构。Scikit-learn本身不包含UMAP,但可以通过安装umap-learn库来使用。示例代码如下(假设已安装):

# 安装umap-learn: pip install umap-learn
import umap
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 应用UMAP,降至2维
umap_model = umap.UMAP(n_components=2, random_state=42)
X_umap = umap_model.fit_transform(X)

# 可视化结果
plt.scatter(X_umap[:, 0], X_umap[:, 1], c=y)
plt.xlabel('UMAP维度1')
plt.ylabel('UMAP维度2')
plt.title('UMAP降维可视化')
plt.show()

优点与适用场景

  • t-SNE:适合小数据集的可视化,但计算成本高。
  • UMAP:速度快,适用于大数据集。
  • 适用场景:需要非线性降维和高维数据可视化时。

总结与比较

算法 类型 主要应用 优点 缺点
PCA 线性、无监督 数据压缩、去噪 计算高效 假设数据线性关系
因子分析 线性、无监督 潜在因子提取 解释变量间关系 模型假设严格
t-SNE 非线性、无监督 高维数据可视化 保留局部结构 计算慢,参数敏感
UMAP 非线性、无监督 大数据可视化 速度快,全局结构好 Scikit-learn不内置

实践建议

  • 对于简单线性降维,使用PCA。
  • 如果数据有潜在因子,尝试因子分析。
  • 当需要可视化复杂数据时,选择t-SNE或UMAP。

通过本章学习,您应该能掌握Scikit-learn中降维算法的基本用法。继续实践以加深理解!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包