Advertisement

机器学习(2)--特征工程之特征预处理(归一化/标准化/缺失值)

阅读量:

二、数据的特征处理

概念: 通过特定的统计方法(数学方法)将数据转换成算法要求的数据

不同数据的处理方式:(并非一定要用,视情况)

数值型数据: 标准缩放:

1、归一化

2、标准化

3、缺失值

类别型数据 :one-hot编码(后续补充)

时间类型: 时间的切分(后续补充)

sklearn特征处理API

sklearn. preprocessing

数值型数据

1. 归一化:

特点 :通过对原始数据进行变换把数据映射到(默认为[0,1])之间

公式:

注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’ 为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0

归一化公式计算过程:

x11 = 90-60/90-60 = 1,x11‘ = 1(1-0)+0 = 1

x21 = 60-60/90-60 = 0,x21 = 0(1-0)+0 = 0

……

结果为:

sklearn归一化API:

sklearn.preprocessing.MinMaxScaler

MinMaxScaler语法:

MinMaxScalar(feature_range=(0,1)…)

每个特征缩放到给定范围(默认[0,1])

MinMaxScalar.fit_transform(X)

X:numpy array格式的数据[n_samples,n_features]

返回值:转换后的形状相同的array

归一化步骤 :

1)实例化MinMaxScalar

2)通过fit_transform转换

【注:这里的数据不同于特征抽取的数据,这里应该是一个二维数组】

复制代码
 def mm():

    
     """
    
     归一化处理
    
     :return: NOne
    
     """
    
     mm = MinMaxScaler(feature_range=(0, 1))#范围可以修改
    
  
    
     data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
    
  
    
     print(data)
    
  
    
     return None

结果显示:

可见每一列都是在默认的范围

归一化案例:

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

三个特征同等重要的时候,才能进行归一化

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

例如:(72993-35948)^2 + (10.14-6.8)^2 + (1.0 - 1.21)^2 这样结果与实际情况偏差了,某一个特征过于大,对结果影响大

如果数据中异常点过多,会有什么影响?可以从公式角度分析,异常点对最大值最小值影响较大

缺点

注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。【鲁棒性:稳定性较差,像是用户较多时,系统不稳定】

2. 标准化【解决归一化受异常点影响较大的问题】

特点:

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内

公式:

【注:作用于每一列,mean为平均值,σ为标准差(考量数据的稳定性)】

结合归一化来谈标准化

对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变

对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。【因此,标准化对于数据量有一定的要求】

sklearn特征化API

scikit-learn.preprocessing.StandardScaler

StandardScaler语法

1)StandardScaler(…) 处理之后每列来说所有数据都聚集在均值0附近方差为1

2)StandardScaler.fit_transform(X,y)

X:numpy array格式的数据[n_samples,n_features]

返回值:转换后的形状相同的array

3)StandardScaler.mean_

原始数据中每列特征的平均值

4)StandardScaler.std_

原始数据每列特征的方差

步骤:

1)实例化StandardScaler

2)通过fit_transform转换

复制代码
 def stand():

    
     """
    
     标准化缩放
    
     :return:
    
     """
    
     std = StandardScaler()
    
  
    
     data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
    
  
    
     print(data)
    
  
    
     return None

结果显示:

每一列的平均值为0,标准差为1

案例:

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

【这里输入的数据是二维数组,尝试一下】

总结:

在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

缺失值处理

方式:

删除 如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列
插补 可以通过缺失值每行或者每列的平均值、中位数来填充

【一般不建议删除,尤其是样本量较小】

【这里有按行和按列,一般是按列填充,更准确】

sklearn缺失值API:

sklearn.preprocessing.Imputer

Imputer语法:

1)Imputer(missing_values='NaN', strategy='mean', axis=0) 完成缺失值插补

2)Imputer.fit_transform(X,y)

X:numpy array格式的数据[n_samples,n_features]

返回值:转换后的形状相同的array

使用pandas:fropna删除,fillna填补/

【需要数据当中的缺失值需要是np.nan】

如果缺失值类型非np.nan,则需要使用replace()进行处理

【可以用NaN或nan都可以】

Imputer流程:

1)初始化Imputer,指定”缺失值”,指定填补策略,指定行或列【注:缺失值也可以是别的指定要替换的值】

2)调用fit_transform

复制代码
 def im():

    
     """
    
     缺失值处理
    
     :return:NOne
    
     """
    
     # NaN, nan
    
     im = Imputer(missing_values='NaN', strategy='mean', axis=0)
    
  
    
     data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
    
  
    
     print(data)
    
  
    
     return None

【这里的axis=0代表的是按列填补】

结果显示;
转变为:

对于类别型数据和时间数据,类别型上一节已经提到,需要将类别型数据转为字典,然后对其做one-hot编码,时间数据以后结合案例写。

关于np.nan(np.NaN)

1)numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型

2)如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float 型的数组即可

全部评论 (0)

还没有任何评论哟~