重生之从零开始的神经网络算法学习之路——第四篇 究极深入Scikit-learn(降维技术与主成分分析)
朱元璋在巩固明朝统治后,面对繁杂的州县信息,需要提炼关键要素,去芜存菁,以高效管理国家。而今重生后的你,在掌握了聚类分析后,正面临着机器学习中另一个重要挑战——高维数据处理与降维技术。
前情回顾
在第三篇中,你成功使用K均值算法对顾客数据进行分群,掌握了无监督学习的基本方法。此刻,你站在新的起点上,准备探索机器学习中另一重要技术——降维分析,特别是主成分分析(PCA)。
降维技术:从高维到低维的信息提炼
与聚类分析不同,降维技术的目标是减少特征数量同时保留最重要的信息。就像当年朱元璋需要从繁杂的地方奏章中提炼关键情报,而不是简单地分类整理。PCA通过线性变换将原始高维数据投影到低维空间,新特征是原始特征的线性组合。
为何选择PCA和葡萄酒数据集?
PCA是最经典且广泛使用的降维技术之一,它通过方差最大化原则找到数据中最重要的方向。葡萄酒数据集包含了13个化学特征,但并非所有特征都对分类同等重要,非常适合展示降维技术的价值。
实验四:主成分分析(PCA)降维与可视化
1. 环境准备
确保已安装必要的库:
pip install scikit-learn matplotlib numpy pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 代码实现
代码可以直接拉取,远程仓库代码地址:https://gitee.com/cmx1998/Scikit-Learning.git
- 具体文件为Scikit-learn-4.py
3. 代码解析
这段代码实现了以下功能:
- 数据加载:加载Scikit-learn内置的葡萄酒数据集
- 数据标准化:使用StandardScaler对特征进行标准化
- PCA降维:应用PCA进行降维,通过方差解释率确定最佳主成分数量
- 可视化分析:绘制方差解释率曲线和累积方差解释率曲线
- 降维可视化:使用前两个主成分绘制数据散点图
- 性能比较:比较降维前后不同分类器的性能差异
- 3D可视化:(可选)使用3D可视化展示前三个主成分的数据分布
- 导入所需模块
from sklearn.datasets import load_wine
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import os
- 1、加载葡萄酒数据集
wine = load_wine()
X = wine.data
y = wine.target
class_names = wine.target_names
feature_names = wine.feature_names
- 2、数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
- 3、应用PCA进行降维
# 首先拟合所有主成分以查看方差解释率
pca_full = PCA()
X_pca_full = pca_full.fit_transform(X_scaled)
# 确定保留多少主成分能解释95%的方差
cumulative_variance = np.cumsum(pca_full.explained_variance_ratio_)
n_components_95 = np.argmax(cumulative_variance >= 0.95) + 1
# 使用最佳主成分数量重新拟合PCA
pca = PCA(n_components=n_components_95)
X_pca = pca.fit_transform(X_scaled)
- 4、可视化方差解释率
plt.figure(figsize=(12, 5))
# 方差解释率条形图
plt.subplot(1, 2, 1)
components = range(1, len(pca_full.explained_variance_ratio_) + 1)
plt.bar(components, pca_full.explained_variance_ratio_, alpha=0.7, color='skyblue')
# 累积方差解释率曲线
plt.subplot(1, 2, 2)
plt.plot(components, cumulative_variance, 'ro-', label='累积方差解释率')
plt.axhline(y=0.95, color='green', linestyle='--', alpha=0.7, label='95%方差阈值')
plt.axvline(x=n_components_95, color='red', linestyle='--', alpha=0.7, label=f'最佳主成分数: {n_components_95}')
- 5、使用前两个主成分绘制数据散点图
plt.figure(figsize=(10, 8))
colors = ['red', 'blue', 'green']
for i, class_name in enumerate(class_names):
plt.scatter(
X_pca_full[y == i, 0],
X_pca_full[y == i, 1],
alpha=0.7,
c=colors[i],
label=class_name,
s=50
)
- 6、比较降维前后分类器性能
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X_scaled, y, test_size=0.3, random_state=42
)
# 使用原始数据训练模型
svm_original = SVC(random_state=42)
rf_original = RandomForestClassifier(random_state=42)
# 使用PCA降维后的数据
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
svm_pca = SVC(random_state=42)
rf_pca = RandomForestClassifier(random_state=42)
# 比较性能
4. 实际运行结果
运行代码后,实际输出如下:
============================================================
实验四:主成分分析(PCA)降维与可视化
============================================================
1. 加载葡萄酒数据集...
数据集形状: (178, 13)
目标类别: ['class_0' 'class_1' 'class_2']
特征数量: 13
特征名称 (中英文对照):
1. 酒精 (alcohol)
2. 苹果酸 (malic_acid)
3. 灰分 (ash)
4. 灰分碱度 (alcalinity_of_ash)
5. 镁 (magnesium)
6. 总酚 (total_phenols)
7. 黄酮类 (flavanoids)
8. 非黄酮类酚 (nonflavanoid_phenols)
9. 原花青素 (proanthocyanins)
10. 颜色强度 (color_intensity)
11. 色调 (hue)
12. 稀释葡萄酒的OD280/OD315比值 (od280/od315_of_diluted_wines)
13. 脯氨酸 (proline)
数据集前5行:
酒精 (alcohol) 苹果酸 (malic_acid) 灰分 (ash) 灰分碱度 (alcalinity_of_ash) 镁 (magnesium) ... 色调 (hue) 稀释葡萄酒的OD280/OD315比值 (od280/od315_of_diluted_wines) 脯氨酸 (proline) target class
0 14.23 1.71 2.43 15.6 127.0 ... 1.04 3.92 1065.0 0 class_0
1 13.20 1.78 2.14 11.2 100.0 ... 1.05 3.40 1050.0 0 class_0
2 13.16 2.36 2.67 18.6 101.0 ... 1.03 3.17 1185.0 0 class_0
3 14.37 1.95 2.50 16.8 113.0 ... 0.86 3.45 1480.0 0 class_0
4 13.24 2.59 2.87 21.0 118.0 ... 1.04 2.93 735.0 0 class_0
[5 rows x 15 columns]
2. 数据标准化...
数据标准化完成!
3. 应用PCA进行降维...
保留 10 个主成分可解释 95% 的方差
降维后数据形状: (178, 10)
4. 可视化方差解释率...
方差解释率图已保存为 'Scikit-Learning/img\pca_variance_explained.png'
5. 使用前两个主成分绘制数据散点图...
2D散点图已保存为 'Scikit-Learning/img\pca_2d_scatter.png'
6. 比较降维前后分类器性能...
原始数据性能 (5折交叉验证):
SVM 平均准确率: 0.9677 (±0.0300)
随机森林 平均准确率: 0.9680 (±0.0299)
PCA降维后数据性能 (保留10个主成分):
SVM 平均准确率: 0.9677 (±0.0300)
随机森林 平均准确率: 0.9593 (±0.0264)
测试集性能:
SVM 原始数据准确率: 0.9815
SVM PCA降维后准确率: 0.9815
随机森林 原始数据准确率: 1.0000
随机森林 PCA降维后准确率: 0.9630
7. 使用3D可视化展示前三个主成分的数据分布...
3D散点图已保存为 'Scikit-Learning/img\pca_3d_scatter.png'
主成分与原始特征的关系 (前5个主成分):
酒精 (alcohol) 苹果酸 (malic_acid) 灰分 (ash) 灰分碱度 (alcalinity_of_ash) 镁 (magnesium) ... 原花青素 (proanthocyanins) 颜色强度 (color_intensity) 色调 (hue) 稀释葡萄酒的OD280/OD315比值 (od280/od315_of_diluted_wines) 脯氨酸 (proline)
PC1 0.144329 -0.245188 -0.002051 -0.239320 0.141992 ... 0.313429 -0.088617 0.296715 0.376167 0.286752
PC2 0.483652 0.224931 0.316069 -0.010591 0.299634 ... 0.039302 0.529996 -0.279235 -0.164496 0.364903
PC3 -0.207383 0.089013 0.626224 0.612080 0.130757 ... 0.149454 -0.137306 0.085222 0.166005 -0.126746
PC4 -0.017856 0.536890 -0.214176 0.060859 -0.351797 ... 0.399057 0.065926 -0.427771 0.184121 -0.232071
PC5 -0.265664 0.035214 -0.143025 0.066103 0.727049 ... 0.136860 -0.076437 -0.173615 -0.101161 -0.157869
[5 rows x 13 columns]
PCA分析完成!
============================================================
实验四顺利完成!
============================================================
同时,程序还会生成方差解释率图、2D散点图和3D散点图的可视化结果。
深入理解
1. PCA算法原理
主成分分析是一种通过正交变换将一组可能相关的变量转换为一组线性不相关变量的统计方法。这些新变量称为主成分,按照方差大小从高到低排列。算法的核心步骤包括:
- 数据标准化:使每个特征均值为0,方差为1
- 计算协方差矩阵:衡量不同特征之间的相关性
- 计算特征值和特征向量:找到数据变化最大的方向
- 选择主成分:根据特征值大小选择最重要的k个成分
- 投影数据:将原始数据投影到选定的主成分上
2. 评估指标解读
-
方差解释率:每个主成分能够解释的原始数据方差比例。第一个主成分解释的方差最大,后续主成分依次递减。
-
累积方差解释率:前k个主成分累计解释的方差比例。通常选择累积解释率达到95%的主成分数量。
结果分析:从运行结果可以看出,前10个主成分可以解释95%的方差,将特征数量从13个减少到10个,实现了降维目标。
3. 降维效果分析
通过比较降维前后的分类器性能,我们发现:
-
SVM性能保持:降维后的数据在SVM上的分类准确率与原始数据完全一致,说明PCA成功保留了SVM分类所需的最重要信息。
-
随机森林性能变化:随机森林在降维后性能略有下降(从1.0000降至0.9630),这可能是因为随机森林本身能够处理高维数据,降维过程中丢失了一些对随机森林重要的特征交互信息。
-
计算效率提升:特征数量从13个减少到10个,降低了后续模型训练的计算复杂度,特别是对于计算复杂度高的算法。
-
可视化优势:通过2D和3D散点图,我们可以直观地看到不同类别葡萄酒在主成分空间中的分布情况,发现数据的内在结构。
4. 主成分解释
通过分析主成分与原始特征的关系,我们可以理解每个主成分代表的实际意义:
- PC1:正相关于酒精含量、黄酮类和脯氨酸,负相关于苹果酸含量→可能代表葡萄酒的"成熟度"或"醇厚度"
- PC2:正相关于年收入和颜色强度,负相关于色调→可能代表葡萄酒的"浓郁度"或"色泽"
- PC3:正相关于灰分和灰分碱度,负相关于脯氨酸→可能代表葡萄酒的"矿物质感"
- PC4:正相关于苹果酸和非黄酮类酚,负相关于镁和色调→可能代表葡萄酒的"酸度特征"
- PC5:正相关于镁含量,负相关于多个特征→可能代表葡萄酒的"特殊微量元素组成"
这些解释需要结合葡萄酒学专业知识,但PCA为我们提供了理解高维数据内在结构的有力工具。
降维技术:提炼数据本质的艺术
1. 为什么需要降维?
高维数据带来的挑战:
- 维度灾难:随着维度增加,数据变得稀疏,距离概念失效
- 计算复杂度:高维数据需要更多计算资源和存储空间
- 可视化困难:人类难以直观理解超过3维的数据
- 过拟合风险:特征过多容易导致模型过拟合
降维技术通过减少特征数量同时保留最重要信息,解决了这些问题。
2. 降维技术的应用场景
降维分析在各个领域都有广泛应用:
- 图像处理:减少图像特征维度,提高处理效率
- 文本挖掘:从高维词向量空间中提取主题特征
- 生物信息学:处理基因表达数据,识别关键基因
- 推荐系统:降低用户-物品矩阵的维度
3. 降维算法的选择
除了PCA,还有许多其他降维算法:
- 线性判别分析(LDA):有监督的降维方法,考虑类别信息
- t-SNE:非线性降维方法,擅长保持局部结构,适合可视化
- UMAP:较新的非线性降维方法,比t-SNE更快且更好地保持全局结构
- 自动编码器:使用神经网络进行非线性降维
遇到的挑战与解决
在完成这个降维项目的过程中,你遇到了一些新挑战:
- 确定主成分数量:通过方差解释率和累积方差解释率确定了保留95%方差的主成分数量
- 数据标准化:理解了为什么PCA前需要对数据进行标准化(避免量纲影响)
- 结果解释:学会了如何解读主成分与原始特征的关系,赋予主成分实际意义
- 性能评估:通过比较降维前后的分类性能,验证了降维效果
- 可视化技巧:掌握了如何通过2D和3D散点图展示降维结果
结语
完成了葡萄酒数据降维项目后,你不仅掌握了PCA这一经典降维技术,还深入理解了高维数据处理的基本概念和方法。这就像朱元璋在处理繁杂政务时,学会了提炼关键信息,高效管理国家。
值得注意的是,降维技术是一把双刃剑。虽然可以减少计算复杂度和过拟合风险,但也可能丢失重要信息。PCA作为线性降维方法,在处理非线性关系时可能效果不佳。不同算法对降维的敏感度也不同,如本实验中SVM性能保持不变而随机森林性能略有下降。
这个实验的价值在于让你熟悉降维的基本流程和方法,为处理更复杂的高维数据问题打下基础。实际应用中,需要根据具体问题和算法特性谨慎选择是否使用降维以及使用何种降维技术。
机器学习之路如同精炼提纯,需要从繁杂中提取本质,从高维中发现结构。降维技术的大门已经向你敞开,前方还有更多有趣的特征提取方法等待你去探索。
下集预告:第五篇将带你探索支持向量机(SVM)和核方法,学习如何处理非线性分类问题,掌握这一强大而灵活的机器学习算法。
浙公网安备 33010602011771号