乐趣区

关于机器学习:机器学习项目实战工业蒸汽之数据探索

注:某些图片截取了一部分,不残缺。
外围要领 通过各种对数据进行可视化,剖析数据特色,进行增删改(包含缺失值解决,删除影响模型泛化的数据,进行数据变换从而更好地满足模型的假如条件,数据归一化等)。
除了数据自身的进行可视化形容,还能够将数据集和训练集进行比拟。

导入数据的工具包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from scipy import stats

import warnings
warnings.filterwarnings("ignore")

%matplotlib inline#%matplotlib inline 能够在 Ipython 编译器里间接应用,性能是能够内嵌绘图,并且能够省略掉 plt.show()这一步。

读取数据文件

应用 Pandas 库 read_csv()函数进行数据读取,宰割符为‘\t’

train_data_file = "./zhengqi_train.txt"
test_data_file =  "./zhengqi_test.txt"

train_data = pd.read_csv(train_data_file, sep='\t', encoding='utf-8')
test_data = pd.read_csv(test_data_file, sep='\t', encoding='utf-8')

数据查看(略)

查看数据后,阐明多少个特色变量啊,有没有缺失值啊,或者哪些是数值变量,哪些是标签变量啊。找不同点嘛。

画箱图摸索。

画箱型图从而对数据进行剖析。

一个箱型图

fig=plt.figure(figsize=(4,6))
sns.boxplot(train_data['V0'],orient='v',width=0.5)

all

columns=train_data.columns.tolist()[:39]# 由 train_data.head()晓得是 5rows*39
fig=plt.figure(figsize=(10,20))# 调整绘图对象宽高
for i in range(39):
    plt.subplot(13,3,i+1)#39 个图分成 13*3
    sns.boxplot(train_data[columns[i]],orient='v',width=0.5)
    plt.ylabel(columns[i],fontsize=8)
plt.show()

后果发现我也看不太来,meybe 没有什么法则,题解也没说有什么法则。所以换个图来画画,再发现一下?

查看数据分布图

查看特色变量 v0 的数据分布直方图,并绘制 Q - Q 图看是否近似于正态分布。
each

fig=plt.figure(figsize=(10,5))
ax=plt.subplot(1,2,1)
sns.distplot(train_data['V0'],fit=stats.norm)#districution 散布直方图
ax=plt.subplot(1,2,2)
res=stats.probplot(train_data['V0'],plot=plt)

查看查看所有数据的直方图和 Q - Q 图,查看训练集的数据是否近似于正态分布

train_cols=6
train_rows=len(train_data.columns)
plt.figure(figsize=(4*train_cols,4*train_rows))
i=1
for col in train_data.columns:
    ax=plt.subplot(train_rows,train_cols,i)
    sns.distplot(train_data[col],fit=stats.norm)
    i+=1
    ax=plt.subplot(train_rows,train_cols,i)
    res=stats.probplot(train_data[col],plot=plt)
    i+=1
plt.show()

由下面的数据分布图信息能够看出,很多特色变量(如 ’V1′,’V9′,’V24′,’V28’ 等)的数据分布不是正态的,数据并不追随对角线,后续能够应用数据变换对数据进行转换

比照一下训练集和验证集的数据分布状况是否统一

ax = sns.kdeplot(train_data['V0'], color="Red", shade=True)
ax = sns.kdeplot(test_data['V0'], color="Blue", shade=True)
ax.set_xlabel('V0')
ax.set_ylabel("Frequency")
ax = ax.legend(["train","test"])

查看所有特色变量下,测试集和数据集的散布状况,剖析并寻找出数据不统一的特色变量

dist_cols = 6
dist_rows = len(test_data.columns)
plt.figure(figsize=(4*dist_cols,4*dist_rows))

i=1
for col in test_data.columns:
    ax=plt.subplot(dist_rows,dist_cols,i)
    ax = sns.kdeplot(train_data[col], color="Red", shade=True)
    ax = sns.kdeplot(test_data[col], color="Blue", shade=True)
    ax.set_xlabel(col)
    ax.set_ylabel("Frequency")
    ax = ax.legend(["train","test"])

    i+=1
plt.show()

发现几个特地的,查看一下。
查看特色 ’V5′, ‘V17’, ‘V28’, ‘V22’, ‘V11’, ‘V9’ 数据的数据分布

drop_col = 6
drop_row = 1

plt.figure(figsize=(5*drop_col,5*drop_row))

i=1
for col in ["V5","V9","V11","V17","V22","V28"]:
    ax =plt.subplot(drop_row,drop_col,i)
    ax = sns.kdeplot(train_data[col], color="Red", shade=True)
    ax = sns.kdeplot(test_data[col], color="Blue", shade=True)
    ax.set_xlabel(col)
    ax.set_ylabel("Frequency")
    ax = ax.legend(["train","test"])

    i+=1
