【机器学习】笔记 2、特征工程

特征工程

  • 特征抽取
  • 数据特征的预处理
  • 特征选择
  • 为什么需要特征工程
    • 样本数据中的特征有可能会存在缺失值i,重复值,异常值等等,那么我们是需要对特征中的相关的噪点数据进行处理的,那么处理的目的就是为了营造出一个更纯净的样本集,让模型基于这组数据可以有更好的预测能力。当然特征工程不单单只是处理上述操作!
  • 什么是特征工程
  • 特征工程的意义
    • 直接影响模型预测的结果
  • 如何实现特征工程
    • 工具-sklearn
  • sklearn介绍
    • 是python语言中的机器学习工具,包含了很多知名的机器学习算法的实现,起文档完善,容易上手
    • 功能
      • 分类模型
      • 回归模型
      • 聚类模型
      • 特征工程

特征抽取

  • 目的:将字符串转换成数字
  • 演示后的结论:
    • 特征抽取对文本等数据进行特征值化。特征值化是为了让机器更好的理解数据。
  • 字典特征抽取
    • API :from sklearn.feature_extraction import DictVectorizer
  • one-hot
  • from sklearn.feature_extraction.text import CountVectorizer
    
    import pandas as pd
    if __name__ == '__main__':
    
        df = pd.DataFrame([
            ['green','M',20,'class1']
            ,['red','L',21,'class2']
            ,['blue','XL',30,'class3']])
        df.columns = ['color','size','weight','class label']
    
        #    color size  weight class label
        # 0  green    M      20      class1
        # 1    red    L      21      class2
        # 2   blue   XL      30      class3
        print(df)
    
        #    blue  green  red
        # 0     0      1    0
        # 1     0      0    1
        # 2     1      0    0
        print(pd.get_dummies(df['color']))#one-hot编码
    
        # 中文文本特征抽取
        vector = CountVectorizer()
        res = vector.fit_transform(['人生苦短,我用pytthon','人生漫长,不用python'])
        
        #   (0, 2)	1
        #   (0, 3)	1
        #   (1, 1)	1
        #   (1, 0)	1
        print(res)#sparse矩阵
        
        # ['不用python', '人生漫长', '人生苦短', '我用pytthon']
        print(vector.get_feature_names())
    
        # [[0 0 1 1]
        #  [1 1 0 0]]
        print(res.toarray())#将sparse矩阵转换成数组
        
    
        enRes = vector.fit_transform(['life is is short,i love python','life is too long,i hate pyhton'])
        
        # 注意:单字母不统计,应为单个字母代表不了实际含义,然后每个数字表示的是单词出现的次数
        # ['hate', 'is', 'life', 'long', 'love', 'pyhton', 'python', 'short', 'too']
        print(vector.get_feature_names())
        
        # [[0 2 1 0 1 0 1 1 0]
        #  [1 1 1 1 0 1 0 0 1]]
        print(enRes.toarray())

