特征工程&&清洗数据

特征工程


将原始数据映射到特征


咱们在进行机器学习的时候,采用的数据样本每每是矢量(特征矢量),而咱们的原始数据并非以矢量的形式呈现给咱们的,这是便须要将数据映射到特征html

整数和浮点数映射

直接映射便ok(虽然机器学习是根据浮点值进行的训练,可是不须要将整数6转换为6.0,这个过程是默认的)服务器

字符串映射

好多时候,有的特征是字符串,好比此前训练的加利福尼亚房产数据集中的街区名称,机器学习是没法根据字符串来学习规律的,因此须要转换。可是存在一个问题,若是字符特征是''一环'' ''二环'' ''三环''...(表明某个城市的地理位置),那么对其进行数值转换的时候,是不能够编码为形如1,2,3,4...这样的数据的,由于其存在数据大小的问题,学习模型会把他们的大小关系做为特征而学习,因此咱们须要引入独热编码,(具体解释见连接,解释的很好)机器学习

寻找良好特征(的特色)


当获得特征以后,仍是要进行筛选的,由于有的特征没有参考价值,就像咱们的在作合成特征的时候,正常的特征数据是人均几间房间,而有的人是几十间,这明显没有参考价值
良好特征的几点原则学习

  • 避免不多使用的离散特征值:若是只是出现了一两次的特征几乎是没有意义的
  • 最好具备清晰明确的含义:特征的含义不只仅是让机器学习的模型学习的,人也要知道其具体的含义,否则不利于分析数据(最好将数值很大的秒转换为天数,或者年,让人看起来直观一些)
  • 将“神奇”的值与实际数据混为一谈:有些特征中会出现一些"神奇的数据",固然这些数据并非不多的特征,而是超出范围的异常值,好比特征应该是介于0——1之间的,可是由于这个数据是空缺的,而采用的默认数值-1,那么这样的数值就是"神奇",解决办法是,将该特征转换为两个特征:测试

    • 一个特征只存储质正常范围的值,不含神奇值。
    • 一个特征存储布尔值,表示的信息为是否为空
  • 考虑上游不稳定性:由经验可知,特征的定义不该随时间发生变化,表明城市名称的话,那么特征值始终都该是城市的名称,可是有的时候,上游模型将特征值处理完毕后,返还给下游模型的却变成了数值,这样是很差的,由于这种表示在将来运行其余模型时可能轻易发生变化,那么特征就乱套了

清理数据(整理数据)


清理数据,顾名思义,就是将数据清理(整理一下).....好像是废话。
在上一步后,咱们如今获得的数据已经所有是数值化的特征了,(这里确定有可是的),可是,这样的数据直接拿过来训练效果仍是会很糟糕,由于其中存在许许多多的坏数据,就是一些值不是那么正常的数据,像以前说的那种数值特别大的就属于这一种,固然除了数值异常的还有许许多多种的坏数据,下面就来看一看有哪些方法对付这些妖艳贱货编码

缩放特征值

缩放是指将浮点特征值从天然范围(例如 100 到 900)转换为标准范围(例如 0 到 1 或 -1 到 +1)。若是某个特征集只包含一个特征,则缩放能够提供的实际好处微乎其微或根本没有。不过,若是特征集包含多个特征,则缩放特征能够带来如下优点:spa

  • 帮助梯度降低法更快速地收敛(各个特征数值小,这样算的跨的步子大呀)。
  • 帮助避免“NaN 陷阱”。当某个值在训练期间超出浮点精确率限制时,数值会变成NaN,而且模型中的全部其余数值最终也会因数学运算而变成 NaN。( NaN)
_NaN_,是Not a Number的缩写,在IEEE浮点数算术标准(IEEE 754)中定义,表示一些特殊数值(无穷与非数值(_NaN_)),为许多CPU与浮点运算器所采用。
  • 帮助模型为每一个特征肯定合适的权重。若是没有进行特征缩放,则模型会对范围较大的特征投入过多精力。(由于若是其余的特征范围过大,模型在训练的时候会认为此种模型的权值大,进而影响模型的判断)

由上可知,咱们并不须要对每一个浮点特征进行彻底相同的缩放。即便特征 A 的范围是 -1 到 +1,同时特征 B 的范围是 -3 到 +3,也不会产生什么恶劣的影响。不过,若是特征 B 的范围是 5000 到 100000,您的模型会出现糟糕的响应。code

