赞
踩
前段时间参加了一个数据建模比赛,机器学习部分主要是应用python的sklearn库,现整理一下自己当时的复习内容。
整个数据建模的第一部分也是最主要的部分是数据预处理。其常规顺序(不一定全需要做)为:处理离群值、处理缺失值、标准化或归一化、纠偏、连续特征离散化、类别特征编码、特征增强和对不平衡数据集的处理(仅针对分类问题)。本篇是数据预处理中的数据标准化或归一化和纠偏部分。
练习使用方便起见,使用sklearn的datasets模块中的红酒数据。
import sklearn import pandas as pd import numpy as np import matplotlib.pyplot as plt # 用于在notebook直接显示图片 %matplotlib inline from sklearn import datasets # 加载数据 data = datasets.load_wine() # 提取自变量和响应变量 X, y = data.data, data.target print(X.shape, y.shape) #输出:(178, 13) (178,) # 查看前两条自变量 X[:2] #输出: #array([[1.423e+01, 1.710e+00, 2.430e+00, 1.560e+01, 1.270e+02, 2.800e+00, # 3.060e+00, 2.800e-01, 2.290e+00, 5.640e+00, 1.040e+00, 3.920e+00, # 1.065e+03], # [1.320e+01, 1.780e+00, 2.140e+00, #1.120e+01, 1.000e+02, 2.650e+00, # 2.760e+00, 2.600e-01, 1.280e+00, #4.380e+00, 1.050e+00, 3.400e+00, # 1.050e+03]])
最基本的处理方式。公式为:
z = (x - u) / s
其中,u为均值,s为标准差。
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
## 个人觉得统一使用先fit,再transform的方式比直接使用fit_transform()实用。方便在实际建模时,以同样的方式处理训练集和预测集的数据
ss.fit(X)
X_ss = ss.transform(X)
通过画图对比一下处理前后的结果
X_df = pd.DataFrame(X)
X_ss_df = pd.DataFrame(X_ss)
# 画出处理前的变量分布直方图(只画了前四个)
plt.figure(figsize=(10,3))
for i in range(1,5):
plt.subplot(1,4,i)
plt.hist(X_df[i-1])
# 画出标准化处理后的变量分布直方图(只画了前四个)
plt.figure(figsize=(10,3))
for i in range(1,5):
plt.subplot(1,4,i)
plt.hist(X_ss_df[i-1])
会消除一些异常值的影响,实际使用中效果比较好。
公式为:
z = (x - m) / IQR
其中,m为中位数,IQR为四分位距,即第三四分位数和第一四分位数之差。
from sklearn.preprocessing import RobustScaler
rs = RobustScaler()
rs.fit(X)
X_rs = rs.transform(X)
# 查看处理后的分布
X_rs_df = pd.DataFrame(X_rs)
plt.figure(figsize=(10,3))
for i in range(1,5):
plt.subplot(1,4,i)
plt.hist(X_rs_df[i-1])
注意区别标准化和归一化。归一化是把自变量转换到[0,1]或[-1,1]之间。
最小最大值标准化 MinMaxScaler 把自变量转换到[0,1]之间。
公式为:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
from sklearn.preprocessing import MinMaxScaler,MaxAbsScaler
ms = MinMaxScaler()
ms.fit(X)
X_ms = ms.transform(X)
# 查看处理后结果
X_ms_df = pd.DataFrame(X_ms)
plt.figure(figsize=(10,3))
for i in range(1,5):
plt.subplot(1,4,i)
plt.hist(X_ms_df[i-1])
类似的,绝对值最大标准化MaxAbsScaler,将数据转换到[-1,1]之间。
公式为:
X_std = X / X.max(axis=0)
当用hist画图后,发现自变量或响应变量变量分布很集中时,可以视需求进行正态分布的转换。
from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer(method='box-cox',standardize=False)
## 参数:method:
# 'yeo-johnson' : works with positive and negative values(对需转换的值为正数、负数时均适用)
# 'box-cox' : only works with strictly positive values(只适用于需转换的值为正数的情况)
## 参数:standardize:
# True时转化成均值为0,方差为1的标准正态
pt.fit(X)
X_pt = pt.transform(X)
# 查看处理后的分布
X_pt_df = pd.DataFrame(X_pt)
plt.figure(figsize=(10,3))
for i in range(1,5):
plt.subplot(1,4,i)
plt.hist(X_pt_df[i-1])
可以明显看出,第二个变量由长尾分布转为了正态分布。
例如进行log转换。
np.log1p = log(x+1), 是一种常用的纠偏方法。
ft_lg = FunctionTransformer(np.log1p)
ft_lg.fit(X)
X_ft = ft_lg.transform(X)
# 查看处理后的分布
X_ft_df = pd.DataFrame(X_ft)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。