Skip to content

Latest commit

 

History

History
188 lines (135 loc) · 5.31 KB

特征工程-数据探索.md

File metadata and controls

188 lines (135 loc) · 5.31 KB

最近在做数据挖掘的需求,正合适手中有一本天池大赛赛题解析,过了一遍基本的流程,准备花几篇文章记录一下。文中代码摘自书中代码。

1. 数据探索

1.1 查看数据集特征变量信息
train_data.info()

有多少个样本;有多少个特征变量;特征变量数据类型;有无确实数据缺失情况;每个特征含义

1.2 查看数据统计信息
train_data.describe()

数据均值;数据标准差;四分位数;最大值;最小值

1.3 特征数据箱型图

画箱型图主要是为了看一下特征变量范围分布情况,有没有很多的数据在四分位数之外,有一个大概的了解。对于异常值较大的数据,我们可以考虑直接移除掉。

# 画箱式图
column = train_data.columns.tolist()[:39]  # 列表头
fig = plt.figure(figsize=(20, 40))  # 指定绘图对象宽度和高度
for i in range(38):
    plt.subplot(13, 3, i + 1)  # 13行3列子图
    sns.boxplot(train_data[column[i]], orient="v", width=0.5)  # 箱式图
    plt.ylabel(column[i], fontsize=8)
plt.show()

从总体来看异常值:

plt.figure(figsize=(18, 10))
plt.boxplot(x=train_data.values,labels=train_data.columns)
plt.hlines([-7.5, 7.5], 0, 40, colors='r')
plt.show()

## 删除异常值
train_data = train_data[train_data['V9']>-7.5]
train_data.describe()

也可以使用模型预测的形式找出异常值。

1.4 特征直方图以及Q-Q图

查看特征变量的分布情况,看一下是否满足正态分布,以及是否需要做数据转化

train_cols = 6
train_rows = len(train_data.columns)
plt.figure(figsize=(4*train_cols,4*train_rows))

i=0
for col in train_data.columns:
    i+=1
    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)
plt.show()
1.5 KDE分布-训练集和测试集合特征分布是否相同

看一下特征在训练集和测试集合的分布是否大致相同。

这一点其实非常的重要,影响到了你模型的泛化能力。

如果在某个特征或者某几个特征,数据分布相差很大,那么模型在测试数据的效果肯定会大打折扣。

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()
1.6 可视化特征和目标变量之间的线性回归关系
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)
1.7 查看特征变量之间的相关性

查看特征变量和目标变量之间的相关性,并根据阈值进行特征筛选

data_train1 = train_data.drop(['V5','V9','V11','V17','V22','V28'],axis=1)
train_corr = data_train1.corr()
train_corr

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()
1.8 最大最小值归一化

一般来说是针对数量特征我们做最大最小值归一化,不过这个对于xgboost这种树模型,基本没啥用。

from sklearn import preprocessing 

features_columns = [col for col in train_data.columns if col not in ['target']]

min_max_scaler = preprocessing.MinMaxScaler()

min_max_scaler = min_max_scaler.fit(train_data[features_columns])

train_data_scaler = min_max_scaler.transform(train_data[features_columns])
test_data_scaler = min_max_scaler.transform(test_data[features_columns])

train_data_scaler = pd.DataFrame(train_data_scaler)
train_data_scaler.columns = features_columns

test_data_scaler = pd.DataFrame(test_data_scaler)
test_data_scaler.columns = features_columns

train_data_scaler['target'] = train_data['target']
1.9 PCA特征降维

PCA特征降维一般是特征维度太高,模型训练起来太过复杂;

或者说特征之间共线性太过明显,可以使用PCA降维降低共线性。

pca = PCA(n_components=0.95)
new_train_pca_16 = pca.fit_transform(train_data_scaler.iloc[:,0:-1])
new_test_pca_16 = pca.transform(test_data_scaler)
new_train_pca_16 = pd.DataFrame(new_train_pca_16)
new_test_pca_16 = pd.DataFrame(new_test_pca_16)
new_train_pca_16['target'] = train_data_scaler['target']
new_train_pca_16.describe()