机器学习——数据预处理

    科技2024-11-10  10

    数据挖掘的五大流程

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

    Processed: 0.023, SQL: 8