使用可视化理解数据
ML - 使用可视化理解数据
Section titled “ML - 使用可视化理解数据”在上一章中,我们讨论了通过[统计分析 (statistical analysis)]理解数据对[机器学习算法 (Machine Learning algorithms)]的重要性。另一种强大的方法是[数据可视化 (Data Visualization)],它帮助我们直观地洞察数据的结构和关系。
数据可视化使我们能够“看到”数据,理解[分布 (distributions)],识别[特征 (features)]之间的[相关性 (correlations)],并快速评估[输入特征 (input features)]与[目标变量 (target variable)]之间的潜在关系。[有效可视化 (Effective visualization)]对于[探索性数据分析 (Exploratory Data Analysis - EDA)]至关重要。我们将探索几种用于可视化 ML 数据的 Python 技术。
单变量图:独立理解特征
Section titled “单变量图:独立理解特征”最简单的可视化形式侧重于单个变量,称为[单变量可视化 (univariate visualization)]。这有助于我们独立理解数据集中每个[特征 (feature)]的特性和分布。关键技术包括:
[直方图 (Histograms)]非常适用于快速理解[数值特征 (numerical feature)]的分布。它们将数据分组到[数据区间 (bins)]中,并显示每个数据区间中观测值的[频率 (frequency)]。
- 显示预定义数据区间中观测值的计数。
- 有助于可视化底层的[频率分布 (frequency distribution)](例如,[高斯分布 (Gaussian)]、[偏斜分布 (skewed)]、[均匀分布 (uniform)]、[指数分布 (exponential)])。
- 可以帮助识别潜在的[离群点 (outliers)]或异常的数据集中。
此 Python [脚本 (script)]演示了如何使用 Pandas 和 Matplotlib 在 Pima 印第安人糖尿病数据集 (Pima Indians Diabetes dataset) 中为每个[特征 (feature)]创建[直方图 (histograms)]。我们还介绍了 Seaborn,这是一个构建在 Matplotlib 之上的库,提供增强的可视化功能。
import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns
# 定义数据集的路径# 最佳实践是使用相对路径或环境变量# 示例占位符:# path = 'path/to/your/pima-indians-diabetes.csv'path = 'pima-indians-diabetes.csv' # 替换为你的实际路径
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']data = pd.read_csv(path, names=names)
# 使用 Pandas 内置的直方图函数print("Generating histograms using Pandas...")data.hist(figsize=(10, 8))plt.tight_layout() # 调整布局以防止标题重叠plt.show()
# 使用 Seaborn 的示例,可能提供更好的美观性(可选)print("\nGenerating histogram for 'age' using Seaborn...")sns.histplot(data=data, x='age', kde=True) # kde 添加一条密度曲线plt.title('Distribution of Age')plt.show()解释输出结果
Section titled “解释输出结果”执行脚本将显示数据集中每个[数值特征 (numerical feature)]的[直方图 (histograms)]。观察其形状:‘age’、‘pedi’ 和 ‘test’ 可能显示出[右偏斜 (right-skewed)](类似指数分布)的分布,而 ‘mass’ 和 ‘plas’ 可能看起来更接近[正态分布 (normal)]([高斯分布 (Gaussian)])。‘pres’ 可能在某个特定值附近有一个峰值。这种初步观察指导了进一步的分析和[特征工程 (feature engineering)]。
密度图 (核密度估计 - KDE)
Section titled “密度图 (核密度估计 - KDE)”[密度图 (Density plots)]提供了[特征 (feature)]分布的平滑表示。它们类似于平滑的[直方图 (histograms)],通过[核密度估计 (kernel density estimate)]生成,显示[概率密度函数 (probability density function)]。
此脚本使用 Pandas 绘图功能为 Pima 数据集[特征 (features)]生成[密度图 (density plots)]。
import pandas as pdimport matplotlib.pyplot as plt
# 定义数据集的路径path = 'pima-indians-diabetes.csv' # 替换为你的实际路径
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']data = pd.read_csv(path, names=names)
# 为每个特征生成密度图# `subplots=True` 为每列创建单独的图# `layout` 以网格形式排列子图# `sharex=False` 允许每个图拥有自己的 x 轴刻度print("Generating density plots using Pandas...")data.plot(kind='density', subplots=True, layout=(3, 3), sharex=False, figsize=(10, 8))plt.tight_layout()plt.show()解释输出结果
Section titled “解释输出结果”输出显示了代表每个[特征 (feature)]分布的平滑曲线。将其与[直方图 (histograms)]进行比较,可以提供数据形状的补充视图,可能会比单独的直方图更清晰地突出显示[偏斜 (skewness)]或[多峰性 (multimodality)]。
[箱线图 (Box plots)](或[箱须图 (box-and-whisker plots)])通过五个关键统计量有效地总结了[数值特征 (numerical feature)]的分布:[最小值 (minimum)]、[第一四分位数 (first quartile)](25百分位数)、[中位数 (median)](50百分位数)、[第三四分位数 (third quartile)](75百分位数)和[最大值 (maximum)]。它们对于识别[偏斜 (skewness)]和潜在的[离群点 (outliers)]特别有用。
- 总结分布:[中位数 (median)](箱内的线)、[四分位距 (interquartile range - IQR)](箱本身)和[范围 (range)]([须线 (whiskers)])。
- 箱代表数据的中间 50%([四分位距 (IQR)] = Q3 - Q1)。
- [须线 (Whiskers)]通常延伸到距离箱边缘 1.5 倍[四分位距 (IQR)]的范围内,如果数据点在该范围内,则延伸到数据极值。
- 须线之外的点通常被标记为潜在的[离群点 (outliers)]。
此脚本为 Pima 数据集[特征 (features)]生成[箱线图 (box plots)]。
import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns
# 定义数据集的路径path = 'pima-indians-diabetes.csv' # 替换为你的实际路径
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']data = pd.read_csv(path, names=names)
# 使用 Pandas 内置的箱线图函数print("Generating box plots using Pandas...")data.plot(kind='box', subplots=True, layout=(3, 3), sharex=False, sharey=False, figsize=(10, 8))plt.tight_layout()plt.show()
# 使用 Seaborn 的示例,可能看起来更清晰(在同一轴上绘制所有图)print("\nGenerating box plots using Seaborn...")plt.figure(figsize=(12, 6))sns.boxplot(data=data.drop('class', axis=1)) # 在此视图中排除 class 标签plt.title('Box Plot of Features (excluding class)')plt.xticks(rotation=45)plt.show()解释输出结果
Section titled “解释输出结果”[箱线图 (Box plots)]揭示了每个[特征 (feature)]的[分散程度 (spread)]和[中心趋势 (central tendency)]。观察[中位数 (median)]线在箱内的位置(指示[对称性 (symmetry)]或[偏斜 (skewness)])以及须线之外点的存在(潜在[离群点 (outliers)])。例如,‘test’、‘pedi’、‘skin’ 和 ‘age’ 可能显示出几个潜在的离群点和偏斜。
多变量图:多个变量之间的交互
Section titled “多变量图:多个变量之间的交互”[多变量可视化 (Multivariate visualization)]有助于理解两个或多个[特征 (features)]之间的关系。这对于[特征选择 (feature selection)]和理解复杂的交互至关重要。
[相关性 (Correlation)]衡量两个变量之间的[线性关系 (linear relationship)](例如,使用[皮尔逊相关系数 (Pearson’s correlation coefficient)])。[相关矩阵 (correlation matrix)]通常使用[热力图 (heatmap)]可视化数据集中所有[数值特征 (numerical features)]的成对相关性。
此脚本计算 Pima 数据集的[相关矩阵 (correlation matrix)],并使用 Matplotlib 和 Seaborn 将其绘制成[热力图 (heatmap)]。
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns
# 定义数据集的路径path = 'pima-indians-diabetes.csv' # 替换为你的实际路径
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']data = pd.read_csv(path, names=names)
# 计算相关矩阵correlations = data.corr()
# 使用 Seaborn 绘制热力图print("Generating correlation matrix heatmap...")plt.figure(figsize=(10, 8))sns.heatmap(correlations, annot=True, cmap='coolwarm', fmt='.2f')# annot=True 显示相关性数值# cmap 设置颜色方案# fmt='.2f' 将数字格式化为两位小数plt.title('Correlation Matrix of Pima Diabetes Features')plt.show()
# 可选:原始 Matplotlib matshow 方法(视觉信息较少)# print("\n使用 Matplotlib matshow 生成相关矩阵(替代方法)...")# fig = plt.figure(figsize=(10, 8))# ax = fig.add_subplot(111)# cax = ax.matshow(correlations, vmin=-1, vmax=1, cmap='coolwarm')# fig.colorbar(cax)# ticks = np.arange(0, len(names), 1)# ax.set_xticks(ticks)# ax.set_yticks(ticks)# ax.set_xticklabels(names, rotation=45, ha='left')# ax.set_yticklabels(names)# plt.title('Correlation Matrix (matshow)')# plt.tight_layout()# plt.show()解释输出结果
Section titled “解释输出结果”[热力图 (heatmap)]显示了所有[特征 (features)]对之间的[相关系数 (correlation coefficients)]。颜色指示强度和方向:暖色(例如,红色)通常表示[正相关 (positive correlations)],而冷色(例如,蓝色)表示[负相关 (negative correlations)]。接近 +1 或 -1 的值表示强[线性关系 (linear relationships)],而接近 0 的值表示弱[线性关系 (linear relationships)]。寻找[输入特征 (input features)]之间(潜在[多重共线性 (multicollinearity)])以及[特征 (features)]与[目标变量 (target variable)](‘class’)之间的强相关性。
[散点图矩阵 (A scatter plot matrix)](或[对图 (pair plot)])显示数据集中所有[特征 (features)]的成对[散点图 (scatter plots)]。它非常适合可视化变量对之间的关系,并识别潜在的[模式 (patterns)]或[聚类 (clusters)]。
此脚本使用 Pandas 绘图和 Seaborn(推荐)为 Pima 数据集生成[散点图矩阵 (scatter plot matrix)]。
import pandas as pdimport matplotlib.pyplot as pltfrom pandas.plotting import scatter_matrix # Updated importimport seaborn as sns
# 定义数据集的路径path = 'pima-indians-diabetes.csv' # 替换为你的实际路径
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']data = pd.read_csv(path, names=names)
# 使用 Pandas scatter_matrix(较旧的样式)# print("使用 Pandas scatter_matrix 生成散点图矩阵...")# scatter_matrix(data, figsize=(12, 12))# plt.suptitle('Scatter Plot Matrix (Pandas)', y=1.02) # 调整标题位置# plt.tight_layout()# plt.show()
# 使用 Seaborn pairplot(更现代、信息更丰富)print("\n使用 Seaborn pairplot 生成对图...")sns.pairplot(data, hue='class') # 根据 'class' 标签为点着色plt.suptitle('Pair Plot of Pima Diabetes Features (colored by class)', y=1.02)plt.show()解释输出结果
Section titled “解释输出结果”输出显示一个图网格。对角线通常包含每个[特征 (feature)]的[直方图 (histograms)]或[密度图 (density plots)](如在[单变量分析 (univariate analysis)]中看到)。非对角线图是[散点图 (scatter plots)],显示成对[特征 (features)]之间的关系。在 Seaborn 中使用 hue='class' 会根据[目标变量 (target variable)]为点着色,有助于查看特征是否能很好地分离[类别 (classes)]。在[散点图 (scatter plots)]中寻找[线性关系 (linear relationships)]、[聚类 (clusters)]或其他[模式 (patterns)]。
更多资源:
- Matplotlib 文档:https://matplotlib.org/stable/contents.html
- Seaborn 文档:https://seaborn.pydata.org/api.html
- Pandas 可视化:https://pandas.pydata.org/docs/user_guide/visualization.html