探索性数据分析(EDA)
在机器学习项目中,探索性数据分析(Exploratory Data Analysis, EDA)扮演着至关重要的角色。它是理解数据、清理数据、选择特征以及最终构建和评估模型的基础。以下是进行机器学习中的EDA时应考虑的几个关键方面:
1. 数据概览与清洗
- 了解数据结构:检查数据集的基本信息,如行数、列数、数据类型等。
- 处理缺失值:识别并决定如何处理缺失数据,可能的选择包括删除含有缺失值的记录、用统计量填充(均值、中位数等)、或者使用更复杂的插补方法。
- 去除重复数据:确保数据集中没有完全相同的记录。
import pandas as pd
# 读取数据集
df = pd.read_csv('your_dataset.csv')
# 查看数据集的前几行
print("数据集前5行:\n", df.head())
# 查看数据集的维度
print("数据集的维度:", df.shape)
# 查看数据集的基本信息,包括每列的数据类型和缺失值
print("数据集的基本信息:")
df.info()
# 查看数据集的统计信息
print("数据集的描述统计信息:\n", df.describe())
# 假设 df 是你的 DataFrame\\
df.dropna(inplace=True) # 示例:删除含有缺失值的记录
df.drop_duplicates(inplace=True) # 删除重复数据
df.mean() 计算每个数值型特征的均值,帮助理解数据的中心趋势。
df.median() 计算中位数,特别适用于非对称分布的数据,能够避免极值对均值的干扰。
df.quantile() 计算分位数,进一步揭示数据的分布特征,25%分位数、50%分位数(即中位数)和75%分位数展示了数据的上下四分位区间。
df.std() 计算标准差,度量数据的离散程度。标准差较大的特征表示其值的波动较大,反之则较为集中。
这些统计特征帮助判断数据的分布情况,例如是否存在明显的偏态分布、离群值,或者某些特征的离散程度是否异常。根据这些信息,可以对数据进行合理的处理,如去除极值、调整分布等。
2. 单变量分析
- 数值型特征:通过直方图、密度图、箱形图等可视化工具来观察分布情况,检测异常值。
- 分类型特征:利用条形图或饼图展示类别频率。
import seaborn as sns
import matplotlib.pyplot as plt
sns.histplot(df['numerical_column'], kde=True) # 数值型特征的直方图加密度图
plt.show()
sns.countplot(x='categorical_column', data=df) # 分类型特征的条形图
plt.show()
# 绘制特征 'Feature2' 的核密度估计(KDE)图
plt.figure(figsize=(8, 6))
sns.kdeplot(df['Feature2'], shade=True)
plt.title("特征 'Feature2' 的核密度估计图")
plt.xlabel('值')
plt.ylabel('概率密度')
plt.show()
3. 双变量或多变量分析
- 相关性分析:计算数值型特征之间的皮尔逊相关系数,并绘制热力图来直观地表示它们之间的关系。
- 散点图矩阵:使用
pairplot
来探索多个特征间的两两关系。 - 分组统计:对于分类问题,可以对目标变量进行分组统计,以了解不同特征在各个类别上的表现差异。
correlation_matrix = df.corr()
sns.heatmap(correlation_matrix, annot=True)
plt.show()
sns.pairplot(df)
plt.show()
# 绘制特征 'Feature2' 的核密度估计(KDE)图
plt.figure(figsize=(8, 6))
sns.kdeplot(df['Feature2'], shade=True)
plt.title("特征 'Feature2' 的核密度估计图")
plt.xlabel('值')
plt.ylabel('概率密度')
plt.show()
4. 特征与目标变量的关系
- 分类问题:可以通过箱形图或小提琴图来比较不同类别下的特征分布。
- 回归问题:绘制散点图加上线性拟合线来探索特征与连续目标变量之间的关系。
sns.boxplot(x='target_column', y='feature_column', data=df) # 分类问题的箱形图
plt.show()
sns.scatterplot(x='feature_column', y='target_column', data=df) # 回归问题的散点图
plt.show()
5. 异常值检测
- 基于Z分数或IQR规则:标记出偏离正常范围的数据点作为潜在的异常值。
- 图形化方法:例如箱形图、散点图等可以帮助直观地发现异常值。
from scipy import stats
z_scores = np.abs(stats.zscore(df.select_dtypes(include=[np.number])))
outliers = (z_scores > 3).any(axis=1)
print(df[outliers]) # 打印异常值
6. 特征工程
- 创建新特征:根据业务逻辑或从现有特征中派生新的特征。
- 转换特征:应用数学变换(如对数、平方根)来改善分布形态或减少偏斜。
- 编码分类变量:将非数值型分类变量转换为数值型表示,比如独热编码(One-Hot Encoding)或标签编码(Label Encoding)。
df['new_feature'] = df['existing_feature'].apply(lambda x: some_function(x))
df = pd.get_dummies(df, columns=['categorical_column']) # 独热编码
EDA的重要性
- 提高模型性能:通过更好的特征选择和工程设计。
- 避免偏差:提前识别并处理可能影响结果的问题。
- 支持决策制定:提供洞察力,辅助选择合适的算法和技术路径。
总结
在机器学习中,EDA不仅是数据清理和初步理解的过程,也是发现数据中隐藏模式和关系的关键。它有助于我们更好地准备数据,从而提高后续建模阶段的成功率。EDA是一个迭代过程,在整个项目周期中可能会多次返回这个步骤,随着对数据理解的加深而不断优化我们的分析方法。