数据竞赛EDA(Exploratory Data Analysis)操作总结

文章目录

        • 准备工作
        • 一、可视化数据分布
          • 1.1 箱线图:识别异常值
          • 1.2 直方图:查看数据分布
          • 1.3 Q-Q图:查看数据是否符合正态分布
          • 1.4 KDE分布图:查看特征分布是否一致
          • 1.5 线性回归关系图:分析变量之间的线性关系
        • 二、查看特征变量相关性
          • 2.1 计算相关性系数
          • 2.2 画出相关性热力图
          • 2.3 根据相关系数筛选特征变量
          • 2.4 Box-Cox变换

准备工作

  • 必要包导入
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
  • 读取数据:(本文数据来源:阿里天池学习赛——工业蒸汽量预测)
train_df = pd.read_table('../data/zhengqi_train.txt')
test_df = pd.read_table('../data/zhengqi_test.txt')

一、可视化数据分布

1.1 箱线图:识别异常值

箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况的统计图。
箱线图的绘制方法:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。

箱形图为我们提供了识别异常值的一个标准:异常值被定义为小于Q1-1.5IQR或大于Q3+1.5IQR的值。

fig = plt.figure(figsize=(4, 6))
sns.boxplot(train_df['V0'], orient="v", width=0.5)
1.2 直方图:查看数据分布
sns.distplot(train_df['V0'], fit=stats.norm)
1.3 Q-Q图:查看数据是否符合正态分布

Q-Q图(Q代表分位数)是指数据的分位数和正态分布的分位数对比参照的图,如果数据符合正态分布,则所有的点会落在直线上。

res = stats.probplot(train_df['V0'], plot=plt)
1.4 KDE分布图:查看特征分布是否一致

KDE(Kernel Density Estimation,核密度估计)可以理解为是对直方图的加窗平滑。

通过KDE分布图,对比训练集和测试集中特征变量的分布情况,发现不一致的特征变量。对于在训练集和测试集分布不一致的特征变量会导致模型的泛化能力变差,需要删除此类特征。

plt.figure(figsize=(8,4), dpi=150)
sns.kdeplot(train_df['V0'], color="Red", shade=True)
sns.kdeplot(test_df['V0'], color="Blue", shade=True)
plt.xlabel('V0')
plt.ylabel('Frequency')
plt.legend(["train", "test"])
1.5 线性回归关系图:分析变量之间的线性关系

主要用于分析变量之间的线性关系。

plt.figure(figsize=(8,4), dpi=150)
sns.regplot(x='V0', y='target', data=train_df, scatter_kws={'marker':'.', 's':3, 'alpha':0.3}, line_kws={'color':'k'})

二、查看特征变量相关性

相关性选择主要用于判别线性相关,对于target变量如果存在更复杂的函数形式的影响,则建议使用树模型的特征重要性去选择。

2.1 计算相关性系数
train_corr = train_df,corr()
2.2 画出相关性热力图
plt.figure(figsize=(20,16))
sns.heatmap(train_corr, vmax=.8, square=True, annot=True)
2.3 根据相关系数筛选特征变量
  • 找出与target变量的相关系数大于0.5的特征变量
# 寻找K个与target变量最相关的特征变量
k=10
cols = train_corr.nlargest(k, 'target')['target'].index # nlargest选取target列数值最大的10行
cm = np.corrcoef(train_df[cols].values.T) # 计算皮尔逊积矩相关系数,每行一个变量
fig = plt.figure(figsize=(10,10))
hm = sns.heatmap(train_df[cols].corr(), square=True, annot=True)
  • 找出与target变量的相关系数大于0.5的特征变量
# 找出与target变量的相关系数大于0.5的特征变量
threshold = 0.5
corrmat = train_df.corr()
top_corr_features = corrmat.index[abs(corrmat['target']) > threshold]
fig = plt.figure(figsize=(10,10))
g = sns.heatmap(train_df[top_corr_features].corr(), annot=True, cmap="RdYlGn")
  • 用相关系数阈值移除相关特征
# 用相关系数阈值移除相关特征
threshold = 0.5
corr_matrix = data_df.corr().abs()
drop_col = corr_matrix[corr_matrix['target']<threshold].index
# data_df.drop(drop_col, axis=1, inplace=True)
2.4 Box-Cox变换

Box-Cox变换是统计建模中常用的一种数据转换方法。使用这种变换,可以使线性回归模型在满足线性、正态性、独立性及方差齐性的同时,又不丢失信息。

在做Box-Cox变换之前,需要对数据做归一化预处理。线下分析建模中可以对数据进行合并操作可以使训练数据和测试数据一致,而线上部署只需采用训练数据的归一化即可。

训练数据和测试数据分布一致(一般在数据量大的情况下):可以分开进行归一化处理;
数据量较小会存在分布差异较大的情况,此时在数据分析和线下建模中应该将数据统一归一化。

你可能感兴趣的:(比赛总结,机器学习,python,数据分析,人工智能)