文章目录
- 1、计算相关性系数
- 2、画出热力图
- 3、筛选特征变量
- 4、Box-Cox变换
1、计算相关性系数
使用函数corr()
代码展示:
train_corr = train_data.corr()
train_corr
只截取一部分:
2、画出热力图
1、单纯的画一个热力图:
ax = plt.subplots(figsize=(20,16))
ax = sns.heatmap(train_corr)
2、画一个含有对应相关性数字的热力图
ax = plt.subplots(figsize=(20,16))
ax = sns.heatmap(train_corr,square = True,annot = True )
3、筛选特征变量
nlargest目的是:找k个与target最为接近的特征变量
DataFrame.nlargest(n, columns, keep=‘first’)
n:要返回的行数
columns:要排序的列标签
2、注意
cols = train_corr.nlargest(k, 'target').index
与cols = train_corr.nlargest(k, 'target')['target'].index
同等地位
但是很明显,官方的文档中是不存在后面加一个[]的,而且不加['target']
,只加一个index也是对的
完整代码:
#寻找K个最相关的特征信息
k = 14 # number of variables for heatmap
cols = train_corr.nlargest(k, 'target')['target'].index
hm = plt.subplots(figsize=(10, 10))#调整画布大小
hm = sns.heatmap(train_data[cols].corr(),annot=True,square=True)
plt.show()
3、快速的删除一些不重要的特征
# Threshold for removing correlated variables
threshold = 0.5
# Absolute value correlation matrix
corr_matrix = data_train1.corr().abs()
drop_col=corr_matrix[corr_matrix["target"]<threshold].index
#快速的删除一些不重要的特征
data_all.drop(drop_col, axis=1, inplace=True)
4、Box-Cox变换
- Box-Cox变换是统计建模的一种数据转换方法
- 它可以使得线性回归模型在满足线性,正态性,独立性以及方差齐性的同时吗,也不会丢失信息。
在做box-cox变换之前,需要对数据做归一化预处理。
注意:归一化数据处理的时候:
小数据 →测试集训练集一起归一化
大数据→分开对测试集和训练集
为什么呢?一般来讲,数据比较多的时候,其实是更符合正态分布或者分布十分均匀,但是小数据的话,有可能存在分布不均匀的现象
为了避免这种现象导致后续模型训练的效果太差,我们一般会把测试和训练数据都进行归一化处理,而且是同步归一化。
后续将会围绕着代码进行展开:
1、合并数据集和训练集
pd.concat([train_data['V0'],train_data['V1']])
2、归一化
公式:(col - col.min()) / (col.max() - col.min())
3、归一化重要代码
train_data_process[cols_numeric].apply(scale_minmax,axis = 0)
4、完整代码:
cols_numeric=list(data_all.columns)
def scale_minmax(col):
return (col-col.min())/(col.max()-col.min())
data_all[cols_numeric] = data_all[cols_numeric]
.apply(scale_minmax,axis=0)
data_all[cols_numeric].describe()
绘制Box-Cox前后的直方图,Q-Q图,散点图的对比
cols_numeric_left = cols_numeric[0:13]
cols_numeric_right = cols_numeric[13:]
# 融合测试集和训练集
train_data_process = pd.concat([train_data_process, train_data['target']], axis=1)
fcols = 6
frows = len(cols_numeric_left)
plt.figure(figsize=(4*fcols,4*frows))
i=0
for var in cols_numeric_left:
dat = train_data_process[[var, 'target']].dropna()
i+=1
plt.subplot(frows,fcols,i)
# 直方图
sns.distplot(dat[var] , fit=stats.norm);
plt.title(var+' Original')
plt.xlabel('')
i+=1
plt.subplot(frows,fcols,i)
# Q-Q图
_=stats.probplot(dat[var], plot=plt)
plt.title('skew='+'{:.4f}'.format(stats.skew(dat[var])))
plt.xlabel('')
plt.ylabel('')
i+=1
plt.subplot(frows,fcols,i)
# 散点图
plt.plot(dat[var], dat['target'],'.',alpha=0.5)
plt.title('corr='+'{:.2f}'.format(np.corrcoef(dat[var], dat['target'])[0][1]))
i+=1
plt.subplot(frows,fcols,i)
# 开始Box-Cox转换
trans_var, lambda_var = stats.boxcox(dat[var].dropna()+1)
trans_var = scale_minmax(trans_var)
# 绘制直方图
sns.distplot(trans_var , fit=stats.norm);
plt.title(var+' Tramsformed')
plt.xlabel('')
i+=1
plt.subplot(frows,fcols,i)
# 绘制Q-Q图
_=stats.probplot(trans_var, plot=plt)
plt.title('skew='+'{:.4f}'.format(stats.skew(trans_var)))
plt.xlabel('')
plt.ylabel('')
i+=1
plt.subplot(frows,fcols,i)
# 绘制散点图
plt.plot(trans_var, dat['target'],'.',alpha=0.5)
plt.title('corr='+'{:.2f}'.format(np.corrcoef(trans_var,dat['target'])[0][1]))
box-cox官方文档:戳一戳:官方文档
dropna 戳一戳:官方文档 删除缺失值