一 特征选择
1.1 定义
数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征
1.2 特征选择的方法
1)Filter(过滤式)
主要探究特征本身特点、特征与特征和目标值之间关联
方差选择法:低方差特征过滤
相关系数
2) Embedded (嵌入式)
算法自动选择特征(特征与目标值之间的关联)
决策树:信息熵、信息增益
正则化:L1、L2
深度学习:卷积等
1.3 模块
sklearn.feature_selection
二 过滤式选择
2.1 低方差特征过滤
删除低方差的一些特征,前面讲过方差的意义。再结合方差的大小来考虑这个方式的角度
特征方差小:某个特征大多样本的值比较相近
特征方差大:某个特征很多样本的值都有差别
1)API
sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
删除所有低方差特征
Variance.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方
差特征,即删除所有样本中具有相同值的特征。
2)Demo
from sklearn.feature_selection import VarianceThreshold
'''
实例
[1,2,3]
[1,3,3]
[1,5,3]
'''
var = VarianceThreshold(threshold=0.0)
data = var.fit_transform([[1,2,3], [1,3,3], [1,6,3]])
print(data)
三 降维
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程
3.1 主成分分析(PCA)
1)定义
定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
应用:回归分析或者聚类分析当中
2)API
sklearn.decomposition.PCA(n_components=None)
将数据分解为较低维数空间
- n_components:
小数:表示保留百分之多少的信息
整数:减少到多少特征
- PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后指定维度的array
3) PCA降维demo
from sklearn.decomposition import PCA
#主成分分析 ,进行特征降维
pc = PCA(n_components=0.9)
data = pc.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
print(data)
4)案例 :探究用户对物品类别的喜好细分降维
数据如下:
order_products__prior.csv:订单与商品信息
字段:order_id, product_id, add_to_cart_order, reordered
products.csv:商品信息
字段:product_id, product_name, aisle_id, department_id
orders.csv:用户的订单信息
字段:order_id,user_id,eval_set,order_number,….
aisles.csv:商品所属具体物品类别
字段: aisle_id, aisle
数据连接:
链接:https://pan.baidu.com/s/12d4rt7UX7gFXkWE4t2JwqQ
提取码:ltr0
分析:
- 合并表,使得user_id与aisle在一张表当中
- 进行交叉表变换
- 进行降维
from sklearn.decomposition import PCA
import pandas as pd
# 去读四张表的数据
prior = pd.read_csv("./instacart/order_products__prior.csv")
products = pd.read_csv("./instacart/products.csv")
orders = pd.read_csv("./instacart/orders.csv")
aisles = pd.read_csv("./instacart/aisles.csv")
# 合并四张表
mt = pd.merge(prior, products, on=['product_id', 'product_id'])
mt1 = pd.merge(mt, orders, on=['order_id', 'order_id'])
mt2 = pd.merge(mt1, aisles, on=['aisle_id', 'aisle_id'])
print(mt2.head(10))
'''
pd.crosstab 统计用户与物品之间的次数关系(统计次数)
也叫做 交叉表(特殊的分组工具)
'''
cross = pd.crosstab(mt2['user_id'], mt2['aisle'])
print(cross.head(10))
#主成分分析 ,进行特征降维 , 保存90%的信息量
pc = PCA(n_components=0.9)
data = pc.fit_transform(cross)
print(data)
print(data.shape)