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')
箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况的统计图。
箱线图的绘制方法:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。
箱形图为我们提供了识别异常值的一个标准:异常值被定义为小于Q1-1.5IQR或大于Q3+1.5IQR的值。
fig = plt.figure(figsize=(4, 6))
sns.boxplot(train_df['V0'], orient="v", width=0.5)
sns.distplot(train_df['V0'], fit=stats.norm)
Q-Q图(Q代表分位数)是指数据的分位数和正态分布的分位数对比参照的图,如果数据符合正态分布,则所有的点会落在直线上。
res = stats.probplot(train_df['V0'], plot=plt)
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"])
主要用于分析变量之间的线性关系。
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变量如果存在更复杂的函数形式的影响,则建议使用树模型的特征重要性去选择。
train_corr = train_df,corr()
plt.figure(figsize=(20,16))
sns.heatmap(train_corr, vmax=.8, square=True, annot=True)
# 寻找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的特征变量
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)
Box-Cox变换是统计建模中常用的一种数据转换方法。使用这种变换,可以使线性回归模型在满足线性、正态性、独立性及方差齐性的同时,又不丢失信息。
在做Box-Cox变换之前,需要对数据做归一化预处理。线下分析建模中可以对数据进行合并操作可以使训练数据和测试数据一致,而线上部署只需采用训练数据的归一化即可。
训练数据和测试数据分布一致(一般在数据量大的情况下):可以分开进行归一化处理;
数据量较小会存在分布差异较大的情况,此时在数据分析和线下建模中应该将数据统一归一化。