当前位置:   article > 正文

黑马程序员——三天快速入门python机器学习(三)_机器学习约会对象数据集

机器学习约会对象数据集


特征预处理

特征预处理介绍

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

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

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

  1. 特征预处理API
sklearn.preprocessing
  • 1

归一化

定义:通过对原始数据进行变换,把数据映射到某一区间(默认为[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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
皮尔逊相关系数

反映变量之间相关关系密切程度的统计指标
公式:
在这里插入图片描述

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

如果特征与特征相关性很高,可采取以下方法:

  • 选取其中一个
  • 加权求和
  • 主成分分析

主成分分析(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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
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]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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个
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

总结

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/160959
推荐阅读
相关标签
  

闽ICP备14008679号