特征工程概述

机器学习之特征工程

1.特征工程的定义

1.1为什么需要特征工程

  • 样本数据中的特征有可能会存在缺失值,重复值,异常值等,需要对特征中的相关的噪点数据进行处理
    • 处理目的:有一个更纯净的样本集,让模型基于这组数据可以有更好的预测能力…

1.2什么是特征工程

  • 特征工程是将原始数据转换为更好能代表预测模型的潜在问题的特征过程,从而提高对未知数据预测的准确性
    • 比如:AlphaGo学习的数据中既有棋谱,又有食谱和歌词,一些干扰数据绝对会影响AlphaGo的学习

1.3特征工程的意义

  • 直接会影响模型预测的结果

1.4实现特征工程

  • 使用工具:sklearn
  • sklearn介绍
    • 是python语言中的机器学习工具,包含了很多知名的机器学习算法的实现,其文档完善,容易上手
    • 功能
      • 分类模型,回归模型,聚类模型,特征工程

2.特征提取

2.1目的

  • 样本中的特征数据很多时候为字符串或者其他类型的数据,计算机只可以识别二进制数值型的数据,如果把字符串给计算机,计算机不能识别【如果不是数值型数据,识别不了】
  • 特征抽取对文本等数据进行特征值化【将数据转为数值型数据】,特征值化是为了让机器更好的理解数据

2.2特征提取的方式

2.2.1字典特征提取
  • 作用:对字典数据进行特征值化
from sklearn.feature_extraction import DictVectorizer
fit_transform(X) #X为字典或者包含字典的迭代器,返回值为sparse矩阵
inverse_transform(X) #X为sparse矩阵或者array数组,返回值为转换之前的数据格式
transform(X) #按照原先的标准转换
get_feature_names() #返回类别名称
  • 示例代码
from sklearn.feature_extraction import DictVectorizer
alist=[
    {"city":'AHui','temp':33},
    {'city':'GZ','temp':42},
    {'city':'SH','temp':40}
]

d=DictVectorizer()  #实例化一个工具类对象
feature=d.fit_transform(alist)  #返回一个sparse矩阵(存储的就是特征值化之后的结果)
print(feature)
#   (0, 0)	1.0
#   (0, 3)	33.0
#   (1, 1)	1.0
#   (1, 3)	42.0
#   (2, 2)	1.0
#   (2, 3)	40.0
print(d.get_feature_names())
# ['city=AHui', 'city=GZ', 'city=SH', 'temp']
print(feature.toarray())
# [[ 1.  0.  0. 33.]
#  [ 0.  1.  0. 42.]
#  [ 0.  0.  1. 40.]]
  • sparse矩阵的理解

    • DictVectorizer类的构造方法中设定sparse=False,则返回的就不是sparse矩阵,而是一个数组
    • sparse矩阵就是一个变相的数组或者列表,目的是为了节省内存
  • 示例代码

from sklearn.feature_extraction import DictVectorizer
alist=[
    {"city":'AHui','temp':33},
    {'city':'GZ','temp':42},
    {'city':'SH','temp':40}
]
d=DictVectorizer(sparse=False)
#返回一个二维列表
fature=d.fit_transform(alist)
print(d.get_feature_names())    # ['city=AHui', 'city=GZ', 'city=SH', 'temp']
print(feature)
#输出结果:1为是,0为不是
                               # [[ 1.  0.  0. 33.]  
                               #  [ 0.  1.  0. 42.]
                                # [ 0.  0.  1. 40.]]
