本文目录导读:

我来详细介绍如何使用Scikit-learn进行特征聚合的Python案例。
特征聚合的常见方法
主成分分析(PCA)
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 创建示例数据
np.random.seed(42)
n_samples = 100
n_features = 10
# 生成具有相关性的特征数据
X = np.random.randn(n_samples, n_features)
# 添加一些相关性
X[:, 5:] = X[:, :5] + np.random.randn(n_samples, 5) * 0.1
# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# PCA特征聚合
pca = PCA(n_components=3) # 聚合到3个主成分
X_pca = pca.fit_transform(X_scaled)
print("原始特征维度:", X_scaled.shape)
print("PCA后特征维度:", X_pca.shape)
print("\n各主成分解释方差比:", pca.explained_variance_ratio_)
print("累计解释方差比:", np.cumsum(pca.explained_variance_ratio_))
# 可视化
plt.figure(figsize=(12, 4))
# 子图1:解释方差
plt.subplot(1, 2, 1)
plt.bar(range(1, 4), pca.explained_variance_ratio_)
plt.plot(range(1, 4), np.cumsum(pca.explained_variance_ratio_), 'ro-')
plt.xlabel('主成分')
plt.ylabel('解释方差比')'PCA解释方差')
# 子图2:特征投影
plt.subplot(1, 2, 2)
plt.scatter(X_pca[:, 0], X_pca[:, 1], alpha=0.6)
plt.xlabel('第一主成分')
plt.ylabel('第二主成分')'PCA特征聚合结果')
plt.tight_layout()
plt.show()
线性判别分析(LDA)
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# 创建带标签的数据
y = np.random.randint(0, 3, n_samples) # 3个类别
# LDA特征聚合
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X_scaled, y)
print("原始特征维度:", X_scaled.shape)
print("LDA后特征维度:", X_lda.shape)
print("\nLDA特征重要性:", lda.explained_variance_ratio_)
# 可视化LDA结果
plt.figure(figsize=(10, 5))
# 子图1:LDA投影
plt.subplot(1, 2, 1)
for i in range(3):
mask = y == i
plt.scatter(X_lda[mask, 0], X_lda[mask, 1],
label=f'类别{i}', alpha=0.6)
plt.xlabel('LD1')
plt.ylabel('LD2')'LDA特征聚合结果')
plt.legend()
# 子图2:与PCA对比
plt.subplot(1, 2, 2)
for i in range(3):
mask = y == i
plt.scatter(X_pca[mask, 0], X_pca[mask, 1],
label=f'类别{i}', alpha=0.6)
plt.xlabel('PC1')
plt.ylabel('PC2')'PCA结果(对比)')
plt.legend()
plt.tight_layout()
plt.show()
特征聚类聚合
from sklearn.cluster import FeatureAgglomeration
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_classif
# 特征聚合聚类
feature_agg = FeatureAgglomeration(n_clusters=4) # 聚合到4个簇
X_agg = feature_agg.fit_transform(X_scaled)
print("特征聚合聚类:")
print("原始特征维度:", X_scaled.shape)
print("聚合后特征维度:", X_agg.shape)
print("特征簇标签:", feature_agg.labels_)
# 使用SelectKBest选择特征
selector = SelectKBest(score_func=f_classif, k=5)
X_selected = selector.fit_transform(X_scaled, y)
print("\n特征选择:")
print("原始特征维度:", X_scaled.shape)
print("选择后特征维度:", X_selected.shape)
print("选择的特征索引:", selector.get_support(indices=True))
print("特征评分:", selector.scores_)
综合案例 - 特征聚合流程
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
# 创建一个完整的特征聚合流程
def feature_aggregation_pipeline(X, y):
"""
完整的特征聚合流程
"""
results = {}
# 1. 原始数据
print("="*50)
print("特征聚合完整流程")
print("="*50)
# 2. PCA聚合
pca_pipeline = Pipeline([
('scaler', StandardScaler()),
('pca', PCA(n_components=0.95)) # 保留95%方差
])
X_pca = pca_pipeline.fit_transform(X)
print(f"\nPCA聚合:")
print(f"- 原始特征数: {X.shape[1]}")
print(f"- 聚合后特征数: {X_pca.shape[1]}")
# 3. 性能对比
print("\n分类性能对比(随机森林):")
models = {
'原始特征': X,
'PCA特征': X_pca
}
for name, data in models.items():
if data.shape[1] > 0:
rf = RandomForestClassifier(n_estimators=50, random_state=42)
scores = cross_val_score(rf, data, y, cv=5, scoring='accuracy')
print(f"{name}: {scores.mean():.3f} (+/- {scores.std()*2:.3f})")
return {
'X_original': X,
'X_pca': X_pca,
'pca_pipeline': pca_pipeline
}
# 生成更真实的数据
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=200, n_features=20,
n_informative=10, n_redundant=5,
n_classes=3, random_state=42)
results = feature_aggregation_pipeline(X, y)
特征聚合在图像数据中的应用
from sklearn.decomposition import NMF # 非负矩阵分解
from sklearn.manifold import TSNE
# 生成图像特征数据
n_images = 100
n_pixels = 64 # 8x8的图片
X_images = np.random.rand(n_images, n_pixels)
# 添加一些结构
for i in range(n_images):
X_images[i, i%64] = 1.0
X_images[i, (i+10)%64] = 1.0
print("图像特征聚合示例:")
# NMF聚合
nmf = NMF(n_components=10, random_state=42)
X_nmf = nmf.fit_transform(X_images)
print(f"NMF聚合:")
print(f"- 原始特征数: {X_images.shape[1]}")
print(f"- 聚合后特征数: {X_nmf.shape[1]}")
print(f"- 重构误差: {nmf.reconstruction_err_:.4f}")
# t-SNE可视化
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X_images)
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.imshow(nmf.components_[0].reshape(8, 8), cmap='viridis')
plt.colorbar()'NMF基础组件')
plt.subplot(1, 2, 2)
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=X_images[:, 0],
cmap='coolwarm', alpha=0.6)
plt.colorbar()'t-SNE特征可视化')
plt.tight_layout()
plt.show()
特征聚合的实际应用
class FeatureAggregator:
"""
特征聚合器类
"""
def __init__(self):
self.methods = {}
self.results = {}
def add_method(self, name, method):
"""添加聚合方法"""
self.methods[name] = method
def aggregate(self, X, y=None):
"""执行所有注册的聚合方法"""
for name, method in self.methods.items():
print(f"\n执行聚合方法: {name}")
if y is not None and hasattr(method, 'fit_transform'):
result = method.fit_transform(X, y)
else:
result = method.fit_transform(X)
self.results[name] = result
print(f"- 输出维度: {result.shape}")
return self.results
def compare_performance(self, X, y):
"""比较不同聚合方法的性能"""
from sklearn.neighbors import KNeighborsClassifier
print("\n" + "="*50)
print("不同聚合方法性能比较")
print("="*50)
for name, result in self.results.items():
knn = KNeighborsClassifier(n_neighbors=5)
scores = cross_val_score(knn, result, y, cv=5)
print(f"{name}: 准确率 {scores.mean():.3f} (+/- {scores.std()*2:.3f})")
# 使用示例
aggregator = FeatureAggregator()
# 添加不同的聚合方法
aggregator.add_method('PCA', PCA(n_components=0.9))
aggregator.add_method('LDA', LinearDiscriminantAnalysis(n_components=2))
aggregator.add_method('SelectKBest', SelectKBest(k=5))
# 执行聚合
results = aggregator.aggregate(X, y)
# 比较性能
aggregator.compare_performance(X, y)
最佳实践建议
def feature_aggregation_best_practices():
"""
特征聚合的最佳实践
"""
tips = """
特征聚合最佳实践:
1. **选择合适的方法**
- PCA:无监督,适合去除冗余特征
- LDA:有监督,适合分类任务
- 特征聚类:适合高维稀疏数据
2. **预处理重要**
- 标准化/归一化(PCA和LDA需要)
- 处理缺失值
- 处理异常值
3. **确定聚合数量**
- 使用肘部法则(PCA)
- 使用交叉验证
- 保留足够的信息(80-95%方差)
4. **验证效果**
- 保持原始特征作为baseline
- 使用多种评估指标
- 检查过拟合风险
5. **常见陷阱**
- 信息丢失过多
- 可解释性降低
- 计算成本增加
"""
print(tips)
feature_aggregation_best_practices()
这些案例涵盖了Scikit-learn中常用的特征聚合方法,包括PCA、LDA、特征聚类等,以及它们在实际应用中的完整流程,选择合适的特征聚合方法可以有效降低维数、减少计算开销,同时保持模型的性能。