码迷,mamicode.com
首页 > 其他好文 > 详细

特征工程

时间:2018-10-16 17:38:35      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:一起   alt   素数   选择   enter   法国   朋友   text   14.   

特征工程指的是将原始数据转换为特征矢量。

机器学习模型通常期望样本表示为实数矢量。这种矢量的构建方法如下:为每个字段衍生特征,然后将它们全部连接到一起。

技术分享图片

图1. 特征工程将原始数据映射到机器学习特征

映射数值

机器学习模型根据浮点值进行训练,因此整数和浮点原始数据不需要特殊编码。正如图2所示,将原始整数值6转换为特征值6.0是没有意义的。

技术分享图片

图2. 将整数值映射到浮点值

映射字符串值

模型无法通过字符串值学习规律,因此需要进行一些特征工程来将这些值转换为数字形式:

  1. 首先,为要表示的所有特征的字符串值定义一个词汇表。对于street_name特征,该词汇表中将包含我们知道的所有街道。

  2. 然后,使用该词汇表创建一个one-hot编码,用于将特定字符串值表示为二元矢量。在该矢量(与指定的字符串值对应)中:

    • 只有一个元素设为1。
    • 其他元素均设为0。

   该矢量的长度等于词汇表中的元素数。

图3显示了某条特定街道(Shorebird Way)的one-hot编码。在此二元矢量中,代表Shorebird Way的元素的值为1,而代表所有其他街道的元素的值为0。

技术分享图片

图3. 通过one-hot编码映射字符串值

映射分类(枚举)值

分类特征具有一组离散的可能值。例如,名为Lowland Countries的特征只包含3个可能值:

  {‘Netherlands‘, ‘Belgium‘, ‘Luxembourg‘}

有些朋友可能会将分类特征(如Lowland Countries)编码为枚举类型或表示不同值的整数离散集。例如:

  • 将荷兰表示为0
  • 将比利时表示为1
  • 将卢森堡表示为2

不过,机器学习模型通常将每个分类特征表示为单独的布尔值。例如,Lowland Countries在模型中可以表示为3个单独的布尔值特征:

  • 技术分享图片:是荷兰吗?
  • 技术分享图片:是比利时吗?
  • 技术分享图片:是卢森堡吗?

采用这种方法编码还可以简化某个值可能属于多个分类这种情况(例如,“与法国接壤”对于比利时和卢森堡来说都是True)。

 

良好特征的特点

  避免很少使用的离散特征值

良好的特征值应该在数据集中出现大约5次以上(至于这个数字是怎么来的,我也不知道)。这样一来,模型就可以学习该特征值与标签是如何关联的。也就是说,大量离散值相同的样本可让模型有机会了解不同设置中的特征,从而判断何时可以对标签很好地做出预测。例如,house_type特征可能包含大量样本,其中它的值为victorian:

house_type: victorian

相反,如果某个特征的值仅出现一次或者很少出现,则模型就无法根据该特征进行预测。例如,unique_house_id就不适合作为特征,因为每个值只使用一次,模型无法从中学习任何规律:

  unique_house_id: 8SK982ZZ1242Z

  最好具有清晰明确的定义

    每个特征对于项目中的任何人来说都应该具有清晰明确的含义。例如,下面房龄适合作为特征,可立即识别为年龄:

      house_age: 27

    相反,对于下方特征值的含义,除了创建它的工程师,其他人恐怕辨识不出:

      house_age: 851472000

    在某些情况下,混乱的数据(而不是糟糕的工程选择)会导致含义不清晰的值。例如,一下user_age的来源没有检查值恰当与否:

      user_age: 277

    不要将“神奇”的值与实际数据混为一谈

  良好的浮点特征不包含超出范围的异常断点或“神奇”的值。例如,假设一个特征具有0到1之间的浮点值。那么,如下值是可以接受的:

      quality_rating: 0.82

      quality_rating: 0.37

    不过,如果用户没有输入quality_rating,则数据集可能使用如下神奇值来表示不存在该值:

      quality_rating: -1

    为解决神奇值的问题,需将该特征转换为两个特征:

    • 一个特征只存储质量评分,不含神奇值。
    • 一个特征存储布尔值,表示是否提供了quality_rating。为该布尔值特征制定一个名称,例如is_quality_rating_defined。

  考虑上游不稳定性

    特征的定义不应该随时间发生变化。例如,下列值是有用的,因为城市名称一般不会改变。(注意,我们仍然需要将“br/sao_paulo”这样的字符串转换为one-hot矢量。)

      city_id: "br/sao_paulo"

    但收集由其他模型推理的值会产生额外成本。可能值“219”目前代表圣保罗,但这种表示在未来运行其他模型时可能轻易发生变化:

      inferred_city_cluster: "219"

特征工程

标签:一起   alt   素数   选择   enter   法国   朋友   text   14.   

原文地址:https://www.cnblogs.com/Peyton-Li/p/9798814.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!