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

一、概述

1.1【降维】

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

1.2【特征选择】

什么是特征选择:

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

为什么要进行特征选择:

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

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

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

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

2.1 方差阈值sklearnAPI:VarianceThreshold API

sklearn.feature_selection.VarianceThreshold

2.2 sklearn.VarianceThreshold语法

【删除所有低方差特征】:
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

【演示数据】:

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

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

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(分解)

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 特征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]]

【代码实例】

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、建个类似,列数据
交叉表(特殊的分组表)

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_idproduct_idadd_to_cart_orderreorderedproduct_nameaisle_iddepartment_iduser_ideval_setorder_numberorder_doworder_hour_of_daydays_since_prior_orderaisle
023312011Organic Egg Whites8616202279prior3598.0eggs
1263312050Organic Egg Whites8616153404prior20167.0eggs
212033120130Organic Egg Whites861623750prior116810.0eggs
33273312051Organic Egg Whites861658707prior21698.0eggs
439033120281Organic Egg Whites8616166654prior480129.0eggs
55373312021Organic Egg Whites8616180135prior15283.0eggs
65823312071Organic Egg Whites8616193223prior621910.0eggs
76083312051Organic Egg Whites861691030prior1132112.0eggs
86233312011Organic Egg Whites861637804prior633123.0eggs
96893312041Organic Egg Whites8616108932prior161133.0eggs

【表2】

aisleair fresheners candlesasian foodsbaby accessoriesbaby bath body carebaby food formulabakery dessertsbaking ingredientsbaking supplies decorbeautybeers coolers...spreadsteatofu meat alternativestortillas flat breadtrail mix snack mixtrash bags linersvitamins supplementswater seltzer sparkling waterwhite winesyogurt
user_id
10000000000...1000000001
20300002000...31100002042
30000000000...4100000200
40000000000...0001000100
50200000000...0000000003
60000000000...0000000000
70000002000...0000000005
80100001000...0000000000
90000602000...00000002019
100100000000...0000000002
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值