美文网首页
机器学习1(特征工程)

机器学习1(特征工程)

作者: xinmin | 来源:发表于2019-07-19 00:41 被阅读0次

    机器学习概述

    • 机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测

    数据集的组成

    • 机器学习的数据:多数都是文件CSV
    • 不用mysql等数据库:1、性能瓶颈、读取速度 2、格式不太符合机器学习的要求的格式
    • pandas:读取工具
    • numpy: 释放了GIL锁

    可用的数据集

    • kaggle特点:1、大数据竞赛平台 2、80万科学家 3、真实数据 4、数据量巨大
    • scikit-learn特点:1、数据量较小 2、方便学习
    • UCI特点:1、收录360个数据集 2、覆盖科学、生活、经济等领域 3、数据量几十万

    常用数据集的数据结构组成

    • 特征值 + 目标值


      图片.png
    • pandas:一个数据读取非常方便以及基本的处理格式的工具
    • sklearn: 对于特征的处理提供强大的接口

    1、特征抽取

    • 对文本等数据进行特征值化(是为了计算机更好的去理解数据)
      API:sklearn.feature_extraction

      • 字典数据特征抽取
        1、实例化:DictVectorizer
        2、调用:fit_transform
        例子:
          from sklearn.feature_extraction import DictVectorizer
        
        
          def dictvec():
              data_list = [
                  {'city': '北京', 'temp': 100},
                  {'city': '上海', 'temp': 60},
                  {'city': '广州', 'temp': 120},
                  {'city': '成都', 'temp': 80}
              ]
        
              # 1、实例化
              mydict = DictVectorizer()
              # 2、调用fit_transform
              data = mydict.fit_transform(data_list)
              print(data)
              return None
        
        if __name__ == '__main__':
        
            dictvec()
        

        输出,sparse矩阵


        图片.png

        如果实例化时,进行了设置,则如下

        # 1、实例化
          mydict = DictVectorizer(sparse=False)
        

        结果:ndarry 二维数组


        图片.png
        • 字典数据抽取:把字典中一些类别数据,分别进行转换成特征
      • 文本特征抽取
        作用:对文本特征值化
        类:sklearn.feature_extraction.text.CountVectorizer
        使用与字典数据抽取类似,例子
        from sklearn.feature_extraction.text import CountVectorizer
        
        
        def countvec():
            # 对文本进行特征值化
            cv = CountVectorizer()
        
            data = cv.fit_transform(['life is short, i like python',
                               'life is too long, i dislike python'])
        
            print(cv.get_feature_names())
        
            print(data.toarray())
        
            return None
        
        if __name__ == '__main__':
            countvec()
        

        结论:(1、单个字母不统计 2、统计文章中所有的词,3、记录在词列表中出现的次数)


        图片.png

        针对中文:(需要使用jieba库进行分词)


        图片.png
        中文特征抽取例子:
        from sklearn.feature_extraction.text import CountVectorizer
        import jieba
        
        
        def countvec():
            # 对文本进行特征值化
            cv = CountVectorizer()
        
            data = cv.fit_transform(['人生苦短,我用python',
                                 'life is too long, i dislike python'])
        
            # print(cv.get_feature_names())
        
            # print(data.toarray())
        
            return None
        
        
        def cutword():
        
            con1 = jieba.cut('人生若只如初见,何事秋风悲画扇。')
            con2 = jieba.cut('春浅,红怨,掩双环。微雨花间,昼闲。无言暗将红泪弹。阑珊,香销轻梦还。')
            con3 = jieba.cut('斜倚画屏思往事,皆不是,空作相思字。记当时垂柳丝,花枝,满庭蝴蝶儿。')
        
            content1 = list(con1)
            content2 = list(con2)
            content3 = list(con3)
        
            c1 = ' '.join(content1)
            c2 = ' '.join(content2)
            c3 = ' '.join(content3)
        
            return c1, c2, c3
        
        def hanzivec():
        
            c1, c2, c3 = cutword()
        
            print(c1, c2, c3)
            # 中文特征值化
            cv = CountVectorizer()
        
            data = cv.fit_transform([c1, c2, c3])
        
            print(cv.get_feature_names())
        
            print(data.toarray())
        
            return None
        
        
        if __name__ == '__main__':
            # countvec()
            hanzivec()
        

        结果:


        图片.png
    • tf:term frequency 词的频率 出现的次数

    • idf:inverse document frequency 逆文档频率 计算方式: log(总文档数量/该词出现的文档数量)

    • tf * idf:重要性程度
      例子:

      from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
      import jieba
      
      def cutword():
      
          con1 = jieba.cut('人生若只如初见,何事秋风悲画扇。')
          con2 = jieba.cut('春浅,红怨,掩双环。微雨花间,昼闲。无言暗将红泪弹。阑珊,香销轻梦还。')
          con3 = jieba.cut('斜倚画屏思往事,皆不是,空作相思字。记当时垂柳丝,花枝,满庭蝴蝶儿。')
      
          content1 = list(con1)
          content2 = list(con2)
          content3 = list(con3)
      
          c1 = ' '.join(content1)
          c2 = ' '.join(content2)
          c3 = ' '.join(content3)
      
          return c1, c2, c3
      
      def tfidfvec():
      
          c1, c2, c3 = cutword()
      
          print(c1, c2, c3)
          # 中文特征值化
          cv = TfidfVectorizer()
      
          data = cv.fit_transform([c1, c2, c3])
      
          print(cv.get_feature_names())
      
          print(data.toarray())
      
          return None
      
      if __name__ == '__main__':
      
          tfidfvec()
      

      结果


      图片.png

    2、特征预处理

    • 定义:通过特定的统计方法(数学方法)数据转换成算法要求的数据
      数值型数据:
      —> 标准缩放 1、归一化 2、标准化 3、缺失值
      类别型数据:one-hot 编码
      时间类型:时间的切分
    • API:sklearn.preprocessing
      • 归一化
        通过对原始数据进行变换把数据映射到(默认为[0,1])之间
        计算公式:

        图片.png
        sklearn归一化API:sklearn.preprocessing.MinMaxScaler
        例子:
         from sklearn.preprocessing import MinMaxScaler
         
         def mm():
             mm = MinMaxScaler()
             data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
             print(data)       
             return None
        
        if __name__ == '__main__':
           mm()
        

        结果:


        图片.png

        如果在MinMaxScaler(feature_range=(2, 3))指定区间
        结果:

        图片.png

        特征同等重要的时候:进行归一化
        目的:使得某一个特征对最终结果不会造成更大的影响
        归一化的总结:


        图片.png
    • 标准化
      1、特点:通过对原始数据进行变换把数据变换到均值为0,标准差为1的范围内
      图片.png
      综合对比:
      图片.png
      sklearn标准差API:sklearn.preprocessing.StandardScaler
      例子:
      from sklearn.preprocessing import StandardScaler
          
      def stand():
          std = StandardScaler()
          data = std.fit_transform([[1., -1., 3.],[2., 4., 2.],[4., 6., -1.]])
          print(data)       
          return None
      
      if __name__ == '__main__':
          stand()
      

      结果:


      图片.png

      标准化总结:
      在已有样本足够多的情况下比较稳定,适合现代嘈杂的大数据场景。

    • 缺失值
      处理方法:
      图片.png
      可使用replace('?', 'np.nan')替换‘缺失值’为np.nan格式,属于float类型
      例子:
      from sklearn.preprocessing import imputer
      import numpy as np
          
      def im():
          im = imputer(missing_values='NaN', strategy='mean', axis=0)
          data = im.fit_transform([[1, 2], [np.nan, 3],[7, 6]])
          print(data)       
          return None
      
      if __name__ == '__main__':
          im()
      

      结果:


      图片.png

    3、降维:这里的维度指的是特征的数量

    • 特征选择
      特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值,也可以不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中一部分特征。

      图片.png
      图片.png
      • 过滤式:从方差大小的角度来考虑所有样本这个特征的数据情况
        API:sklearn.feature_selection.VarianceThreshold
        例子:
      from sklearn.feature_selection import VarianceThreshold
          
      def var():
          """
          s特征选择-删除低方差特征
          """
          var = VarianceThreshold(threshold=0.0)
          data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3],[0, 1, 1, 3]])
          print(data)       
          return None
      
      if __name__ == '__main__':
          var()
      

      结果:

      图片.png
      如果var = VarianceThreshold(threshold=1.0),则结果是:
      图片.png
    • 主成分分析(PCA)
      API:sklearn.decomposition
      特征数量达到上百的时候,考虑数据的简化特征

      图片.png
      PCA的计算公式: 图片.png
      PCA语法:
      PCA(n_components=None):将数据分解为低维数空间
      n_components 为小数(通常90%-95%)或整数(减少到的特征数量,一般不使用)
      例子:
      from sklearn.decomposition import PCA
          
      def pca():
          """
          主成分分析,进行特征降维
          """
          pca = PCA(n_components=0.9)
          data =pca.fit_transform([2, 8, 4, 5], [6, 3, 0, 8],[5, 4, 9, 1]])
          print(data)       
          return None
      
      if __name__ == '__main__':
          pca()
      

      结果:


      图片.png

    相关文章

      网友评论

          本文标题:机器学习1(特征工程)

          本文链接:https://www.haomeiwen.com/subject/wtbxlctx.html