sklearn 特征预处理,归一化和标准化,缺失值处理

目录

1.什么是特征处理

2.不同的特征数据处理方式

3.归一化

公式

公式讲解

sklearn 归一化实例

归一化的运用场景

归一化的缺点——异常点

4.标准化

公式

公式分析

sklearn 标准化实例

标准化的意义

缺失值处理方法

参考资料


1.什么是特征处理

通过特点的统计法(数学方法),将数据转换成算法要求的数据

 

2.不同的特征数据处理方式

数值型数据(实数型),通过标准缩放进行处理,标准缩放简单来讲就是将数字大小缩小化(偏0),如100缩小到0~1之间,常用的算法有:

  • a.归一化
  • b.标准化

类别型数据,比如性别,国籍,这些有限类别的数据值,可将其转换为整数数字,性别男女对于0或1;世界上有197个国家,所以可用1-197对国籍标号,对于这样的处理方式,常用的算法有:

  • a.one-hot编码化

时间型数据,对于时间型数据,常用的做法是切分时间段,算法为:

  • a.时间切分

3.归一化

归一化是指对原始数据进行变换,把数据映射到一个指定的区间,如[0,1]之间

公式

公式讲解

对于下列数据,将其做归一化,其结果如右。max代表一列的最大值,min代表一列的最小值,x代表为变量(被归一化的值)。比如特征1(第一列)的第一个值90,这一列的最大值为90,最小值为60,则有

X`=90-60/90-60=1 

mx和mi分别为指定区间值,mx为1,mi为0,区间值指的是我们想要缩小到的区间,默认是[0,1]。sklearn 可以调整这个区间值。

X``=1*(1-0)+0=1

所以90进过归一化后变成了1,类似的60变成了0,75变成了0.5

 

sklearn 归一化实例

sklearn API接口: sklearn.preprocessing.MinMaxScaler

from sklearn.preprocessing import MinMaxScaler

def normalization():
    mm=MinMaxScaler()
    data=mm.fit_transform([[90,2,10,40],
                           [60,4,15,45],
                           [75,3,13,46]])
    print(data)

if __name__=="__main__":
     normalization()

打印结果 

缩小区间可以调整, 如将其调整到(1,3)

mm=MinMaxScaler(feature_range=(1,3))

归一化的运用场景

相亲约会对象数据,这个样本时男士的数据,三个特征,玩游戏所消耗时间的 百分比、每年获得的飞行常客里程数、每周消费的冰淇淋公升数。然后有一个 所属类别,被女士评价的三个类别,不喜欢didnt、魅力一般small、极具魅力large 也许也就是说飞行里程数对于结算结果或者说相亲结果影响较大,但是统计的 人觉得这三个特征同等重要。

 

在此处为什么要进行归一化,归一化说白了就是控制数据在指定的范围内,防止过大数据对结果造成干扰。

这里先使用一个k-means算法(k近临算法)

k-means就是同一特征下的两个样本,相减取平方。

对于上图标红的两个样本(从现在开始,表中的行称为样本,列称为特征值),使用k-means时,计算(72993-35948)^2 + (10.141740-6.830792)^2 + (1.032955-1.213192)^2,会发现(72993-35948)^2的值过大,后面两项基本可以忽略不计了,但是案例中有一句话很重要------“统计的 人觉得这三个特征同等重要”。所以,就要解决这个情况,可以使用归一化解决。

最终,使得某一个特征对最终结果不会造成更大影响。

 

归一化的缺点——异常点

如果数据中异常点较多,对归一化会有什么影响?

回忆归一化公式,x1=x-min/max-min , x1的值容易受到max-min的影响,x2也就受到影响,所以当出现特别大和特别小的数值,会对结果产生很大的影响,如下面这组值,

data=mm.fit_transform([[900,2,10,40],
                       [60,4,15,45],
                       [75,3,13,46],
                       [45,3,13,46],
                       [65,3,13,46],
                       [90,3,13,46],])

进行归一化的结果为,第一个值900极大的影响了这一特征值,使得其他数值被极大缩小了:

[[1.         0.         0.         0.        ]
 [0.01754386 1.         1.         0.83333333]
 [0.03508772 0.5        0.6        1.        ]
 [0.         0.5        0.6        1.        ]
 [0.02339181 0.5        0.6        1.        ]
 [0.05263158 0.5        0.6        1.        ]]

 

总结:注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性(可以理解为稳定性)较差,只适合传统精确小数据场景。

 

 

4.标准化

标准化是指对原始数据进行变换把数据变换到均值为0,标准差为1。如何将一组特征值变满足这一条件的一组值,需要用到以下公式。

公式

x代表当前特征值,mean代表该类特征值的平均数

其中σ的计算方式如下,var代表方差,σ为方差var开根号

 

公式分析

有以下一组特征值,计算第一列三个(90,60,75)的X`。

