黑马程序员——三天快速入门python机器学习(三)

本文详细介绍了特征工程中的预处理步骤,包括归一化和标准化,阐述了它们的作用和区别,并提供了Python代码示例。此外,还讲解了特征降维的重要性,如低方差特征过滤、皮尔逊相关系数以及主成分分析(PCA)。PCA通过保留大部分信息来降低数据维度,适合大数据场景。文章以instacart数据为例展示了PCA在用户喜好分析中的应用。
摘要由CSDN通过智能技术生成


特征预处理

特征预处理介绍

解释:通过一些转换函数,将特征数据转换成更适合算法模型的特征数据的过程

  1. 数值数据的无量纲化
  • 归一化
  • 标准化
  1. 为什么要无量纲化:

特征的单位或者大小相差较大,或者某特征的方法相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征

  1. 特征预处理API
sklearn.preprocessing

归一化

定义:通过对原始数据进行变换,把数据映射到某一区间(默认为[0,1])

  1. 公式
    在这里插入图片描述
    作用于每一列,max为一列的最大值,min为一列的最小值,X''为最终结果,mx,mi 分别为指定区间值,默认mx为1 ,mi为0
  2. API
  • sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)…)
  • MinMaxScaler.fit_transform(X)
    X:numpy array格式的数据[n_samples,n_features]
    返回值:转换后的形式相同的array
  1. 数据计算实例

对以下数据进行运算,在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()
  1. 归一化总结
    注意最大最小值是变化的,并且,最大最小值容易受到异常点的影响,所以这种方法的鲁棒性较差,只适合于传统精确小数据场景。

标准化

定义:通过对原始数据进行变换,把数据变换到均值为0,标准差为1

  1. 公式
    在这里插入图片描述
  2. 归一化和标准化的对比
    在这里插入图片描述
  • 归一化:如果出现异常点,影响了最大最小值,结果显然会发生变化。
  • 标准化:少量异常点对平均值的影响并不大,从而方差改变较小。
  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()
  1. 适用场景
    在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

特征降维

降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组不相关主变量的过程
在这里插入图片描述

在训练模型时我们都是用特征进行学习的,如果特征本身 存在问题或者特征之间相关性较强,对算法的学习预测影响较大

  1. 降维的两种方式
  • 特征选择
  • 主成分分析

特征选择

定义:数据中包含冗余或相关变量(或称特征、属性、指标等),特征选择旨在从原有特征中找出主要特征

  1. 方法
  • Filter过滤式:主要探究特征本身特点、特征与特征和目标值之间关联
    1)方差选择法:低方差特征过滤
    2)相关系数
  • Embedded嵌入式:算法自动选择特征(特征与目标值之间的关联)
    1)决策树:信息熵、信息增益
    2)正则化:L1,L2
    3)深度学习:卷积等
  1. 模块
    sklearn.feature_selection

过滤式

低方差特征过滤
  • 特征方差小:某个特征大多样本的值比较相近
  • 特征方差大:某个特征很多样本的值都有差别
  1. API
  • sklearn.feature_selection.VArianceThreshold(threshold=0.0)
    可以设置阈值,默认为0.0
  • Variance.fit_transform(X)
    X:numpy array格式的数据[m_sample,n_features]
    返回值:训练集差异低于threadshold的特征将被删除
    默认值是保留非零方差特征,即删除所有样本中具有相同值的特征
  1. 计算实例
    对某些股票的指标特征进行筛选,数据文件为 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与+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为高维线性相关
  1. API
  • from scipy.stats import pearsonr
    x:(N.)array_like
    y:(N.)array_like Returns:(Perason’s correlation coefficient, p-value)
  1. 计算实例
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 降维案例

探究用户对物品类别的喜好细分降维

  1. 数据如下:
  • 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
  1. 分析:
    探究用户对物品类别的喜好,则要找到用户(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个

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傅里叶不变坏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值