特征预处理
特征预处理介绍
解释:通过一些转换函数,将特征数据转换成更适合算法模型的特征数据的过程
- 数值数据的无量纲化
- 归一化
- 标准化
- 为什么要无量纲化:
特征的单位或者大小相差较大,或者某特征的方法相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
- 特征预处理API
sklearn.preprocessing
归一化
定义:通过对原始数据进行变换,把数据映射到某一区间(默认为[0,1])
- 公式
作用于每一列,max为一列的最大值,min为一列的最小值,X''为最终结果,mx,mi 分别为指定区间值,默认mx为1 ,mi为0
- API
- sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)…)
- MinMaxScaler.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形式相同的array
- 数据计算实例
对以下数据进行运算,在dating.txt中保存的是“约会对象的数据”
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
def minmax_demo():
"""
归一化
:return:
"""
# 1、获取数据
data = pd.read_csv("dating.txt")
data = data.iloc[:, :3] #只需处理前三列,不需要对目标值进行处理
print("data:\n", data)
# 2、实例化一个转换器类
transform = MinMaxScaler()
#transform = MinMaxScaler(feature_range=[2,3]) #转化到[2,3]范围内
# 3、调用fit_transform进行转化
data_new = transform.fit_transform(data)
print("data_new:\n", data_new)
return None
if __name__ == "__main__":
minmax_demo()
- 归一化总结
注意最大最小值是变化的,并且,最大最小值容易受到异常点的影响,所以这种方法的鲁棒性较差,只适合于传统精确小数据场景。
标准化
定义:通过对原始数据进行变换,把数据变换到均值为0,标准差为1
- 公式
- 归一化和标准化的对比
- 归一化:如果出现异常点,影响了最大最小值,结果显然会发生变化。
- 标准化:少量异常点对平均值的影响并不大,从而方差改变较小。
- API
- sklearn.perprocessing.StandradScaler()
处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1 - StandardScaler.fit_transform(X)
X;numpy array格式的数据,[n_samples,n_features]
返回值:转化后的形状相同的array
4.数据计算实例
依旧是对在dating.txt中保存的是“约会对象的数据”进行运算
import pandas as pd
from sklearn.preprocessing import MinMaxScaler, StandardScaler
def stand_demo():
"""
标准化
:return:
"""
# 1、获取数据
data = pd.read_csv("dating.txt")
data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transform = StandardScaler()
#transform = StandardScaler(feature_range=[2,3])
# 3、调用fit_transform
data_new = transform.fit_transform(data)
print("data_new:\n", data_new)
return None
if __name__ == "__main__":
stand_demo()
- 适用场景
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
特征降维
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组不相关主变量的过程
在训练模型时我们都是用特征进行学习的,如果特征本身 存在问题或者特征之间相关性较强,对算法的学习预测影响较大
- 降维的两种方式
- 特征选择
- 主成分分析
特征选择
定义:数据中包含冗余或相关变量(或称特征、属性、指标等),特征选择旨在从原有特征中找出主要特征
- 方法
- Filter过滤式:主要探究特征本身特点、特征与特征和目标值之间关联
1)方差选择法:低方差特征过滤
2)相关系数 - Embedded嵌入式:算法自动选择特征(特征与目标值之间的关联)
1)决策树:信息熵、信息增益
2)正则化:L1,L2
3)深度学习:卷积等
- 模块
sklearn.feature_selection
过滤式
低方差特征过滤
- 特征方差小:某个特征大多样本的值比较相近
- 特征方差大:某个特征很多样本的值都有差别
- API
- sklearn.feature_selection.VArianceThreshold(threshold=0.0)
可以设置阈值,默认为0.0 - Variance.fit_transform(X)
X:numpy array格式的数据[m_sample,n_features]
返回值:训练集差异低于threadshold的特征将被删除
默认值是保留非零方差特征,即删除所有样本中具有相同值的特征
- 计算实例
对某些股票的指标特征进行筛选,数据文件为 factor_returns.csv
from sklearn.feature_selection import VarianceThreshold
def variance_demo():
"""
过滤低方差特征
:return:
"""
# 1、获取数据
data = pd.read_csv('factor_returns.csv')
data = data.iloc[:,1:-2] # 选取需要进行筛选的特征
print('data:\n', data)
# 2、实例化一个转换器类
#transform = VarianceThreshold()
transform = VarianceThreshold(threshold=10)
# 3、调用fit_transform
data_new = transform.fit_transform(data)
print("data_new\n", data_new, data_new.shape)
return None
if __name__ == "__main__":
variance_demo()
皮尔逊相关系数
反映变量之间相关关系密切程度的统计指标
公式:
- 特点
- 相关系数的值介于-1与+1之间
- 当r>0时,表示两变量正相关;r<0时,两变量为负相关
- 当|r|=1时,表示两变量为完全相关;当r=0时,表示两变量间无相关关系
- 当0<|r|<1时,表示两变量存在一定程度的相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近0,表示两变量的线性相关越弱
- 一般可按三级划分:|r|<0.4为低度相关;0.4<=|r|<0.7为显著相关;0.7<=|r|<1为高维线性相关
- API
- from scipy.stats import pearsonr
x:(N.)array_like
y:(N.)array_like Returns:(Perason’s correlation coefficient, p-value)
- 计算实例
from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr
def variance_demo():
"""
低方差特征过滤
:return:
"""
# 1、获取数据
data = pd.read_csv('factor_returns.csv')
print('data:\n', data)
data = data.iloc[:,1:-2]
print('data:\n', data)
# 2、实例化一个转换器类
#transform = VarianceThreshold()
transform = VarianceThreshold(threshold=10)
# 3、调用fit_transform
data_new = transform.fit_transform(data)
print("data_new\n", data_new, data_new.shape)
# 计算两个变量之间的相关系数
r = pearsonr(data["pe_ratio"],data["pb_ratio"])
print("相关系数:\n", r)
return None
if __name__ == "__main__":
variance_demo()
如果特征与特征相关性很高,可采取以下方法:
- 选取其中一个
- 加权求和
- 主成分分析
主成分分析(PCA)
主成分分析介绍
- 定义:高维数据转换为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
- 作用:是数据维数的压缩,尽可能降低原数据的维数(复杂度),损失少量信息
- 应用:回归分析或者聚类分析中
API
- sklearn.decomposition.PCA(n_components=None)
将数据分解为较低维度空间 - n_components:
小数:表示保留百分之多少的信息
整数:减少到多少特征 - PCA.fit_transform(X)
X:numpy array格式的数据[N_samples, n_features]
返回值:转换后指定维度的array
数据计算
from sklearn.decomposition import PCA
def pca_demo():
"""
PCA降维
:return:
"""
data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
# 1、实例化一个转换器类
transform = PCA(n_components=2) # 4个特征降到2个特征
# 2、调用fit_transform
data_new = transform.fit_transform(data)
print("data_new\n", data_new)
transform2 = PCA(n_components=0.95) # 保留95%的信息
data_new2 = transform2.fit_transform(data)
print("data_new2\n", data_new2)
return None
if __name__ == "__main__":
pca_demo()
data_new
[[ 1.28620952e-15 3.82970843e+00]
[ 5.74456265e+00 -1.91485422e+00]
[-5.74456265e+00 -1.91485422e+00]]
data_new2
[[ 1.28620952e-15 3.82970843e+00]
[ 5.74456265e+00 -1.91485422e+00]
[-5.74456265e+00 -1.91485422e+00]]
instacart 降维案例
探究用户对物品类别的喜好细分降维
- 数据如下:
- order_prodects_prior.csv:订单与商品信息
字段:order_id, product_id, add_to_cart_order, reordered - products.csv:商品信息
字段:product_id, product_name, aisle_id, department_id - order.csv:用户的订单信息
字段:order_id, user_id, eval_set, order_number, … - aisles.csv:商品所属具体物品类别
字段:aisle_id, aisle
- 分析:
探究用户对物品类别的喜好,则要找到用户(user_id )和物品类别(aisle)之间的关系,而这两者分属于不同的表,所以要先把用户(user_id )和物品类别(aisle)放在同一张表中。
# 1、获取数据
# 2、合并表,使得suer_id和aisle数据在同一个表中
# 3、找到suer_id和aisle之间的关系:交叉表,透视表
# 4、PAC降维
import pandas as pd
# 1、获取数据
order_products = 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')
# 2、合并表'
# 合并aisles和products
tab1 = pd.merge(aisles, products, on=["aisle_id", "aisle_id"])
tab2 = pd.merge(tab1, order_products, on=["product_id", "product_id"])
tab3 = pd.merge(tab2, orders, on=["order_id", "order_id"])
# 3、找到suer_id和aisle之间的关系
table = pd.crosstab(tab3["user_id"], tab3["aisle"])
data = table[:10000] #保存前10000条数据(数据太大,运行慢)
# 4、PAC降维,去除冗余数据(大量的0)
from sklearn.decomposition import PCA
# 1)实例化一个转换器类
transfer = PCA(n_components=0.95) # 保留95%的信息
# 2)调用fit_transform
data_new = transfer.fit_transform(data) #(10000, 42),由134个特征降维到42个