0%

《机学三》特征工程3 —— 特征选择:特征选择、数据降维

详情请点阅读全文

一、概述

1.1【降维】

【维降】:把三维降成二维,本质就是减少特征数量;
降维示例

1.2【特征选择】

什么是特征选择:

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

为什么要进行特征选择:

  1. 冗余:部分特征的相关度高,容易消耗计算性能
  2. 噪声:部分特征对预测结果有负影响
  3. 相同的特征值:比如亚洲人肤色都是黄色,这就没意义。
  4. 冗余的特征
  5. 没用的特征

主要方法(三大武器):前2种主要方式

  1. Filter(过滤式):VarianceThreshold(方差阈值),计算特征值方差,得出其值[是否一样]或[差距大小]
    *
    【方差公式】**:一组数据中的各个数减这组数据的平均数的平方和的平均数,公式为(mean即平均数):
    $$var=\frac{(x1- mean)^{2}+(x2- mean)^{2}+…}{n(每个特征的样本数)}$$
    【简单说】,方差(每一列每个数-这列的平均数)^2/这列数的个数
    【目的】删除低方差的特征列
  2. *Embedded(嵌入式):正则化、决策树
  3. Wrapper(包裹式)
  4. 其它方法:神经网络(以后介绍)

    二、特征选择实战之:方差阈值VarianceThreshold

    2.1 方差阈值sklearnAPI:VarianceThreshold API

    1
    sklearn.feature_selection.VarianceThreshold

    2.2 sklearn.VarianceThreshold语法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    【删除所有低方差特征】:
    VarianceThreshold(threshold = 0.0)

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

    2.3sklearn.VarianceThreshold使用流程(代码演示)

    1、初始化VarianceThreshold,指定阀值方差
    2、调用fit_transform

【演示数据】:

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

【方差选择实例:day1.py】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from sklearn.feature_selection import VarianceThreshold

def var():
'''
特征选择-删除低方差的特征
:return: None
'''
var=VarianceThreshold(threshold=0) #去除方差等于0的列;【threshold即域值。方差(每一列每个数-这列的平均数)^2/数的个数=0的列】
data=var.fit_transform([[0, 2, 0, 3],[0, 1, 4, 3],[0, 1, 1, 3]]) #按去除方差等于0列,对此列表进行转换
print(data)

if __name__=='__main__':
var()

'''结果:
原数据:
[[0, 2, 0, 3],
[0, 1, 4, 3],
[0, 1, 1, 3]]
threold=0时,去除特征值完全一样的列:
[[2 0]
[1 4]
[1 1]]
threold=1时,去除特征值小于1的列:
[[0]
[4]
[1]]
'''

三、降维示例

3.1 sklearn降维API之:decomposition(分解)

1
sklearn. decomposition

3.2 PCA(主成分分析)

【本质】:PCA是一种分析、简化数据集的技术
【目的】:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
【作用】:可以削减回归分析或者聚类分析中特征的数量
【场景】:特征数量达到上百的时候,就要考虑数据的简化,即用到PCA
【公式】:理解即可,不必掌握(参考例2理解此公式):
在这里插入图片描述
【例1】:用二维的照片去更好的表示三维的洒水壶,哪张能更好的表现三维实体?
这时就要用到PCA来分析决定选择去除哪些特征,又不影响对实体的表现(信息不会损失很大)。
用二维的照片去更好的表示三维的洒水壶
【例2】
要求:将这个二维的数据简化成一维?
数据:(-1,-2),(-1, 0),( 0, 0),( 2, 1),( 0, 1)
方法1:直接降到x轴,或y轴上,数据都剩下3个点,都损失了2个点。这就是信息损失比较大的情况;
方法2:如果在都投到(蓝线),则还是5个点,虽然还是有信息损失,但已经把损失降到最小。
在这里插入图片描述
【例3】
下图的特征1、特征50相差其实不大,把50进行缩放,和特征1类似,因此可把1、50当一个数据处理

1
2
3
4
5
6
7
8
9
特征1 特征2 特征3 特征50,。。。。特征100
1 2
2 4
3 6
4 8
5 9
6 12
7 13
8 15

【例4】实际应用:把人脸特征用PCA分析后,进行的数据降维
在这里插入图片描述

3.3 sklern的PCA语法

from sklearn.decomposition import PCA
1)PCA(n_components=None)

  • 将数据分解为较低维数空间
  • 当n_components取值 0-1(即,0%-100%):表示信息损失比率为,xx%【最好取:90%-95%】
  • 当n_components取值整数时:表示减少到的特征数量【一般不用,因为你知减少成多个特征是最好的】

