• 【机器学习】sklearn对数据预处理



    数据处理步骤

    1. 数据无量纲化
    2. 缺失值处理
    3. 处理分类型特征:编码与哑变量
    4. 处理连续型特征:二值化与分段

    观察数据

    通过pandas读取数据,通过headinfo方法大致查看一下数据
    在这里插入图片描述在这里插入图片描述结论:

    1. 暂时无需进行无量纲化处
    2. AgeEmbarked需要进行缺失值处理
    3. 处理分类型特征:SexEmbarkedSurvived这几个特征的数据只有几类可以转换为数值型变量。
    4. 处理连续型特征:Age连续型可以进行段处理成几类。

    数据无量纲化

    机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据“无量纲化”。

    无量纲化后可以加快求解速度。

    数据的无量纲化可以是线性的,也可以是非线性的。
    线性的无量纲化包括中心化(Zero-centered或者Meansubtraction)处理和缩放处理(Scale)。中心化的本质是让所有记录减去一个固定值,即让数据样本数据平移到某个位置。缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。

    由于上述无需该处理,这个进行构造数据进行操作:

    1. 归一化

    当数据(x)按照最小值中心化后,再按极差(最大值 - 最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,而这个过程,就叫做数据归一化(Normalization,又称Min-Max Scaling)。

    x ∗ = x i − m i n ( x ) m a x ( x ) − m a x ( x ) x^*=\frac{ x_i-min(x)}{max(x)-max(x) } x=max(x)max(x)ximin(x)

    preprocessing.MinMaxScaler
    (1) 构造数据

    from sklearn.preprocessing import MinMaxScaler
    import pandas as pd
    data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
    pd.DataFrame(data)
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述(2)归一化

    scaler = MinMaxScaler() #实例化
    result_ = scaler.fit_transform(data) #训练和导出结果一步达成
    result_
    
    • 1
    • 2
    • 3

    在这里插入图片描述可以逆转,把归一化的数据变回原来数据

    scaler.inverse_transform(result) #将归一化后的结果逆转
    
    • 1

    在这里插入图片描述

    MinMaxScaler类有一个很重要的参数feature_range默认是元组(0,1):把数据压缩到的范围。

    #使用MinMaxScaler的参数feature_range实现将数据归一化到[0,1]以外的范围中
    data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
    scaler = MinMaxScaler(feature_range=(5,10)) #依然实例化
    result = scaler.fit_transform(data) #fit_transform一步导出结果
    result
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述当X中的特征数量非常多的时候,fit会报错并表示,数据量太大了我计算不了,此时使用partial_fit作为训练接口scaler = scaler.partial_fit(data)

    1. 数据标准化

    当数据(x)按均值(μ)中心化后,再按标准差(σ)缩放,数据就会服从为均值为0,方差为1的正态分布(即标准正态分布),而这个过程,就叫做数据标准化(Standardization,又称Z-score normalization),公式如下:
    x ∗ = x − μ σ x^*=\frac{ x-μ}{σ} x=σxμ

    preprocessing.StandardScaler

    from sklearn.preprocessing import StandardScaler
    data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
    scaler = StandardScaler() #实例化
    x_std = scaler.fit_transform(data) 
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述一样可以逆转:

    scaler.inverse_transform(x_std)
    
    • 1

    在这里插入图片描述

    1. 总结
      对于StandardScalerMinMaxScaler来说,空值NaN会被当做是缺失值,在fit的时候忽略,在transform的时候保持缺失NaN的状态显示。并且,尽管去量纲化过程不是具体的算法,但在fit接口中,依然只允许导入至少二维数组,一维数组导入会报错。

    大多数机器学习算法中,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择。
    在这里插入图片描述


    缺失值处理

    sklearn库中处理缺失值的类是SimpleImputer,这个类的相关参数:

    参数含义&输入
    missing_values告诉SimpleImputer,数据中的缺失值长什么样,默认空值np.nan
    strategy我们填补缺失值的策略,默认均值。
    输入“mean”使用均值填补(仅对数值型特征可用)
    输入“median"用中值填补(仅对数值型特征可用)
    输入"most_frequent”用众数填补(对数值型和字符型特征都可用)
    输入“constant"表示请参考参数“fill_value"中的值(对数值型和字符型特征都可用)
    fill_value当参数startegy为”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0
    copy默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。

    在这里插入图片描述
    AgeEmbarked需要进行缺失值处理:

    (1)Age

    Age = data.loc[:,"Age"].values.reshape(-1,1) #sklearn当中特征矩阵必须是二维
    
    • 1

    reshape方法将其由一维处理到二维,sklearn对特征的处理,必须二维,不然会报错。

    from sklearn.impute import SimpleImputer
    imp_mean = SimpleImputer() #实例化,默认均值填补
    imp_median = SimpleImputer(strategy="median") #用中位数填补
    imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0填补
    
    • 1
    • 2
    • 3
    • 4

    实例化3种方式填充。

    imp_mean = imp_mean.fit_transform(Age) #fit_transform一步完成调取结果
    imp_median = imp_median.fit_transform(Age)
    imp_0 = imp_0.fit_transform(Age)
    
    • 1
    • 2
    • 3
    #在这里我们使用中位数填补Age
    data.loc[:,"Age"] = imp_median
    data.info()
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    也可以一步完成:

    data.loc[:,"Age"] = SimpleImputer().fit_transform(Age)
    
    • 1

    在这里插入图片描述(2)Embarked
    这个特征只缺了2个数据,可以直接删掉,影响不大。但是如果面对缺失较多的文字型数据可以使用众数进行填充most_frequent

    data.loc[:,"Embarked"] = SimpleImputer(strategy = "most_frequent").fit_transform(Embarked)
    
    • 1

    在这里插入图片描述
    补:pandas填充更方便:

    data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
    
    • 1

    处理分类型特征

    在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据(其实手写决策树和普斯贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)。

    将文字型数据转换为数值型:

    在这里插入图片描述

    1. 标签数据[Yes,No,Unkown]=>[0,1,2] ,LabelEncoder类专门处理标签,可以输入一维向量,特征类的必须是二维及以上。
    from sklearn.preprocessing import LabelEncoder
    y = data.iloc[:,-1] #要输入的是标签,不是特征矩阵,所以允许一维
    
    • 1
    • 2
    le = LabelEncoder() #实例化
    le = le.fit(y) #导入数据
    label = le.transform(y) #transform接口调取结果
    
    • 1
    • 2
    • 3

    label就是我们处理后的数据:
    在这里插入图片描述可以通过classes_看原有的类别:
    在这里插入图片描述也和其他的一样,可以一步到位,或者逆转:
    在这里插入图片描述

    data.iloc[:,-1] = label #让标签等于我们运行出来的结果
    data.head()
    
    • 1
    • 2

    在这里插入图片描述一步到位:

    from sklearn.preprocessing import LabelEncoder
    data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])
    
    • 1
    • 2
    1. SexEmbarked特征变量处理:OrdinalEncoder
    from sklearn.preprocessing import OrdinalEncoder
    #接口categories_对应LabelEncoder的接口classes_,一模一样的功能
    data_ = data.copy()
    data_.head()
    
    • 1
    • 2
    • 3
    • 4
    OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
    
    • 1

    在这里插入图片描述

    data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
    data_.head()
    
    • 1
    • 2

    【这样做不太对,原本毫无关联的文字型变量,现在变成有数学含义的数字型,赋予了大小等其他数学含义】

    直接pass掉OrdinalEncoder类处理特征数据,采用OneHotEncoder独热编码:
    在这里插入图片描述由原本的一列变成变成多列,列数为类别数。

    from sklearn.preprocessing import OneHotEncoder
    X = data.iloc[:,1:-1]
    enc = OneHotEncoder(categories='auto').fit(X)
    result = enc.transform(X).toarray()
    result
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述可以查看每一列的含义:

    enc.get_feature_names_out()
    
    • 1

    在这里插入图片描述也可以还原到原来的两列:
    在这里插入图片描述然后需要做的就是,给原数据拼接上面的数据,删除独热编码之前的类,重命名索引名:

    #axis=1,表示跨行进行合并,也就是将量表左右相连,如果是axis=0,就是将量表上下相连
    newdata = pd.concat([data,pd.DataFrame(result)],axis=1)
    
    • 1
    • 2

    在这里插入图片描述

    newdata.drop(["Sex","Embarked"],axis=1,inplace=True)
    newdata.columns =["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]
    
    • 1
    • 2

    在这里插入图片描述

    总结:
    在这里插入图片描述


    处理连续型特征

    1. 二值化:
      根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈值的值映射为0。默认阈值为0时,特征中所有的正值都映射到1。
    from sklearn.preprocessing import Binarizer
    X = data_2.iloc[:,0].values.reshape(-1,1) #类为特征专用,所以不能使用一维数组
    transformer = Binarizer(threshold=30).fit_transform(X)
    transformer
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    data_2.iloc[:,0] = transformer
    
    • 1
    1. 分段:KBinsDiscretizer
      这是将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。总共包含三个重要参数:
    参数含义&输入
    n_bins每个特征中分箱的个数,默认5,一次会被运用到所有导入的特征
    encode编码的方式,默认“onehot”
    onehot”:做哑变量,之后返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该类别的样本表示为1,不含的表示为0
    ordinal”:每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含有不同整数编码的箱的矩阵
    onehot-dense”:做哑变量,之后返回一个密集数组。
    strategy用来定义箱宽的方式,默认"quantile"
    “uniform”:表示等宽分箱,即每个特征中的每个箱的最大值之间的差为(特征.max() - 特征.min())/(n_bins)
    “quantile”:表示等位分箱,即每个特征中的每个箱内的样本数量都相同
    “kmeans”:表示按聚类分箱,每个箱中的值到最近的一维k均值聚类的簇心得距离都相同
    from sklearn.preprocessing import KBinsDiscretizer
    X = data.iloc[:,0].values.reshape(-1,1)
    
    • 1
    • 2
    est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform', subsample=None)
    est.fit_transform(X)
    
    • 1
    • 2

    在这里插入图片描述采用独热编码分成多列:

    est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform', subsample=None)
    #查看转换后分的箱:变成了哑变量
    est.fit_transform(X).toarray()
    
    • 1
    • 2
    • 3

    在这里插入图片描述


  • 相关阅读:
    Java String.substring()方法具有什么功能呢?
    携手武重集团共建新营销一体化平台,助推央企迈向世界一流
    前端选择器:掌握未来Web开发的关键技术
    2-Java进阶知识总结-8-反射-动态代理
    机房工程实习报告怎么写2500字
    【BurpSuite】插件学习之Log4shell
    关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列
    【PAT(甲级)】1059 Prime Factors
    力扣(LeetCode)6. Z 字形变换(C++)
    WinForm之TCP客户端通讯
  • 原文地址:https://blog.csdn.net/qq_43466788/article/details/133799180