《Python实战进阶》第31集:特征工程:特征选择与降维技术

第31集:特征工程:特征选择与降维技术


摘要

特征工程是机器学习和数据科学中不可或缺的一环,其核心目标是通过选择重要特征和降低维度来提升模型性能并减少计算复杂度。本集聚焦于特征选择与降维技术,涵盖过滤法、包裹法、嵌入法等特征选择方法以及 PCA、t-SNE 和 UMAP 等降维技术。我们将通过实战案例演示如何对高维数据进行降维可视化,并使用递归特征消除(RFE)选择关键特征。


核心概念和知识点

1. 特征选择方法

  • 过滤法:基于统计指标(如相关系数、互信息)选择特征,独立于模型。
  • 包裹法:将模型性能作为评估标准,例如递归特征消除(RFE)。
  • 嵌入法:利用模型内部的特征重要性(如决策树、Lasso 回归)进行选择。

2. 降维技术

  • PCA(主成分分析):线性降维方法,通过最大化方差提取主要成分。
  • t-SNE(t-分布邻域嵌入):非线性降维方法,适合高维数据的可视化。
  • UMAP(统一流形逼近与投影):一种更快且更灵活的非线性降维方法。

3. 缺失值处理与特征编码

  • 缺失值处理:填充均值/中位数、插值法或直接删除缺失值。
  • 特征编码:将类别型特征转换为数值型特征(如 One-Hot 编码、Label 编码)。

实战案例

案例 1:对 MNIST 数据集使用 PCA 进行降维并可视化

背景

MNIST 是一个手写数字图像数据集,每个样本是一个 28x28 的灰度图像(784 维)。我们使用 PCA 将数据降维到 2 维以进行可视化。

代码实现
python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 加载 MNIST 数据集
mnist = fetch_openml('mnist_784', version=1, as_frame=False)
X, y = mnist.data, mnist.target.astype(int)

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

# 使用 PCA 降维到 2 维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 可视化降维结果
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='tab10', alpha=0.6)
plt.colorbar(scatter, label='Digit Label')
plt.title("PCA Visualization of MNIST Dataset")
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.show()

# 输出解释方差比例
print(f"Explained Variance Ratio: {pca.explained_variance_ratio_}")
输出结果
复制代码
Explained Variance Ratio: [0.097 0.071]
可视化

案例 2:使用递归特征消除(RFE)选择关键特征

背景

我们使用 Scikit-learn 提供的乳腺癌数据集,通过 RFE 方法选择最重要的特征并训练逻辑回归模型。

代码实现
python 复制代码
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import RFE
from sklearn.metrics import accuracy_score

# 加载数据集
data = load_breast_cancer()
X, y = data.data, data.target

# 数据集划分与标准化
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 使用 RFE 选择特征
model = LogisticRegression(max_iter=10000)
rfe = RFE(estimator=model, n_features_to_select=5)  # 选择 5 个特征
rfe.fit(X_train_scaled, y_train)

# 查看选择的特征
selected_features = np.array(data.feature_names)[rfe.support_]
print(f"Selected Features: {selected_features}")

# 在测试集上评估模型
y_pred = rfe.predict(X_test_scaled)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy with Selected Features: {accuracy:.2f}")
输出结果
复制代码
Selected Features: ['mean radius' 'mean perimeter' 'mean concave points'
                    'worst radius' 'worst perimeter']
Accuracy with Selected Features: 0.96
可视化

我们可以对比原始特征和选择后的特征数量:

python 复制代码
import seaborn as sns

sns.barplot(x=rfe.ranking_, y=data.feature_names)
plt.title("Feature Ranking by RFE")
plt.xlabel("Ranking")
plt.ylabel("Feature Name")
plt.show()

总结

特征工程是提升模型性能的关键步骤,合理的特征选择和降维可以显著降低计算复杂度并提高模型泛化能力。通过本集的学习,我们掌握了如何使用 PCA 对高维数据进行降维可视化,以及如何使用 RFE 方法选择关键特征。


扩展思考

1. 如何结合特征工程优化 AI 大模型的输入?

AI 大模型(如 GPT、BERT)通常需要高质量的输入特征。通过特征工程,我们可以:

  • 对文本数据进行特征提取(如 TF-IDF、词向量)。
  • 对图像数据进行预处理(如标准化、裁剪)。
  • 去除噪声特征,减少冗余信息,从而提高大模型的训练效率。

2. 自动化特征工程工具的应用前景

自动化特征工程工具(如 Featuretools、AutoFeat)能够自动生成候选特征,减少人工干预。未来,这些工具可能与 AI 大模型结合,形成端到端的自动化建模流程,进一步提升开发效率。


专栏链接:Python实战进阶
下期预告:No32 - 并发编程:多线程与异步 I/O 的实战应用

相关推荐
郝学胜-神的一滴4 小时前
深入浅出:使用Linux系统函数构建高性能TCP服务器
linux·服务器·开发语言·网络·c++·tcp/ip·程序人生
承渊政道4 小时前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
JQLvopkk4 小时前
C# 轻量级工业温湿度监控系统(含数据库与源码)
开发语言·数据库·c#
玄同7654 小时前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
czy87874754 小时前
深入了解 C++ 中的 `std::bind` 函数
开发语言·c++
消失的旧时光-19434 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
yq1982043011565 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class5 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
Jinkxs5 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&5 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin