我们如何‘看’数据:为何你的图表会误导以及如何使用 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 假设线性关系。如果你的数据呈现非线性模式,考虑使用 Autoencoderst‑SNE 等技术,我们在高级课程中也有涉及。

结论

停止盲目应用模型,开始理解数据的数学结构,这就是把 Python 程序员和数据科学家区分开的关键。如果你想学习如何选择正确的预处理技术,掌握可视化并构建招聘方看重的高效流水线,Python Baires 正在等你。

查看完整课程并预定你的名额:
https://www.python-baires.ar/

Back to Blog

相关文章

阅读更多 »

第39天提升我的数据科学技能

反思:在数据工作中,一种让许多人感到沮丧却鲜少人提及的沉默斗争:“我学到了很多……但一切都显得支离破碎。” 今天……

第35天提升我的Data Science技能

最近,我注意到我的学习方式有些变化。我不再仅仅因为某件事能运行而感到兴奋。我更感兴趣的是它为什么能工作,以及会出现什么问题……