2.2.2 文本特征提取
  • 作用:对文本数据进行特征值化

    from sklearn.feature_extraction.text import CountVectorizer
    fit_transform(X) #X为文本或者包含文本字符串的可迭代对象,返回sparse矩阵
    inverse_transform(X) #X为sparse矩阵或者array数组,返回值为转换之前的数据格式
    toarray() #将sparse矩阵转化为数组
    
    • 示例代码

      from sklearn.feature_extraction.text import CountVectorizer
      vector=CountVectorizer()
      res=vector.fit_transform(['lift is is short,I love python','lift is too long,I hate python'])
      print(res)#sparse矩阵
      #   (0, 2)	1
      #   (0, 1)	2
      #   (0, 6)	1
      #   (0, 4)	1
      #   (0, 5)	1
      #   (1, 2)	1
      #   (1, 1)	1
      #   (1, 5)	1
      #   (1, 7)	1
      #   (1, 3)	1
      #   (1, 0)	1
      print(vector.get_feature_names())
      #['hate', 'is', 'lift', 'long', 'love', 'python', 'short', 'too']
      print(res.toarray())#将sparse矩阵转换成数组
      # [[0 2 1 0 1 1 1 0]
      #  [1 1 1 1 0 1 0 1]]
      #注意:单字母不统计(因为单个字母代表不了实际含义),然后每个数字表示的是单词出现的次数
      
  • 中文文本特征提取【对有标点符号的中文文本进行特征提取】

    from sklearn.feature_extraction.text import CountVectorizer
    vector=CountVectorizer()
    res=vector.fit_transform(['人生苦短 我用python','人生满长,不用python'])
    print(res)
    # (0, 2)	1
    #   (0, 3)	1
    #   (1, 1)	1
    #   (1, 0)	1
    print(vector.get_feature_names())
    ['不用python', '人生满长', '人生苦短', '我用python']
    print(res.toarray())
    # [[0 0 1 1]
    #  [1 1 0 0]]
    
  • 中文文本特征提取【对有标点符合且有空格分隔的中文文本进行特征提取】【注意:单个汉字不统计】

    from sklearn.feature_extraction.text import CountVectorizer
    vector=CountVectorizer()
    res=vector.fit_transform(['人生 苦短, 我 用python','人生 漫长, 不用 python'])
    print(res)
    # (0, 2)	1
    #   (0, 5)	1
    #   (0, 4)	1
    #   (1, 2)	1
    #   (1, 3)	1
    #   (1, 1)	1
    #   (1, 0)	1
    print(vector.get_feature_names())
    # ['python', '不用', '人生', '漫长', '用python', '苦短']
    print(res.toarray())
    # [[0 0 1 0 1 1]
    #  [1 1 1 1 0 0]]
    
  • 目前CountVectorizer只可以对有标点符号和用分隔符对应的文本进行特征提取,满足不了需求【在自然语言处理中,我们是需要将一段中文文本中相关的词语,成语,形容词…都要进行提取的】

2.2.3jieba分词
  • 对中文文章进行分词处理

  • 使用

    #基本使用:对文章进行分词
    import jieba
    jb = jieba.cut('我是一个好人')
    content = list(jb)
    ct = ' '.join(content)
    print(ct) #返回空格区分的词语
    
    import jieba
    from sklearn.feature_extraction.text import CountVectorizer
    jb1=jieba.cut('人生苦短,我用python,你觉得我说的对吗?')
    ct1=" ".join(list(jb1))
    print(ct1)
    # 人生 苦短 , 我用 python , 你 觉得 我 说 的 对 吗 ?
    jb2=jieba.cut('人生满长,不用python,你说我说的对不对?')
    ct2=" ".join(list(jb2))
    print(ct2)
    # 人生 满长 , 不用 python , 你 说 我 说 的 对 不 对 ?
    vector=CountVectorizer()
    res=vector.fit_transform([ct1,ct2])
    print(res)
    #   (0, 2)	1
    #   (0, 5)	1
    #   (0, 3)	1
    #   (0, 0)	1
    #   (0, 6)	1
    #   (1, 2)	1
    #   (1, 0)	1
    #   (1, 4)	1
    #   (1, 1)	1
    print(vector.get_feature_names())
    # ['python', '不用', '人生', '我用', '满长', '苦短', '觉得']
    print(res.toarray())
    # [[1 0 1 1 0 1 1]
    #  [1 1 1 0 1 0 0]]
    

2.3onhot编码

  • sparse矩阵中的0和1就是onehot编码
    在这里插入图片描述

  • 为什么需要onehot编码

    • 特征抽取主要目的就是对非数值型的数据进行特征值化!如果现在需要对下图中的human和alien进行手动特征值化Alien为4,human为1。则1和4有没有优先级或者权重大小之分呢?
      在这里插入图片描述

    • 基于pandas实现onehot编码【pd.get_dummies(df['col']

      import pandas as pd
      df=pd.DataFrame([
          ['green','M',20,'class1'],
          ['red','L',21,"class2"],
          ['blue','XL',30,'class3']
      ])
      df.columns=['color','size','weight','class label']
      #将color这一列变成one-hot编码
      pd.get_dummies(df['color'])
      
      #		blue	green	red
      #	0	0		1		0
      #	1	0		0		1
      #	2	1		0		0
      
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荼靡~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值