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

数据的特征处理

特征处理是什么

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354