数据特征预处理

Posted ʚVVcatɞ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据特征预处理相关的知识,希望对你有一定的参考价值。

特征处理是通过特定的统计方法(数学方法)将数据转换成算法要求的数据。

  • 数值型数据:

    • 标准缩放:
      • 1、归一化
      • 2、标准化
      • 3、缺失值
  • 类别性数据:one-hot编码

  • 时间类型:时间的切分

sklearn特征处理API

  • sklearn.preprocessing

归一化

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

公式:
在这里插入图片描述
注:作用于每一列,max 为一列的最大值,min为一列的最小值,那么x’’ 为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0

在这里插入图片描述
根据公式:
计算特征1 第一列第一个:

x' = 90 - 60 / 90 - 60 = 1  
x'' = 1(1 - 0) + 0 = 1
归一化结果为 1

计算特征1 第一列第二个:

x' = 60 - 60 / 90 - 60 = 0
x'' = 0(1 - 0) + 0 = 0
归一化结果为 0

计算特征1 第一列第三个:

x' = 75 - 60 / 90 - 60 = 0.5
x'' = 0.5(1 - 0) + 0 = 0.5
归一化结果为 0.5

计算特征2 第二列第一个:

x' = 2 - 2 / 4 - 2 = 0
x'' = 0(1 - 0) + 0 = 0
归一化结果为 0

计算特征2 第二列第二个:

x' = 4 - 2 / 4 - 2 = 1
x'' = 1(1 - 0) + 0 = 1
归一化结果为 1

计算特征2 第二列第三个:

x' = 3 - 2 / 4 - 2 = 0.5
x'' = 0.5(1 - 0) + 0 = 0.5
归一化结果为 0.5

计算特征3 第三列第一个:

x' = 10 - 10 / 15 - 10 = 0
x'' = 0(1 - 0) + 0 = 0
归一化结果为 0

计算特征3 第三列第二个:

x' = 15 - 10 / 15 -10 = 1
x'' = 1(1 - 0) + 0 = 0
归一化结果为 1

计算特征3 第三列第三个:

x' = 13 - 10 / 15 -10 = 0.6
x'' = 0.6(1 - 0) + 0 = 0.6
归一化结果为 0.6

计算特征4 第四列第一个:

x' = 40 - 40 / 46 -40 = 0
x'' = 0(1 - 0) + 0 = 0
归一化结果为 0

计算特征4 第四列第二个:

x' = 45 - 40 / 46 -40 = 0.83
x'' = 0.83(1 - 0) + 0 = 0.83
归一化结果为 0.83

计算特征4 第四列第三个:

x' = 46 - 40 / 46 -40 = 1
x'' = 1(1 - 0) + 0 = 1
归一化结果为 1

在这里插入图片描述

sklearn 归一化API
sklearn归一化API:sklearn.preprocessing.MinMaxScaler

MinMaxScaler 语法

MinMaxScaler(feature_range=(1, 0)…)

  • 每个特征缩放到给定返回(默认[0, 1])
函数参数返回值
MinMaxScaler.fit_transform(X)numpy array格式的数据[n_samples, n_features]转换后的形状相同的array
from sklearn.preprocessing import MinMaxScaler

# 三个特征同等重要的时候:进行归一化
def mm():
    """
    归一化处理
    1、实例化 MinMaxScaler
    2、通过 fit_transform 转换
    :return: None
    """
    # mm = MinMaxScaler()  # 每个特征缩放到给定返回(默认[0, 1])
    mm = MinMaxScaler(feature_range=(2, 3)) # 特征缩放范围 (2, 3)
    data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])

    print(data)

    return None

if __name__ == '__main__':
    mm()

代码执行结果:
在这里插入图片描述

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

归一化缺点:异常点对最大值最小值影响太大
归一化在特定场景下最大值最小值是变换的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

标准化

1、特点:通过对原始数据进行交换把数据变换到均值为0,方差为1范围内

2、公式:
在这里插入图片描述
注:作用于每一列,mean为平均值,σ为标准差

var 成为方差
在这里插入图片描述
其中:方差(考量数据的稳定性)

sklearn 特征化API
sklearn特征化API:scikit-learn.preprocessing.StandardScaler

  • StandardScaler(…)
    • 处理之后每列来说所有数据都聚集在均值0附近标准方差为1
函数参数返回值
StandardScaler.fit_transform(X)numpy array格式的数据[n_samples, n_features]转换后的形状相同的array
StandardScaler.mean_原始数据中每列特征的平均值
StandardScaler.std_原始数据每列特征的方差
def stand():
    """
    标准化缩放
    1、实例化StandardScaler()
    2、通过fit_transform转换
    :return: None
    """
    std = StandardScaler()

    data = std.fit_transform([[1., -1., 3.], [2., 4., 2.], [4., 6., -1.]])
    print(data)

    return None

if __name__ == '__main__':
    stand()

代码执行结果:
在这里插入图片描述

在这里插入图片描述

总结:
归一化:如果出现异常点,影响了最大值和最小值,那么结果会发生改变
标准化:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

缺失值处理方法

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

2、sklearn缺失值API: sklearn.preprocessing.Imputer

Imputer语法

Imputer(missing_values=‘NaN’, strategy=‘mean’, axis=0)

  • 完成缺失值插补
函数参数返回值
Imputer.fit_transform(X)numpy array个数的数据[n_samples, n_features]转换后的形状相同的array

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

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

SimpleImputer(add_indicator=False, copy=True, fill_value=None, missing_values=np.nan, strategy='mean', verbose=0)
  • add_indicator:如果该参数为True,则会在数据后面加入n列由0和1构成的同样大小的数据,0表示所在位置非空,1表示所在位置为空。相当于一种判断是否为空的索引。
  • copy:表示对原来没有填充的数据的拷贝。
  • missing_values:一般情况下缺失值是 np.nan
  • strategy:指定填补策略,有以下四种策略
    • mean: 由该列的均值填充
    • median:中位数
    • most_frequent:众数
    • constant:将空值填充为自定义的值,如果strategy=‘constant’,则填充fill_value的值。
  • verbose:控制详细程度
from sklearn.impute import SimpleImputer
import numpy as np

def im():
    """
    缺失值处理
    1、初始化 SimpleImputer,指定“缺失值”,指定填补策略,指定行或列
    注:缺失值也可以是别的指定要替换的值
    2、调用 fit_transform
    :return: None
    """
    # NaN, nan
    imp = SimpleImputer(add_indicator=False, copy=True, fill_value=None, missing_values=np.nan, strategy='mean', verbose=0)
    X = [[1, 2], [np.nan, 3], [7, 9]]
    data = imp.fit_transform(X)
    print(data)

    return None

if __name__ == '__main__':
    im()

代码执行结果:
在这里插入图片描述
注意:
随着版本的更新,Imputer的引用方式也发生了变化,一开始的引用方式为

from sklearn.preprocessing import Imputer
imputer = Imputer(strategy='mean')

更新后引用 SimpleImputer 来调用

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy="mean")

以上是关于数据特征预处理的主要内容,如果未能解决你的问题,请参考以下文章

Faster 情感分析-task03

tensorflow中卷积层输出特征尺寸计算和padding参数解析

数据预处理与特征选择

2021 年 MathorCup 高校数学建模挑战赛—赛道A数据预处理特征工程及模型训练Baseline 和数据

创建特征向量以对空中图像中的片段进行分类

模式识别 - 特征归一化 及 測试 代码(Matlab)