plt.show()

要害来了
因为下面的特色变量特色 ’V5′,’V9′,’V11′,’V17′,’V22′,’V28′,训练集和数据集散布不统一,会导致模型泛化能力差,so 删除此类特色。

drop_columns = ['V5','V9','V11','V17','V22','V28']

# 合并训练集和测试集数据,并可视化训练集和测试集数据特色分布图(i can't understand. 如同没啥 luanyong)

画个线性回归图和直方图看看所有特色量和 target 之间的关系呢。

(果然,发现没有任何关系)
特色 ’v0’ 和特色量 ’target’ 之间的特色关系。

fcols=2
frows=1
plt.figure(figsize=(8,4))
ax=plt.subplot(1,2,1)
sns.regplot(x='V0', y='target', data=train_data, ax=ax, 
             scatter_kws={'marker':'.','s':3,'alpha':0.3},
            line_kws={'color':'k'});#regplot 就是 regressionplot,线性回归拟合模型绘图
plt.xlabel('v0')
plt.ylabel('target')
ax=plt.subplot(1,2,2)
sns.distplot(train_data['V0'].dropna())
plt.xlabel('v0')
plt.show()

而后画出所有特色量和 ’target’ 之间的直方图和线性回归图瞅瞅。

fcols=6
frows=len(test_data.columns)
plt.figure(figsize=(5*fcols,4*frows))

i=0
for col in test_data.columns:
    i+=1
    ax=plt.subplot(frows,fcols,i)
    sns.regplot(x=col, y='target', data=train_data, ax=ax, 
                scatter_kws={'marker':'.','s':3,'alpha':0.3},
                line_kws={'color':'k'});
    plt.xlabel(col)
    plt.ylabel('target')

    i+=1
    ax=plt.subplot(frows,fcols,i)
    sns.distplot(train_data[col].dropna())
    plt.xlabel(col)

发现,果然没啥关系。
没关系,咱们再来看看特色变量的相关性。

特色变量相关性。

data_train1=train_data.drop(['V5','V9','V11','V17','V22','V28'],axis=1)# 先除去几个影响模型泛化的数据
train_corr=data_train1.corr()
train_corr

也没看进去什么特地的相关性,能够通过画出相关性热力求来直观地看。顺便说一下,失去的类似度系数 corr 越靠近 1 或者 -1, 相关性越大,靠近 0 根本没什么相关性。

查找出特色变量和 target 变量相关系数大于 0.5 的特色变量

# 寻找 K 个最相干的特色信息
k = 10 # number of variables for heatmap
cols = train_corr.nlargest(k, 'target')['target'].index

cm = np.corrcoef(train_data[cols].values.T)
hm = plt.subplots(figsize=(10, 10))# 调整画布大小
#hm = sns.heatmap(cm, cbar=True, annot=True, square=True)
#g = sns.heatmap(train_data[cols].corr(),annot=True,square=True,cmap="RdYlGn")
hm = sns.heatmap(train_data[cols].corr(),annot=True,square=True)

plt.show()
threshold = 0.5

corrmat = train_data.corr()
top_corr_features = corrmat.index[abs(corrmat["target"])>threshold]
plt.figure(figsize=(10,10))
g = sns.heatmap(train_data[top_corr_features].corr(),annot=True,cmap="RdYlGn")
drop_columns.clear()
drop_columns = ['V5','V9','V11','V17','V22','V28']

# 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)

#merge train_set and test_set
train_x =  train_data.drop(['target'], axis=1)

#data_all=pd.concat([train_data,test_data],axis=0,ignore_index=True)
data_all = pd.concat([train_x,test_data]) 


data_all.drop(drop_columns,axis=1,inplace=True)
#View data
data_all.head()

特色的相关系数值小于 0.5 的间接删除,认为这些特色与最终的预测 target 值不相干。即 V14′, ‘V21’, ‘V25’, ‘V26’, ‘V32’, ‘V33’, ‘V34’ 这些。

# normalise numeric columns
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()

#col_data_process = cols_numeric.append('target')
train_data_process = train_data[cols_numeric]
train_data_process = train_data_process[cols_numeric].apply(scale_minmax,axis=0)

test_data_process = test_data[cols_numeric]
test_data_process = test_data_process[cols_numeric].apply(scale_minmax,axis=0)

cols_numeric_left = cols_numeric[0:13]
cols_numeric_right = cols_numeric[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_minmax(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]))
## Check effect of Box-Cox transforms on distributions of continuous variables


fcols = 6
frows = len(cols_numeric_right)
plt.figure(figsize=(4*fcols,4*frows))
i=0

for var in cols_numeric_right:
    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_minmax(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]))
退出移动版