2)PCA.fit_transform(X)

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

3.4 PCA流程(代码演示)

1、初始化PCA,指定减少后的维度
2、调用fit_transform
3、演示数据:
[[2,8,4,5],
[6,3,0,8],
[5,4,9,1]]

【代码实例】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from sklearn.decomposition import PCA
def pca():
'''
特征选择-PCA处理(decomposition)
主成分分析进行特征降维
:return:
'''
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()

'''结果:其信息量为输入信息的90%
[[ 1.28620952e-15 3.82970843e+00]
[ 5.74456265e+00 -1.91485422e+00]
[-5.74456265e+00 -1.91485422e+00]]
'''

四、降维实战(菜篮子分析-数据降维)

地址:https://www.kaggle.com/c/instacart-market-basket-analysis/data
https://pan.baidu.com/s/1CD8JsfoxOh8NeRSGNYMPyg 提取码: 6qfp
1、合并各张表到一张表当中
pd.merge()
prior: product_id,order_id
products:product_id, aisle_id
orders:order_id,user_id
aisles:aisle_id,aisle
2、建个类似,列数据
交叉表(特殊的分组表)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pandas as pd
from sklearn.decomposition import PCA

# 读取四张表的数据
prior = pd.read_csv("./data/instacart/order_products__prior.csv")
products = pd.read_csv("./data/instacart/products.csv")
orders = pd.read_csv("./data/instacart/orders.csv")
aisles = pd.read_csv("./data/instacart/aisles.csv")

# 合并四张表到一张表 (用户-物品类别)
_mg = pd.merge(prior, products, on=['product_id', 'product_id'])
_mg = pd.merge(_mg, orders, on=['order_id', 'order_id'])
mt = pd.merge(_mg, aisles, on=['aisle_id', 'aisle_id'])
mt.head(10)# 展示此表前十个【表1】

# 交叉表(特殊的分组工具)以userid为列,商品分类 aisle为行的表
cross = pd.crosstab(mt['user_id'], mt['aisle'])
cross.head(10) #展示此示前十个【表2】

# 进行主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)
data.shape() #将看到数据维度明显变小

【表1】:

order_id product_id add_to_cart_order reordered product_name aisle_id department_id user_id eval_set order_number order_dow order_hour_of_day days_since_prior_order aisle
0 2 33120 1 1 Organic Egg Whites 86 16 202279 prior 3 5 9 8.0 eggs
1 26 33120 5 0 Organic Egg Whites 86 16 153404 prior 2 0 16 7.0 eggs
2 120 33120 13 0 Organic Egg Whites 86 16 23750 prior 11 6 8 10.0 eggs
3 327 33120 5 1 Organic Egg Whites 86 16 58707 prior 21 6 9 8.0 eggs
4 390 33120 28 1 Organic Egg Whites 86 16 166654 prior 48 0 12 9.0 eggs
5 537 33120 2 1 Organic Egg Whites 86 16 180135 prior 15 2 8 3.0 eggs
6 582 33120 7 1 Organic Egg Whites 86 16 193223 prior 6 2 19 10.0 eggs
7 608 33120 5 1 Organic Egg Whites 86 16 91030 prior 11 3 21 12.0 eggs
8 623 33120 1 1 Organic Egg Whites 86 16 37804 prior 63 3 12 3.0 eggs
9 689 33120 4 1 Organic Egg Whites 86 16 108932 prior 16 1 13 3.0 eggs

【表2】

aisle air fresheners candles asian foods baby accessories baby bath body care baby food formula bakery desserts baking ingredients baking supplies decor beauty beers coolers ... spreads tea tofu meat alternatives tortillas flat bread trail mix snack mix trash bags liners vitamins supplements water seltzer sparkling water white wines yogurt
user_id
1 0 0 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 1
2 0 3 0 0 0 0 2 0 0 0 ... 3 1 1 0 0 0 0 2 0 42
3 0 0 0 0 0 0 0 0 0 0 ... 4 1 0 0 0 0 0 2 0 0
4 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 1 0 0 0 1 0 0
5 0 2 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 3
6 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 2 0 0 0 ... 0 0 0 0 0 0 0 0 0 5
8 0 1 0 0 0 0 1 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
9 0 0 0 0 6 0 2 0 0 0 ... 0 0 0 0 0 0 0 2 0 19
10 0 1 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 2