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对异常值非常敏感。
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() #获取转换后代表的特征名称根据阈值将数据二值化用于处理连续型变量,大于阈值的映射为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()