咱们在进行机器学习的时候,采用的数据样本每每是矢量(特征矢量),而咱们的原始数据并非以矢量的形式呈现给咱们的,这是便须要将数据映射到特征html
直接映射便ok(虽然机器学习是根据浮点值进行的训练,可是不须要将整数6转换为6.0,这个过程是默认的)服务器
好多时候,有的特征是字符串,好比此前训练的加利福尼亚房产数据集中的街区名称,机器学习是没法根据字符串来学习规律的,因此须要转换。可是存在一个问题,若是字符特征是''一环'' ''二环'' ''三环''...(表明某个城市的地理位置),那么对其进行数值转换的时候,是不能够编码为形如1,2,3,4...这样的数据的,由于其存在数据大小的问题,学习模型会把他们的大小关系做为特征而学习,因此咱们须要引入独热编码,(具体解释见连接,解释的很好)机器学习
当获得特征以后,仍是要进行筛选的,由于有的特征没有参考价值,就像咱们的在作合成特征的时候,正常的特征数据是人均几间房间,而有的人是几十间,这明显没有参考价值
良好特征的几点原则学习
将“神奇”的值与实际数据混为一谈:有些特征中会出现一些"神奇的数据",固然这些数据并非不多的特征,而是超出范围的异常值,好比特征应该是介于0——1之间的,可是由于这个数据是空缺的,而采用的默认数值-1,那么这样的数值就是"神奇",解决办法是,将该特征转换为两个特征:测试
清理数据,顾名思义,就是将数据清理(整理一下).....好像是废话。
在上一步后,咱们如今获得的数据已经所有是数值化的特征了,(这里确定有可是的),可是,这样的数据直接拿过来训练效果仍是会很糟糕,由于其中存在许许多多的坏数据,就是一些值不是那么正常的数据,像以前说的那种数值特别大的就属于这一种,固然除了数值异常的还有许许多多种的坏数据,下面就来看一看有哪些方法对付这些妖艳贱货编码
缩放是指将浮点特征值从天然范围(例如 100 到 900)转换为标准范围(例如 0 到 1 或 -1 到 +1)。若是某个特征集只包含一个特征,则缩放能够提供的实际好处微乎其微或根本没有。不过,若是特征集包含多个特征,则缩放特征能够带来如下优点:spa
_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
在数据集中,latitude
是一个浮点值(由于是按照一片区域统计的,因此纬度肯的增加确定是线性的了)。不过,在咱们的模型中将 latitude
表示为浮点特征(将其看为一个浮点数,以它的数值大小为特征)没有意义。这是由于纬度和房屋价值之间不存在线性关系(并非那种纬度高房价就高)。例如,纬度 35 处的房屋并不比纬度 34 处的房屋贵 35/34(或更便宜)。可是,纬度或许能很好地预测房屋价值(在训练以前,咱们也不知道能不能呢,可是从以前的散点图能够看出来,房价和位置的分布好像是有关系的,因此咱们把纬度也做为特征),由于不是呈线性的关系了,因此把它做为分类特征会更好。(若是没法理解的话,就好好想一想模型会怎么处理数值数据和分类数据),因此接下来咱们将其分箱处理,以下图。
咱们如今拥有 11 个不一样的布尔值特征(LatitudeBin1
、LatitudeBin2
、…、LatitudeBin11
),而不是一个浮点特征。拥有 11 个不一样的特征有点不方便,所以咱们将它们统一成一个 11 元素矢量。这样作以后,咱们能够将纬度 37.4 表示为:
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
分箱以后,咱们的模型如今能够为每一个纬度学习彻底不一样的权重。(是否是以为有点像独热编码,没错,就是的)
为了简单起见,咱们在纬度样本中使用整数做为分箱边界。若是咱们须要更精细的解决方案,咱们能够每隔 1/10 个纬度拆分一次分箱边界。添加更多箱可以让模型从纬度 37.4 处学习和维度 37.5 处不同的行为,但前提是每 1/10 个纬度均有充足的样本可供学习。另外一种方法是按分位数分箱,这种方法能够确保每一个桶内的样本数量是相等的。按分位数分箱彻底无需担忧离群值。
截至目前,咱们假定用于训练和测试的全部数据都是值得信赖的。在现实生活中,数据集中的不少样本是不可靠的,缘由有如下一种或多种:
一旦检测到存在这些问题,一般须要将相应样本从数据集中移除,从而“修正”不良样本。要检测遗漏值或重复样本,能够编写一个简单的程序。检测不良特征值或标签可能会比较棘手。
除了检测各个不良样本以外,还必须检测集合中的不良数据。直方图是一种用于可视化集合中数据的很好机制。此外,收集以下统计信息也会有所帮助:
考虑生成离散特征的最多见值列表,靠常识来判断是否合理,是否适合本身观察数据
遵循如下规则:
像处理任何任务关键型代码同样谨慎处理您的数据。良好的机器学习依赖于良好的数据。