我们 马上学三点 ,
- 特征工程,从原始数据到特征
- 良好特征的特点
- 如何了解数据
特征工程
机器学习模型不能直接看到、听到或感知输入样本。 您必须创建数据表示, 为模型提供有用的信号来了解数据的关键特性。
有趣的是,当我们处理现实世界中的数据时, 数据并不会以格式规范的特征向量的形式呈现在我们面前。 相反,呈现给我们的数据是数据库记录、 协议缓冲区或其他任何形式。
我们必须从各种各样的数据源中提取数据, 然后再根据这些数据创建特征向量。 现在,从原始数据中提取特征的过程称为特征工程。
如图,将左侧矢量的每个部分映射到右侧特征矢量的一个或多个字段。
实践中,机器学习从业人员将大约75%的时间 花在特征工程方面了,特征就是我们要的东西。
接下来,我们来了解一下特征工程是如何发生的。
从原始数据到特征
映射数值
如果某个记录是一个数字, 例如房子的房间数量, 我们就可以将这个数字直接复制到一个特征向量中, 这个过程非常自然。
通过独热编码映射分类值
但是,如果我们面对的是一个字符串, 比如“Shorebird Way”,那么我们该怎么办呢?
如果见到的是字符串值, 我们通常可以使用独热编码将其转化为特征向量。
现在,独热编码针对我们可能见到的每个字符串 都提供了一个唯一的元素。
例如,如果有一个针对街道名称的独热编码, 那么每一条可能出现的街道都有一个唯一的元素。 在见到我们拥有的街道时,例如“Shorebird Way”, 我们就在针对“Shorebird Way”的元素中添加一个1, 并在针对其他任何地点的元素中分别添加一个0。 别担心0太多,我会使用稀疏表示法, 其中仅存储非零值。
我们可以将这个独热编码用作表示字符串的特征向量。 使用独热编码处理此类不常见的分类数据十分方便。
那么,什么样的特征才是好特征呢?
良好特征的特点
特征值应以非零值的形式在数据集中多次出现。
首先,一个特征应具有非零值, 并在我们的数据集中出现至少几次或更多次。
如果一个特征在具有非零值的情况下出现的次数十分少, 或仅出现过一次,恐怕就不是一个值得使用的好特征, 应该在预处理步骤中过滤掉,。
例如,手机应该使用型号(device_model:galaxy_s6), 而不是编号ID作为特征(my_device_id:8SK982ZZ1242)
特征应该具有清晰明确的含义
特征应具有清晰明确的意义, 这样一来,我们就可以进行有效的完善性检查, 排除错误,确保各项特征得到妥善处理。
例如,以年为单位来计算一座房子的房龄(user_age:23), 难度远低于以秒为单位来计算(user_age:123456789)。 排除错误和进行推理的难度要低很多。
特征不应使用“神奇”的值
实际数据内不要掺入特殊值, 特征不应使用“神奇”的值, 例如,如果我们定义一个特征, 它的作用是告诉我们一座房子上市出售多少天了,
我们可以使用特殊值负1来表示这座房子从未上市出售过。 相反,更好的主意是定义一个指示型特征, 让这个特征采用布尔值, 以便表示是否已定义“上市出售天数”特征。
因此,我们可以使用布尔值、 True/False、1-0来表示是否定义了这个特征。 借助这种方式,原特征“上市出售天数” 可以保持0到n的自然单位。
特征值不应随时间发生变化
考虑上游不稳定性, 特征值不应随时间发生变化, 这一点回到了数据的平稳性这一概念。
那么,为什么特征值有可能随时间发生变化呢? 这是因为, 我们的特征可能是从某个上游模型传到我们这里来的, 而这个上游模型可能会发生变化。 我们会希望能够获取这个模型的版本信息 并对这个模型有非常具体的了解, 或者能够从这个模型中 获取具有定义规范的恒定语义的值。
分布不应包含离谱的离群值
特征不应采用不理性的离群值。 例如,在加利福尼亚州的住房数据中, 如果我们创建一个合成特征,
例如人均房间数,即使用房间总数除以人口总数, 那么对于大多数城市街区, 我们都会得到介于每人0到3或4个房间的相对合理的值。 但是在某些城市街区,我们会得到高达50的值。 这样的值太不正常了, 我是说,这些人都住在什么地方? 像“酒店街区”这样的地方吗? 此时,我们或许可以为特征设置上限或转换特征, 以便去掉这些不理性的离群值。
理想情况下,所有特征都要转换为相似范围, 例如 (-1, 1) 或 (0, 5)。
分箱技巧
我们还可以考虑另一种技术,那就是分箱技术。 如果要探讨纬度对加利福尼亚州住房价格的影响, 我们发现并不存在由北向南的 可直接映射到住房价格上的线性关系。
但是在任何特定纬度范围内,却往往存在很强的关联。 因此,我们能做的就是, 将由北向南的纬度划分成一批小分箱。
这些小分箱每个都会变成一个布尔值特征, 此时我们就可以使用独热编码。 现在,如果您位于映射到圣迭戈的特定分箱中, 那么基本上我们会得到一个1。 或者,如果您位于映射到南湾地区的特定分箱中, 则会得到一个1; 而在其他任何地区,则会得到一个0。 借助这种方式, 我们的模型可以利用一种成本低廉的方式 将部分非线性关系映射到模型中, 而不需要采用任何特殊技术。
了解数据
了解数据是至关重要的, 将机器学习当做一个黑盒子, 把数据丢进去,却不检查数据, 就盼着能够获得好结果,这种做法并不妥当。
因为数据中会出现怪异的内容, 因此,您能做的就是: 使用直方图或散点图 以及各种排名指标将数据直观地显示出来。
您可以进行各种数据错误排除检查, 为此,在各种开发活动中, 您需要消耗大量的时间来查找重复值、缺失值、 任何看起来像离群值的内容。 任何可让您与数据互动的信息中心之类的功能 都可能会非常有用。
在现实生活中,数据集中的很多样本是不可靠的, 原因有以下一种或多种:
- 遗漏值。 例如,有人忘记为某个房屋的年龄输入值。
- 重复样本。 例如,服务器错误地将同一条记录上传了两次。
- 不良标签。 例如,有人错误地将一颗橡树的图片标记为枫树。
- 不良特征值。 例如,有人输入了多余的位数,或者温度计被遗落在太阳底下。
最后,我们要监控一段时间内的数据。
数据源昨天情况很好, 并不意味着明天情况也会很好。 因此,我们为了加强监控特征在一段时间内的稳定性 而能够采取的任何措施,都会增强系统的稳健性。
了解数据 时遵循以下规则:
- 记住您预期的数据状态。
- 确认数据是否满足这些预期 (或者您可以解释为何数据不满足预期)。
- 仔细检查训练数据是否与其他来源的数据一致。
像处理任何任务关键型代码一样谨慎处理您的数据。 良好的机器学习依赖于良好的数据。
总结:
从原始数据中提取特征的过程称为特征工程;
良好特征的特点: 避免很少使用的离散特征值,最好具有清晰明确的含义,实际数据内不要掺入特殊值 ,考虑上游不稳定性, 分布不应包含离谱的离群值 ,
了解数据,像处理任何任务关键型代码一样谨慎处理您的数据
本文转自公众号 AI产品经理总舵,原文地址
Comments