#我们这里是对训练集和测试集一起归一化,也可以分开进行归一化,(分开)这种方式需要建立训练数据和测试数据分布一直的情况下,建议在数据量大的情况下使用。
# 绘图显示Box-Cox变换对数据分布影响
cols_numeric_left = cols_numeric[0:13]
cols_numeric_right = cols_numeric[13:]
#这里是将特征分为两部分,前13个为第一部分
## Check effect of Box-Cox transforms on distributions of continuous variables
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)
_=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)
trans_var, lambda_var = stats.boxcox(dat[
var
].dropna()+1)
trans_var = scale_data(trans_var)
sns.distplot(trans_var , fit=stats.norm);
plt.title(
var
+
' Tramsformed'
)
plt.xlabel(
''
)
i+=1
plt.subplot(frows,fcols,i)
_=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]))