我们如何‘看’数据:为何你的图表会误导以及如何使用 PCA 来修正
发布: (2025年12月30日 GMT+8 02:27)
4 min read
原文: Dev.to
Source: Dev.to
请提供您希望翻译的正文内容,我将为您翻译成简体中文。
常见问题
作为 Python Baires 的导师,我们经常看到刚入门数据科学的人在代码中犯的一个错误:他们痴迷于数据量,而不是信息质量。
他们有一个包含 50 列的数据集,想着:“太好了,我有很多信息”。随后训练一个需要数小时才能运行且精度平平的模型。原因是什么?噪声和高度相关性。
生成示例数据集
import pandas as pd
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import time
import matplotlib.pyplot as plt
import seaborn as sns
# Configuración visual
plt.style.use('dark_background')
# Generamos 30 características, pero solo 5 son realmente informativas
X, y = make_classification(
n_samples=1000,
n_features=30,
n_informative=5,
n_redundant=10, # Muchas redundantes
n_classes=2,
random_state=42
)
# Convertimos a DataFrame para que parezca real
feature_names = [f'metrica_{i}' for i in range(30)]
df = pd.DataFrame(X, columns=feature_names)
df['compra'] = y
print("Dataset generado con 30 columnas (ruido incluido):")
print(df.head())
print(f"\nForma del dataset: {df.shape}")
可视化噪声
# Matriz de correlación (primeras 10 variables)
plt.figure(figsize=(10, 8))
sns.heatmap(df.iloc[:, :10].corr(), annot=False, cmap='coolwarm')
plt.title("Mapa de Calor: Confusión de Variables (Primeras 10)")
plt.show()
注意变量之间相互混杂,导致难以检测出明确的模式。
应用 PCA
# 1. 在 PCA 之前始终进行缩放(基础)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(df.drop('compra', axis=1))
# 2. 将维度降至 2 个主成分以便可视化
pca_visual = PCA(n_components=2)
X_pca_2d = pca_visual.fit_transform(X_scaled)
# 3. 可视化结果
plt.figure(figsize=(8, 6))
plt.scatter(X_pca_2d[:, 0], X_pca_2d[:, 1], c=y, cmap='viridis', alpha=0.6)
plt.xlabel(f"Componente Principal 1 ({pca_visual.explained_variance_ratio_[0]:.2%} varianza)")
plt.ylabel(f"Componente Principal 2 ({pca_visual.explained_variance_ratio_[1]:.2%} varianza)")
plt.title("Datos proyectados en 2D con PCA (Separación visible)")
plt.show()
图表展示了什么
原本在 30 列中难以区分的混乱,现在仅用 2 个“镜头”(主成分)就能清晰分离。
比较模型:有无 PCA
# --- MODELO ORIGINAL (30 features) ---
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# Medición de tiempo
start_time = time.time()
model_full = RandomForestClassifier(n_estimators=100, random_state=42)
model_full.fit(X_train, y_train)
pred_full = model_full.predict(X_test)
time_full = time.time() - start_time
acc_full = accuracy_score(y_test, pred_full)
# --- MODELO PCA (95 % de varianza) ---
pca_optimo = PCA(n_components=0.95) # Conserva el 95 % de la varianza
X_train_pca = pca_optimo.fit_transform(X_train)
X_test_pca = pca_optimo.transform(X_test)
start_time = time.time()
model_pca = RandomForestClassifier(n_estimators=100, random_state=42)
model_pca.fit(X_train_pca, y_train)
pred_pca = model_pca.predict(X_test_pca)
time_pca = time.time() - start_time
acc_pca = accuracy_score(y_test, pred_pca)
print("\n--- RESULTADOS DEL RENDIMIENTO ---")
print(f"Modelo Original (30 cols): Acc: {acc_full:.4f} | Tiempo: {time_full:.4f}s")
print(f"Modelo PCA ({pca_optimo.n_components_:.0f} cols): Acc: {acc_pca:.4f} | Tiempo: {time_pca:.4f}s")
观察
- 时间缩短:使用 PCA 的模型训练和预测更快。
- 精度相当:当保留 95% 方差时,信息损失最小。
何时使用 PCA
- 模型训练时间过长。
- 特征数量多于样本行数。
- 需要在 2D 或 3D 中可视化复杂数据。
注意: PCA 假设线性关系。如果你的数据呈现非线性模式,考虑使用 Autoencoders 或 t‑SNE 等技术,我们在高级课程中也有涉及。
结论
停止盲目应用模型,开始理解数据的数学结构,这就是把 Python 程序员和数据科学家区分开的关键。如果你想学习如何选择正确的预处理技术,掌握可视化并构建招聘方看重的高效流水线,Python Baires 正在等你。
查看完整课程并预定你的名额:
https://www.python-baires.ar/