[90,2,10,40],
[60,4,15,45],
[75,3,13,46]

第一列平均数

mean=90+60+75/3=75

var=(90-75)^2+(60-75)^2+(75-75)^2/3=150

σ=√150=12.247

X1`=90-75/12.247=1.2247897

X2`=60-75/12.247=-1.2247897

X3`=75-75/12.247=0

标准化处理后的第一组数据为

1.2247897 -1.2247897 0

对于这一组结果,是否满足均值为0,标准差为1呢?计算一下

均值=1.2247897+(-1.2247897)+0/3=0

标准差=√方差=√((1.2247897-0)^2+(1.2247897-0)^+(0-0)^2)/3=1(注意,这里其实是约等于1)

根据计算结果,显然满足我们对标准化的定义

 

sklearn 标准化实例

sklearn API接口:sklearn.preprocessing.StandardScaler

from sklearn.preprocessing import StandardScaler

def standar():
    st = StandardScaler()
    data = st.fit_transform([[90,2,10,40],
                           [60,4,15,45],
                           [75,3,13,46]])
    print(data)

if __name__=="__main__":
     standar()

 输出结果,可以看到第一列的值与我们计算的是一样的。

标准化的意义

使用标准化的意义在于解决归一化的缺陷,即当出现异常点,影响了最大值或最小值,那么结果显然会发生改变;而对于标准化来说,具有一定数据量,少量的异常点对平均值的影响不是那么大,从而方差改变也较小

 

缺失值处理方法

在做数据预处理之前,有些数据可能存在缺失值,比如对某一组特征数据,其不存在特征x,或者在获取该特征时因为某些原因没有录入,有两种处理方式:

  • 删除:删除该行数据(不对这一组数据做特征值预处理),或是删除该特征值(不对该特征做预处理)
  • 填补:可用该列特征值的平均数或中位数进行填补,通常来说,使用填补的方式处理缺失值更加稳妥

比如该组数据

[90,2,10,40],
[60,4,15,45],
[75,3,13,46]

假设某组数据有缺失值,这样就有个问题,缺失的部分填什么,填0或者不填可以么,当然不可以

[90,2,10,],
[,4,15,45],
[75,3,,46]

补充:numpy提供了缺失值的填补方式,即np.nan

使用numpy填补后的数据

[90,2,10,np.nan],
[np.nan,4,15,45],
[75,3,np.nan,46]

sklearn 提供了缺失值处理API:sklearn.impute.SimpleImputer

我们使用平均值来填补缺失值

from sklearn.impute import SimpleImputer

def imputer():
    im=SimpleImputer(missing_values=np.nan,strategy="mean")
    data=im.fit_transform([[90,2,10,np.nan],
                           [np.nan,4,15,45],
                           [75,3,np.nan,46]])
    print(data)

if __name__=="__main__":
     imputer()

结果如下 

注意:平均值不计算缺失部分,如第一列特征的平均值=90+75/2=82.5

 

参考资料

归一化案例:约会相亲对象 https://www.cnblogs.com/cwj2019/p/11720029.html 

数据的标准化(normalization)和归一化 https://www.cnblogs.com/LazyJoJo/p/7216523.html

数据预处理Preprocessing data https://blog.csdn.net/pipisorry/article/details/52247679

缺失值处理&异常值处理 https://blog.csdn.net/xiedelong/article/details/81607598

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值