特征预处理:对数值型的数据进行处理

  • 无量纲化
    • 将不同规格的数据转换成同一规格,或不同分布的数据转换到某个特定分布
  • 含义:特征抽取后我们就可以获取对应的数值型的样本数据啦,然后就可以进行数据处理了
  • 概念:通过特定的统计方法(数学方法),将数据转换成算法要求的数据
  • 方式:
    • 归一化
      • 归一化的实现:通过对原始数据进行交换把数据映射到(默认为[0,1])之间
      • 公式:X'=(x-min)/(max-min)    X''=X'*(mx-mi) + mi
      • 注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X‘’为最终结果,mx,mi分别为指定的区间值,默认mx为1,mi为0
    •     from sklearn.preprocessing import MinMaxScaler
          mm = MinMaxScaler(feature_range=(0,1))#每个特征缩放的范围
          data = [[90,2,10,40],[60,5,15,45],[73,3,13,45]]
          data = mm.fit_transform(data)#X需要归一化的特征
          print("归一化结果")
          # [[1.         0.         0.         0.        ]
          #  [0.         1.         1.         1.        ]
          #  [0.43333333 0.33333333 0.6        1.        ]]
          print(data)

    • 标准化
      • 当数据按照、均值中心化后,再按标准差缩放,数据就会服从均值为0、方差为1的正态分布(即标准正态分布),而这个过程,就叫做数标准化
      • 公式“X' = (x-mean)/ δ
      • 注:作用于每一列,mean为平均值,δ为标准差
    •     # 标准化
          from sklearn.preprocessing import StandardScaler
          ss = StandardScaler()
          data = [[90,2,10,40],[60,5,15,45],[73,3,13,45]]
          data = ss.fit_transform(data)
          # 打印标准化结果
          # [[ 1.27540458 -1.06904497 -1.29777137 -1.41421356]
          #  [-1.16685951  1.33630621  1.13554995  0.70710678]
          #  [-0.10854507 -0.26726124  0.16222142  0.70710678]]
          print(data)

  • 归一化和标准化总结
    • 对于归一化来说,如果出现了异常值则会响应特征的最大最小值,那么最终结果会受到比较大的影响
    • 对于标准化来说,如果出现异常点,由于具有异地那个的数据量,少量的异常点对于平均值的影响并不大,从而标准差改变的比较少。
    • StandardScaler和MinMaxScaler选哪个
      • 看情况。大多数机器学习算法中,会选择standarScaler来将进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择。MinMaxScaler在不涉及距离度量、梯度、协方差计算以机数据需要被压缩到特定区间是使用广泛,比如数字图像处理中量化像素强度时,都会使用MinMaxScaler将数据压缩于[0,1]区间之中
      • 建议先试试StandardScaler,效果不好换MinMaxScaler

 

特征选择

  • 原因
    • 冗余:部分特征的相关度高,容易消耗计算机的性能
    • 噪点:部分特征对预测结果有偏执影响
  • 实现
    • 人为对不相关的特征将进行主观舍弃
    • 在已有特征和对应预测结果的基础上,使用相关的工具过滤掉一些无用或权重较低的特征。(Filter、Embedded、PCA)
      • Filter(过滤式)
        • 方差过滤:通过特征本身的方差来筛选特征的类。比如一个特征本身的方差很小,就表示样本在这个特征上基本没有差异,可能特征中的大多数值都一样,那这个特征对于样本区分没有作用。所以要优先消除方差为0或者方差极低的特征。
        • API:from sklearn.feature_selection import VarianceThreshold
        •     from sklearn.feature_selection import VarianceThreshold
              #threshold为方差的值,删除所有方差低于阈值的特征,默认值为0表示保留所有方差为非0的特征
              v = VarianceThreshold(threshold=3)
              # 
              v2 = v.fit_transform([[0,2,4,3],[0,3,7,3],[0,9,6,3]])
              # 输出结果 
              # [[2]
              #  [3]
              #  [9]]
              print(v2)

           

        • 如果方差过滤后剩余特征还有很多,且模型的效果没有显著提升,则方差也可以帮助我们将特征选择【一部到位】。留下一半的特征,那可以设定一个让特征总数减半的方差阈值,只要找到特征方差的中位数,再将这个中位数作为threshold参数的值输入就好了。

        •     import numpy as np
              # 造一个特征矩阵
              feature = np.random.randint(0,100,size=(5,10))
              print(feature)
              # 计算特征方程的中位数
              med = np.median(feature.var(axis=0))
              # 将中位数设置为过滤阈值
              v = VarianceThreshold(threshold=med)
              # 特征过滤
              V2 = v.fit_transform(feature)
              print(V2)

      • Embedded(嵌入式)
        • PCA降维(主成分分析)
          • 是一种分析,简化数据集的技术。
          • 降维的纬度值就是特征的种类
          • 作用:可以削减回归分析或者聚类分析中特征的数量
          •     from sklearn.decomposition import PCA
                # 将数据分解为较低维度的空间
                # n_components可以为小数(保留特征的百分比),整数(减少到特征数量)
                pca = PCA(n_components=2)
                r = pca.fit_transform([[0,2,4,3],[0,3,7,3],[0,9,6,3]])
                # [[-2.88362421 -1.25443227]
                #  [-1.45140588  1.56492061]
                #  [ 4.33503009 -0.31048834]]
                print(r)

      •  

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值