要缩放数字数据,一种显而易见的方法是将 [最小值,最大值] 以线性方式映射到较小的范围,例如 [-1,+1]。
另外一种热门的缩放策略是计算每一个值的 Z 得分。Z 得分与距离均值的标准误差数相关。换而言之:
scaledvalue=(value−mean)/stddev.
例如,给定如下条件:
*   均值 = 100
*   标准误差 = 20
*   原始值 = 130
则:
  scaled_value = (130 - 100) / 20
  scaled_value = 1.5
使用 Z 得分进行缩放意味着,大多数缩放后的值将介于 -3 和 +3 之间,而少许值将略高于或低于该范围。

处理极端离群值

仍是举加利福尼亚州住房数据集中的人均住房数的例子,有的极端值达到了50
对于这些极端值其实很好处理,无非几个办法htm

  • 对数缩放
  • 特征值限制到 某个上限或者下限

分箱

分箱实际上是一个形象化的说法,就是把数据分开来,装在一个个箱子里,这样一个箱子里的数据就是一家人了。
那有什么用呢?下面就举个栗子!blog

纬度_房价.png

在数据集中,latitude 是一个浮点值(由于是按照一片区域统计的,因此纬度肯的增加确定是线性的了)。不过,在咱们的模型中将 latitude 表示为浮点特征(将其看为一个浮点数,以它的数值大小为特征)没有意义。这是由于纬度和房屋价值之间不存在线性关系(并非那种纬度高房价就高)。例如,纬度 35 处的房屋并不比纬度 34 处的房屋贵 35/34(或更便宜)。可是,纬度或许能很好地预测房屋价值(在训练以前,咱们也不知道能不能呢,可是从以前的散点图能够看出来,房价和位置的分布好像是有关系的,因此咱们把纬度也做为特征),由于不是呈线性的关系了,因此把它做为分类特征会更好。(若是没法理解的话,就好好想一想模型会怎么处理数值数据和分类数据),因此接下来咱们将其分箱处理,以下图。

纬度_房价_分箱.png

咱们如今拥有 11 个不一样的布尔值特征(LatitudeBin1LatitudeBin2、…、LatitudeBin11),而不是一个浮点特征。拥有 11 个不一样的特征有点不方便,所以咱们将它们统一成一个 11 元素矢量。这样作以后,咱们能够将纬度 37.4 表示为:

[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

分箱以后,咱们的模型如今能够为每一个纬度学习彻底不一样的权重。(是否是以为有点像独热编码,没错,就是的)

为了简单起见,咱们在纬度样本中使用整数做为分箱边界。若是咱们须要更精细的解决方案,咱们能够每隔 1/10 个纬度拆分一次分箱边界。添加更多箱可以让模型从纬度 37.4 处学习和维度 37.5 处不同的行为,但前提是每 1/10 个纬度均有充足的样本可供学习。

另外一种方法是按分位数分箱,这种方法能够确保每一个桶内的样本数量是相等的。按分位数分箱彻底无需担忧离群值。

清查

截至目前,咱们假定用于训练和测试的全部数据都是值得信赖的。在现实生活中,数据集中的不少样本是不可靠的,缘由有如下一种或多种:

  • 遗漏值。 例如,有人忘记为某个房屋的年龄输入值。(值会为-1,因此要分为两个特征,忘了的看上面)
  • 重复样本。 例如,服务器错误地将同一条记录上传了两次。
  • 不良标签。 例如,有人错误地将一颗橡树的图片标记为枫树。
  • 不良特征值。 例如,有人输入了多余的位数,或者温度计被遗落在太阳底下。

一旦检测到存在这些问题,一般须要将相应样本从数据集中移除,从而“修正”不良样本。要检测遗漏值或重复样本,能够编写一个简单的程序。检测不良特征值或标签可能会比较棘手。

除了检测各个不良样本以外,还必须检测集合中的不良数据。直方图是一种用于可视化集合中数据的很好机制。此外,收集以下统计信息也会有所帮助:

  • 最大值和最小值
  • 均值和中间值
  • 标准误差

考虑生成离散特征的最多见值列表,靠常识来判断是否合理,是否适合本身观察数据

了解数据

遵循如下规则:

  • 记住您预期的数据状态。
  • 确认数据是否知足这些预期(或者您能够解释为什么数据不知足预期)。
  • 仔细检查训练数据是否与其余来源(例如信息中心)的数据一致。

像处理任何任务关键型代码同样谨慎处理您的数据。良好的机器学习依赖于良好的数据。

相关文章
相关标签/搜索