数据挖掘的五大流程
1.获取数据
2.数据预处理
从数据中检测、纠正或删除损坏的数据,对缺失值进行填补。
3.特征工程
将原始数据转换成更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征、提取特征和创造特征来实现。
4.建模
5.上线,验证模型效果。
本文主要介绍数据预处理部分,sklearn中用于数据预处理的模块是preprocessing和Impute。
preprocessing:几乎包含数据预处理的所有内容。
Impute:填补缺失值专用。
数据无量纲化
无量纲化:是指将不同规格的数据转换到同一规格,或将不同分布的数据转换到同一分布。
数据的无量纲化可以使线性的也可以是非线性的,线性的无量纲化包括中心化(Zero-centered)处理和缩放处理(Scale)。
中心化的本质是将所有记录减去一个特定的值,即让数据平移到某个位置。缩放的本质是讲所有的记录除以一个特定的值,即将数据在固定的范围内伸缩。
数据归一化(Normalization):
将数据按照最小值中心化,再按极差(最大值-最小值)缩放,数据移动了最小个单位,并且会被收敛到[0,1]之间,这个过程叫做数据归一化。
在sklearn中使用preprocessing.MinMaxScaler来实现这个功能。MinMaxScaler中有一个重要参数feature_range,来控制我们希望把数据压缩到的范围,默认是[0,1]。
from sklearn.preprocessing import MinMaxScaler
data=[[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
import pandas as pd
pd.DataFrame(data)
#实现归一化
scaler=MinMaxScaler() #实例化
scaler=scaler.fit(data) #fit数据,本质是生成最大值和最小值
result=scaler.transform(data) #通过接口导出结果
result
实现归一化后可以看到,两组数据的分布其实是一样的。
数据标准化(Standardization)
当数据(x)按均值(μ)中心化后,再按标准差(σ)缩放,数据就会服从为均值为0,方差为1的正态分布(即标准正态分布),这个过程就叫做数据标准化。公式如下:
from sklearn.preprocessing import StandardScaler #导入标准化
data=[[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler=StandardScaler() #实例化
x_std=scaler.fit_transform(data)
x_std
也可以看到两组数据的分布相同
x_std.mean() #查看均值,为0
x_std.std() #查看方差,为1
**StandardScaler和MinMaxScaler选哪个? **
大多数机器学习算法中,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。
填补缺失值
- 通过类impute.SimpleImputer 来对缺失值进行填补。
class sklearn.impute.SimpleImputer(missing_values=nan, strategy=’mean’, fill_value=None, verbose=0, copy=True)
例如对于一组数据中的Age进行缺失值填补
Age=data.loc[:,"Age"].values.reshape(-1,1) #reshape将数据升维
from sklearn.impute import SimpleImputer
imp_mean=SimpleImputer() #默认均值填补
imp_median=SimpleImputer(strategy="median") #中位数
imp_0=SimpleImputer(strategy="constant",fill_value=0) #0
imp_mean=imp_mean.fit_transform(Age)
imp_median=imp_median.fit_transform(Age)
imp_0=imp_0.fit_transform(Age)
2.也可直接通过numpy和pandas进行填补
data_.loc[:,"Age"]=data.loc[:,"Age"].fillna(data.loc[:,"Age"].median)
直接删除有缺失值的行:
data_.dropna(axis=0,inplace=True)
#.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
#参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认False
处理分类型特征:编码与哑变量
有些机器学习算法,例如逻辑回归、SVM等只能处理数值型数据,不能处理文字型数据,这种情况下,需要对文字型数据进行编码,将文字型数据转换成数值型数据。
- preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值
from sklearn.preprocessing import LabelEncoder #标签专用,可以是一维数据
data.iloc[:,-1]=LabelEncoder().fit_transform(data.iloc[:,-1])
- preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值。
from sklearn.preprocessing import OrdinalEncoder #特征专用,需要输入二维以上数据
data_=data.copy()
data_.head()
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_ #查看对应的种类
data_.iloc[:,1:-1]=OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
data_.head()
-
preprocessing.OneHotEncoder:独热编码,创建哑变量
上述OrdinalEncoder将舱门Embarked(S,C,Q)一列转换成了数值类型变量(0,1,2),对于舱门原特征S,C,Q来说,相互之间没有任何联系,然而,转换成数值变量0,1,2后,这三个数值却有了大小、xi相加相乘的联系,这种转换会对算法的准确性产生一定的影响。
类似于Embarked这种变量,我们称之为名义变量。对于有序变量,可以使用OrdinalEncoder来编码;对于名义变量,需要使用哑变量的方式进行编码。
这种编码方式,可以体现出“有你就没我”的不等关系,成为独热编码,将特征转换成哑变量。
from sklearn.preprocessing import OneHotEncoder
data.head()
X=data.iloc[:,1:-1]
enc=OneHotEncoder(categories="auto").fit(X) #categories="auto"自动查看类别
result=enc.transform(X).toarray()
result
enc.get_feature_names() #获取转换后代表的特征名称
处理连续型特征:二值化和分段
- sklearn.preprocessing.Binarizer
根据阈值将数据二值化用于处理连续型变量,大于阈值的映射为1,小于阈值的映射为0.
例如将年龄二值化。
#将年龄二值化
data_2=data.copy()
from sklearn.preprocessing import Binarizer
X=data_2.iloc[:,0].values.reshape(-1,1) #特征专用,需要二维
X
transformer=Binarizer(threshold=30).fit_transform(X)
transformer
data_2.iloc[:,0]=transformer
data_2.head()
- preprocessing.KBinsDiscretizer
将连续型变量划分为分类型变量的类,能够将连续变量排序后按顺序分箱后编码。
#将年龄进行分箱处理
from sklearn.preprocessing import KBinsDiscretizer
X=data.iloc[:,0].values.reshape(-1,1)
est=KBinsDiscretizer(n_bins=3,encode="ordinal",strategy="uniform")
est.fit_transform(X)
est=KBinsDiscretizer(n_bins=3,encode="onehot",strategy="uniform")
est.fit_transform(X).toarray()