机器学习——数据预处理

数据挖掘的五大流程

1.获取数据
2.数据预处理
从数据中检测、纠正或删除损坏的数据,对缺失值进行填补。
3.特征工程
将原始数据转换成更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征、提取特征和创造特征来实现。
4.建模
5.上线,验证模型效果。

本文主要介绍数据预处理部分,sklearn中用于数据预处理的模块是preprocessingImpute
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对异常值非常敏感。

填补缺失值

  1. 通过类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()

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值