在数据科学和机器学习领域,特征权重的重要性不言而喻。特征权重不仅可以帮助我们理解哪些变量在模型中最具影响力,还能揭示数据的内在结构和关系。无论是分类、回归还是聚类分析,识别和解释重要特征都至关重要,因为这些特征决定了模型的性能和可解释性。随着数据量和复杂性的增加,如何有效地评估和展示特征的重要性成为了每个数据科学家和机器学习工程师必须面对的挑战。
PCA(主成分分析)可视化分析成为了特征权重分析的重要手段之一。PCA 通过将高维数据降维到较少的主成分空间,能够帮助我们直观地理解和展示特征在数据中的贡献。通过不同的 PCA 可视化方法,我们可以清晰地看到各个特征在主成分中的权重和影响,从而更好地解释数据背后的故事。在这篇文章中,我们将探索五种常用的 PCA 可视化方法,帮助您深入理解特征的重要性及其对主成分的贡献。
接下来,我们将介绍五种 PCA 可视化方法,来分析特征的权重:
-
解释方差图(Explained variance plot)
-
累积解释方差图(Cumulative explained variance plot)
-
二维/三维成分散点图(2D/3D component scatter plot)
-
特征双标图(Attribute biplot)
-
载荷分数图(Loading score plot)
数据集信息
下面PCA可视化特征权重分析使用的是葡萄酒质量数据集。这个数据集可以在 Kaggle 上免费下载:https://www.kaggle.com/datasets/yasserh/wine-quality-dataset
select * from 'WineQT.csv'
先进行标准化,然后进行PCA转换:
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
X = data.drop("quality", axis=1)
y = data["quality"]
X_scaled = StandardScaler().fit_transform(X)
pca = PCA().fit(X_scaled)
pca_res = pca.transform(X_scaled)
pca_res_df = pd.DataFrame(pca_res, columns=[f"PC{i}" for i in range(1, pca_res.shape[1] + 1)])
pca_res_df.head()
解释方差图(Explained variance plot)
数据的总方差中有多少被每个主成分捕捉到了?解释方差图就是答案。通常,前几个主成分覆盖了整体方差的相当一部分。
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 14, 5
plot_y = [val * 100 for val in pca.explained_variance_ratio_]
plot_x = range(1, len(plot_y) + 1)
bars = plt.bar(plot_x, plot_y, align="center", color="#1C3041", edgecolor="#000000", linewidth=1.2)
for bar in bars:
yval = bar.get_height()
plt.text(bar.get_x() + bar.get_width() / 2, yval + 0.001, f"{yval:.1f}%", ha="center", va="bottom")
plt.xlabel("Principal Component")
plt.ylabel("Percentage of Explained Variance")
plt.title("Variance Explained per Principal Component", loc="left", fontdict={"weight": "bold"}, y=1.06)
plt.grid(axis="y")
plt.xticks(plot_x)
plt.show()
通过一个主成分,就能解释数据中 28.7% 的变异性(这些变异性是由 11 个特征共同决定的)。简单来说,这意味着一个主成分能够捕捉到数据中近三分之一的重要信息。
累积解释方差图(Cumulative explained variance plot)
降低数据的维度,但仍然希望保留至少 90% 的方差,应该怎么做?最简单的办法是对第一个图表进行修改,使其显示解释方差的累积和。在代码中,只需逐步累加当前项之前的所有方差值。
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 14, 5
exp_var = [val * 100 for val in pca.explained_variance_ratio_]
plot_y = [sum(exp_var[:i+1]) for i in range(len(exp_var))]
plot_x = range(1, len(plot_y) + 1)
plt.plot(plot_x, plot_y, marker="o", color="#9B1D20")
for x, y in zip(plot_x, plot_y):
plt.text(x, y + 1.5, f"{y:.1f}%", ha="center", va="bottom")
plt.xlabel("Principal Component")
plt.ylabel("Cumulative Percentage of Explained Variance")
plt.title("Cumulative Variance Explained per Principal Component", loc="left", fontdict={"weight": "bold"}, y=1.06)
plt.yticks(range(0, 101, 5))
plt.grid(axis="y")
plt.xticks(plot_x)
plt.show()
因此,如果您希望缩减数据集的维度,同时仍保留至少 90% 的方差,您需要保留前 7 个主成分。
二维/三维成分散点图(2D/3D component scatter plot)
如何可视化高维数据集中记录之间的关系?现实世界中我们无法一次看到超过 3 个维度。您可以查看前 2 或 3 个主成分的散点图。
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 14, 5
total_explained_variance = sum(pca.explained_variance_ratio_[:2]) * 100
colors = ["#1C3041", "#9B1D20", "#0B6E4F", "#895884", "#F07605", "#F5E400"]
pca_2d_df = pd.DataFrame(pca_res[:, :2], columns=["PC1", "PC2"])
pca_2d_df["y"] = data["quality"]
fig, ax = plt.subplots()
for i, target in enumerate(sorted(pca_2d_df["y"].unique())):
subset = pca_2d_df[pca_2d_df["y"] == target]
ax.scatter(x=subset["PC1"], y=subset["PC2"], s=70, alpha=0.7, c=colors[i], edgecolors="#000000", label=target)
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.title(f"Wine Quality Dataset PCA ({total_explained_variance:.2f}% Explained Variance)", loc="left", fontdict={"weight": "bold"}, y=1.06)
ax.legend(title="Wine quality")
plt.show()