特征工程:分解、量化与二值化技术详解
立即解锁
发布时间: 2025-09-07 01:59:23 阅读量: 11 订阅数: 50 AIGC 


数据清洗的艺术与实践
# 特征工程:分解、量化与二值化技术详解
## 1. 分解技术概述
高维数据集在建模时可能会面临挑战,无论是初始数据收集导致的高维,还是额外合成特征的创建。在这种情况下,使用较少的特征进行计算不仅更易于处理,而且可能具有更好的预测效果。分解是一种特殊的“特征选择”方法,它为特征集的参数空间创建一个新的正交基(新轴)。虽然分解在某种意义上创建了合成特征,但实际上是对数据进行了信息保留且可逆的变换(前提是保持维度数量不变)。其主要目的通常是进行降维,将数据的熵集中在初始维度,减少剩余维度的信息含量,丢弃较高编号的维度对建模指标影响不大,甚至可能有所改善。
常见的分解技术包括主成分分析(PCA)、非负矩阵分解(NMF)、潜在狄利克雷分配(LDA)、独立成分分析(ICA)和 t 分布随机邻域嵌入(t - SNE)等。其中,PCA 是最常见和最古老的分解技术,由 Karl Pearson 在 1901 年首次提出。这些分解技术在 scikit - learn 库中都有提供。
## 2. 旋转与白化
### 2.1 示例数据
以一个仅包含两个特征的数据集为例进行分解。当进行分解时,我们强调“最重要的合成轴”。对于 PCA 而言,其特征的方差会随着每个连续的 PCA 特征而减小。白化和球化是同义词,意味着对这些合成特征进行重新缩放。
```python
from src.whiten import data, show
# Only two initial features for illustration,
# but in general we would have a high dimensionality
show(data, "Parameter space for two features",
"Raw Feature 1", "Raw Feature 2")
```
### 2.2 PCA 变换
这两个特征明显高度相关,且沿大约 45° 对角线的方差大于沿观测轴的方差。PCA 会重新定向数据,使这个方差轴(即最大熵)成为主要成分。
```python
from sklearn.decomposition import PCA
show(PCA().fit_transform(data),
"PCA Components", "Synthetic Axis 1", "Synthetic Axis 2")
```
### 2.3 白化处理
scikit - learn 在 PCA 变换中内置了白化参数,可自动进行缩放,避免变换后再次重新缩放数据,是一种更简洁的方法。白化的概念类似于声学和光谱分析中“白噪声”和“粉红噪声”的区别,非白化的 PCA 会过度强调某个特定轴。
```python
show(PCA(whiten=True).fit_transform(data),
"Whitened Components", "Synthetic Axis 1", "Synthetic Axis 2")
```
## 3. 降维实践
以威斯康星乳腺癌数据集为例,该数据集包含 30 个肿瘤的数值测量,目标是将肿瘤分类为良性或恶性。我们将使用 PCA 进行降维,并观察对模型质量的影响。
### 3.1 数据准备
```python
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
cancer = load_breast_cancer()
X_raw = StandardScaler().fit_transform(cancer.data)
y = cancer.target
```
### 3.2 不同主成分数量的降维
尝试选择 1 个、2 个和 4 个主成分,对原始的 30 个特征进行降维,并在每种情况下进行白化处理以保留维度尺度。
```python
from sklearn.decomposition import PCA
X_pca1 = PCA(n_components=1, whiten=True).fit_transform(X_raw)
X_pca2 = PCA(n_components=2, whiten=True).fit_transform(X_raw)
X_pca4 = PCA(n_components=4, whiten=True).fit_transform(X_raw)
```
### 3.3 模型评估
使用 K 近邻模型评估不同降维后的数据表现。
```python
for X in (X_raw, X_pca1, X_pca2, X_pca4):
X_train, X_test, y_train, y_test = (
train_test_split(X, y, random_state=1))
model = KNeighborsClassifier().fit(X_train, y_train)
accuracy = model.score(X_test, y_test)
error_rate = 100*(1-accuracy)
print(f"Features | {X.shape=}\t| {error_rate=:.2f}%")
```
结果如下:
| 特征矩阵 | 形状 | 错误率 |
| --- | --- | --- |
| X_raw | (569, 30) | 4.90% |
| X_pca1 | (569, 1) | 9.79% |
| X_pca2 | (569, 2) | 6.99% |
| X_pca4 | (569, 4) | 4.20% |
可以看到,使用 4 个主成分时,错误率略低于原始数据,说明分解降维在提取数据主要信息的同时
0
0
复制全文
相关推荐









