此处维度主要指的是:特征的数量
降维主要有两种方式:1、特征选择,2、主成分分析
1、特征选择
(1)特征选择是什么?
特征选择就是单纯的从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯定比选择前小。
(2)特征选择的原因
消除冗余:部分特征值的相关度高,容易消耗计算性能
处理噪声:部分特征对预测结果有影响
(3)主要方法(主要介绍过滤式)
- Filter(过滤式):VarianceThreshold
sklearn特征选择API:sklearn.feature_selection.VarianceThreshold
代码如下:
from sklearn.feature_selection import VarianceThreshold
def var():
'''
特征选择:删除低方差的特征
:return: None
'''
var = VarianceThreshold(threshold=0.0)
X = [[0,2,0,3],
[0,1,4,3],
[0,1,1,3]]
data = var.fit_transform(X)
print(data)
return None
if __name__== "__main__":
var()
执行结果中,删除了方差为0的特征
F:\Python\3.7\python.exe E:/PythonProject/Scripts/vector.py [[2 0] [1 4] [1 1]] Process finished with exit code 0 |
- Embedded(嵌入式):正则化,决策树
- Wrapper(包裹式)
- 神经网络
2、主成分分析
(1)PCA(主成分分析)介绍
本质:PCA是一种分析、简化数据集的技术
目的:数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息
作用:可以削减回归分析或者聚类分析中的特征的数量。
例、如下图,将二维数据转化到一维
例、如下图,左侧图经过降维后得到右侧图
(2)sklearn主成分分析法API
sklearn.decomposition.PCA
n_components:为小数时候,表示百分比,在0-1之间,推荐在90%--95%;如果为整数,表示减少到的特征数量。通常使用小数表示更为合理。
from sklearn.decomposition import PCA
def pca():
'''
特征降维,使用主成分分析法
:return: None
'''
X = [[2,8,4,5],
[6,3,0,8],
[5,4,9,1]]
pca = PCA(n_components=0.9) # 保留90%的特征信息
data = pca.fit_transform(X)
print(data)
return None
if __name__== "__main__":
pca()
结果:
F:\Python\3.7\python.exe E:/PythonProject/Scripts/vector.py [[ 1.28620952e-15 3.82970843e+00] [ 5.74456265e+00 -1.91485422e+00] [-5.74456265e+00 -1.91485422e+00]]
Process finished with exit code 0 |
3、降维案例
探究:用户对物品类别的喜好细分降维
数据地址:https://www.kaggle.com/c/instacart-market-basket-analysis/data
from sklearn.decomposition import PCA
import pandas as pd
def Instacart_PCA():
'''
主成分分析:用户对物品类别的喜好细分降维
:return: None
'''
# 读取四张表的数据
prior = pd.read_csv("C:\\Users\\Administrator\\Desktop\\机器学习\\Instacart\\order_products__prior.csv")
products = pd.read_csv("C:\\Users\\Administrator\\Desktop\\机器学习\\Instacart\\products.csv")
orders = pd.read_csv("C:\\Users\\Administrator\\Desktop\\机器学习\\Instacart\\orders.csv")
aisles = pd.read_csv("C:\\Users\\Administrator\\Desktop\\机器学习\\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'])
# 查看已经合并表中前10个
print(mt.head(10))
# 交叉表(特殊的分组工具):构建行,列的二维矩阵
cross = pd.crosstab(mt['user_id'],mt['aisle'])
# 由于列中特征太多,存在很多冗余的数据,进行主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)
print(data)
# print(data.shape)
return None
if __name__== "__main__":
Instacart_PCA()