数据的特征预处理、特征选择、主成分分析

数据的特征处理

特征处理是什么

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

image

数值型数据:

标准缩放:

  1. 归一化
  2. 标准化
  3. 缺失值

类别型数据: one-hot编码

时间类型:时间的切分

sklearn特征处理API

sklearn. preprocessing

归一化

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

公式:
X^{'} = \frac{x-min}{max-min}

X^{'} = X^{'} * (mx - mi) + mi

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

归一化公式计算过程

image

注:里面是第一步,还需要第二步乘以(1-0)+0

sklearn归一化API

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转换

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

from sklearn.preprocessing import MinMaxScaler

def mm():
    """
    归一化处理
    :return: None
    """
    # mm = MinMaxScaler(feature_range=(2, 3))
    mm = MinMaxScaler()
    data = mm.fit_transform([
        [90, 2, 10, 40],
        [60, 4, 15, 45],
        [75, 3, 13, 46],
    ])

    print(data)

运行结果

[[1.         0.         0.         0.        ]
 [0.         1.         1.         0.83333333]
 [0.5        0.5        0.6        1.        ]]

归一化案例:约会对象数据

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

里程数 公升数 消耗时间比 评价
14488 7.153469 1.673904 smallDoses
26052 1.441871 0.805124 didntLike
75136 13.14739 0.428964 didntLike
38344 1.669788 0.134296 didntLike
72993 10.14174 1.032955 didntLike
35948 6.830792 1.213192 largeDoses
42666 13.27636 0.543880 largeDoses
67497 8.631577 0.749278 didntLike
35483 12.27316 1.508053 largeDoses
50242 3.723498 0.831917 didntLike

问题:如果数据中异常点较多,会有什么影响?

异常点对最大值最小值影响太大,结果会造成偏移差

归一化的缺点:对异常点的处理不太好

归一化总结

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

鲁棒性:此处的鲁棒性理解为算法对数据变化的容忍度有多高

标准化

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

2、公式:
X^{'} = \frac{x - mean}{δ}
注:作用于每一列,mean为平均值,σ为标准差(考量数据的稳定性)

std为方差,考量数据的稳定性
std = \frac{(x1-mean)^{2}+(x2-mean)^{2}+...}{n(每个特征的样本数)}

δ=\sqrt{std}

结合归一化来谈标准化

image

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

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

sklearn特征化API

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

StandardScaler语法

StandardScaler(…)

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

StandardScaler.fit_transform(X,y)

  • X:numpy array格式的数据[n_samples,n_features]
  • 返回值:转换后的形状相同的array

StandardScaler.mean_

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

StandardScaler.std_

  • 原始数据每列特征的方差

标准化步骤

1、实例化StandardScaler

2、通过fit_transform转换

[[ 1., -1., 3.],
[ 2., 4., 2.],
[ 4., 6., -1.]]
from sklearn.preprocessing import MinMaxScaler, StandardScaler


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

    print(data)

    
if __name__ == "__main__":
    stand()

运行结果

[[-1.06904497 -1.35873244  0.98058068]
 [-0.26726124  0.33968311  0.39223227]
 [ 1.33630621  1.01904933 -1.37281295]]

标准化总结

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

缺失值

如何处理数据中的缺失值?

缺失值处理方法

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

Imputer语法

Imputer(missing_values='NaN', strategy='mean', axis=0)

  • 完成缺失值插补

Imputer.fit_transform(X,y)

  • X:numpy array格式的数据[n_samples,n_features]
  • 返回值:转换后的形状相同的array

Imputer流程

1、初始化Imputer,指定”缺失值”,指定填补策略,指定行或列

注:缺失值也可以是别的指定要替换的值

2、调用fit_transform

[[1, 2], 
[np.nan, 3], 
[7, 6]]

from sklearn.impute import SimpleImputer as Imputer

def im():
    """
    缺失值处理
    :return: None
    """
    im = Imputer(missing_values=np.nan, strategy="mean")
    data = im.fit_transform([
        [1, 2],
        [np.nan, 3],
        [7, 6]
    ])

    print(data)

    return None


if __name__ == "__main__":
    im()

运行结果

[[1. 2.]
 [4. 3.]
 [7. 6.]]

关于np.nan(np.NaN)

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

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

数据降维

  1. 特征选择
  2. 主成分分析

特征选择

在这里插入图片描述

特征选择是什么

特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。

主要方法(三大武器):

  • Filter(过滤式):VarianceThreshold
  • Embedded(嵌入式):正则化、决策树
  • Wrapper(包裹式)

特征选择原因

  • 冗余:部分特征的相关度高,容易消耗计算性能

  • 噪声:部分特征对预测结果有负影响

sklearn特征选择API

sklearn.feature_selection.VarianceThreshold

VarianceThreshold语法

VarianceThreshold(threshold = 0.0)

  • 删除所有低方差特征

Variance.fit_transform(X,y)

  • X:numpy array格式的数据[n_samples,n_features]
  • 返回值:训练集差异低于threshold的特征将被删除。
  • 默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。

VarianceThreshold流程

1、初始化VarianceThreshold,指定阀值方差

2、调用fit_transform

[[0, 2, 0, 3], 
[0, 1, 4, 3], 
[0, 1, 1, 3]]

from sklearn.feature_selection import VarianceThreshold


def var():
    """
    特征选择-删除抵方差的特征
    :return:
    """
    var = VarianceThreshold(threshold=1.0)
    data = var.fit_transform([
        [0, 2, 0, 3],
        [0, 1, 4, 3],
        [0, 1, 1, 3]
    ])

    print(data)


if __name__ == "__main__":
    var()

运行结果

[[0]
 [4]
 [1]]

其他特征选择方法

神经网络

主成分分析

sklearn主成分分析API

sklearn.decomposition

PCA(主成分分析)

如何最好的对一个立体的物体二维表示

image

PCA是什么

本质:PCA是一种分析、简化数据集的技术

目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。

作用:可以削减回归分析或者聚类分析中特征的数量

特征数量达到上百的时候,考虑数据的简化
数据也会改变,特征数量也会减少

高维度数据容易出现的问题

特征之间通常是线性相关的

数据:(-1,-2) (-1, 0) ( 0, 0) ( 2, 1) ( 0, 1)

image

要求:将这个二维的数据简化成一维?

image

通过公式计算

Y=PX

即为降维到k维后的数据

矩阵运算得出P为
P = \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ -\frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{pmatrix}

Y = \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{pmatrix} \begin{pmatrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{pmatrix} = \begin{pmatrix} -\frac{3}{\sqrt{2}} & -\frac{1}{\sqrt{2}} & 0 & \frac{3}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix}
降维的案例

image

PCA语法

PCA(n_components=None)

  • 将数据分解为较低维数空间

PCA.fit_transform(X)

  • X:numpy array格式的数据[n_samples,n_features]
  • 返回值:转换后指定维度的array

n_components:

  1. 小数 (0, 1): 对降维数据的保留量 一般为90~95%
  2. 整数:减少到的特征数量

PCA流程(代码演示)

1、初始化PCA,指定减少后的维度

2、调用fit_transform

[[2,8,4,5],
[6,3,0,8],
[5,4,9,1]]

from sklearn.decomposition import PCA


def pca():
    """
    主成分分析进行特征降维
    :return: None
    """
    pca = PCA(n_components=0.9)

    data = pca.fit_transform([
        [2, 8, 4, 5],
         [6, 3, 0, 8],
         [5, 4, 9, 1]
    ])

    print(data)


if __name__ == "__main__":
    pca()

运行结果

[[ 1.28620952e-15  3.82970843e+00]
 [ 5.74456265e+00 -1.91485422e+00]
 [-5.74456265e+00 -1.91485422e+00]]

探究:用户对物品类别的喜好细分降维

image

Demo地址:https://www.kaggle.com/c/instacart-market-basket-analysis/data

instacart:把用户分成几个类别 用户-购买的物品类别

数据:

  • products.csv 商品信息

  • order_products__prior.csv 订单与商品信息

  • orders.csv 用户的订单信息

  • aisles.csv 商品所属具体物品类别

步骤:

  1. 合并个张表到一张表中 pd.merge()
  2. 建立一个类似行、列数据 交叉表(特殊的分组表)
  3. 进行主成分分析
instacart

其它降维方法

线性判别分析LDA

特征选择与主成分分析的比较?

特征数量超过上百个,就改用主成分分析了


“笑容可以瞒过他人,心疼却瞒不过自己。”

Macsen Chu

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。