一个像“入”的数学符号入是怎么念的?或者告诉我是哪位科学家发明的这

下面定义数据导入函数:

3.3 快速查看数据结构

先来看一下数据集的结构运行以下语句,查看前 5 行:

该数据集中每一行代表一个地区每个地区包含 10 格特征属性,分别是:

使用 info() 方法来查看数据的整体描述尤其是包含的行数,每个属性的类型和非空值的数量

可以看出数据集中总共有 20640 个实例。对于机器学习來说数据量不算大,但非常适合入门使用注意属性 total_bedrooms 只有 20433 个非空值。意味着有 207 个地区缺少这个特征值我们将稍后处理这种情况。

所有屬性都是数值类型除了 ocean_proximity。ocean_proximity 的类型是一个对象因此可能是任何类型的 Python 对象,但一旦你从 CSV 文件中导入这个数据那么它一定是一个文本属性。之前查看前 5 行数据时会发现该属性都是一样的,意味着 ocean_proximity 很可能是一个类别属性可以通过使用 value_counts() 方法来查看该属性有哪些类别,每个類别下有多少个样本

我们再来看以下其它字段。describe() 方法展示的是数值属性的总结:

注意以上的结果,空值是不计入统计的其中,count 表示總数mean 表示均值,std 表示标准差min 表示最小值,max 表示最大值

另外一种对数据集有个整体感知的方法就是对每个数值属性作柱状图。柱状图展示的是给定数值范围(横坐标)内所包含的实例总数(纵坐标)你可以一次只画一个属性的柱状图,也可以对整个数据集使用 hist() 方法將会对每个数值属性绘制柱状图。例如从柱状图种可以看到有超过 800 个地区的房价中位数在 $500000 左右。

show() 不是必须的因为单元执行时 Jupyter 会自动显礻图形。

在这些柱状图种注意以下几点:

1.首先收入中位数属性看起来并不是用标准的美元值来表征的。实际上收入中位数是经过了缩放囷削顶处理的削顶就是把大于 15 的都设为 15(实际上是 15.0001),把小于 0.5 的都设为 0.5(实际上是 0.4999)在机器学习种,对特征属性进行预处理很常见這不一定是个问题,但是你要试着明白数据是如何计算的

2.房屋年龄中位数和房屋价格中位数也被削顶了。房价削顶可能是一个严重的问題因为它是目标属性(标签)。削顶可能会让机器学习算法无法预测出界限之外的值你应该好好检查一下削顶到底有没有影响,如果需要精准预测房价中位数包括是界限之外的值,那么你有两种方法:

a. 对削顶的样本进行重新采集收集实际数值。

b. 直接在训练集种丢弃這些削顶的样本(同时也对测试集这么做因为如果房价中位数超过界限,预测结果可能就不好)

3.这些属性的量度不同。稍后我们将详細讨论这一问题

4.最后,许多柱状图有很长的尾巴:它们向右的拖尾比向左长得多这可能会让一些机器学习算法检测模式变得更加困难。我们稍后会对这些属性进行转换让它们更加接近于正态分布曲线。

在这个阶段就搁置部分数据可能听起来比较奇怪毕竟我们只是对數据有个初步的认识,在决定使用哪种算法之前应该对数据有更多的了解才是没错,但是我们的大脑是个非常神奇的模式检测系统它佷容易就过拟合:如果查看了测试集,很容易就发现测试集中一些有趣的模式致使我们倾向于选择符合这些模式的机器学习模型。当测量测试集的泛化误差时结果往往会很好。但是部署系统之后会发现模型在实际使用时表现得并不好。这种情况称为数据窥视偏差(data

创建测试集理论上很简单:随机选择整个数据集大约 20% 的实例就可以了:

这种方法可行但并不完美!如果再一次运行程序将会产生一个不同嘚测试集。多次之后机器学习算法几乎已经遍历了整个数据集,这恰恰是我们应该避免的

一种解决办法是把第一次分割的测试集保存起来供下次直接使用。另一种办法是在调用 np.random.permutation() 语句之前固定随机数发生器的种子(例如 np.random.seed(42))这样每次产生的测试集都是相同的。

但是这两种方法在数据集更新的时候都会失效一种常用的解决方法是使用每个实例的标志符来决定是否作为测试集(假设标识符是唯一且不变的)。例如可以计算每个实例标识符的哈希值,只保留哈希值最后一个字节如果该字节值小于等于 51(256 的 20%),则将该实例作为测试集这保證了多次运行之后,测试集仍然不变即时更新了数据集。新的测试集将会是所有新实例的 20%且绝不会包含之前作为训练集的实例。下面昰这种方法的代码实现:

虽然housing 数据集没有标识符这一列,但是最简单的办法是使用行索引作为标识符 ID:

如果使用行索引作为唯一标识符需要确保新的数据必须放置在原来数据集的后面,不能删除行如果做不到的话,可以使用一个最稳定的特征作为标识符例如,一个哋区的经度和维度一定是唯一且百万年不变的因此可以结合这两个特征来作为唯一标识符:

 

可以固定随机种子,效果跟之前介绍的一样第二,可以对多个行数相同的数据集进行同样索引的划分(这非常有用例如输入标签在另外一个 DataFrame 中)。

目前为止我们已经考虑了纯随機采样方法当数据量足够大(特别是相对于特征属性个数)时,这种方法通常时可以的但是如果数据量不够多,就会有采样偏差的风險当一个调查公司想要咨询 1000 个人,询问他们一些问题时他们的挑人的方法不是随机抽样,而是希望这 1000 个人对整个人口具有代表性例洳,美国人口中女性占 51.3%,男性占 48.7%因此,一个比较好的调查方式就是让抽样样本保持这样的性别比例:513 名女性487 名男性。这种做法称为汾层抽样(stratified sampling):将总人口分成均匀的子分组称为分层,从每个分层采样合适数量的实例以保证测试集对总人口具有代表性。如果采样隨机抽样有 12% 的可能造成采样偏差:女性人数低于 49% 或高于 54%,调查结果可能就会出错

假如专家告诉你收入中位数是预测房价中位数非常重偠的属性之一。你希望确保测试集能够涵盖整个数据集中所有的收入类别因为收入中位数是连续数值,你首先需要创建收入类别属性讓我们更仔细地看一下收入中位数柱状图(经过处理)。

显然大部分收入中位数都在 2-5(万美元) 之间,某些在 6 以上数据集中每个分层嘟必须有足够多数量的实例,否则对某分层重要性的估计可能出现偏差这就意味着不能有太多分层,每个分层应该有足够多的实例下媔的代码通过将收入中位数除以 1.5 来创建一个输入类别属性(除以 1.5 的目的就是为了防止类别过多)。使用 ceil 函数进行向上取整计算(得到离散類别)把所有大于 5 的归类到类别 5 中。

 

我们来看一下实际效果是否符合预期先计算整个数据集中各收入类别所占的比例:

 

你可以使用类姒的代码计算测试集中各收入类别的比例。下图比较了整个数据集、纯随机采样测试集、分层采样测试集三者之间收入类比的比例可以看出,分层采样测试集的收入类别比例与整个数据集近似相同而纯随机采样测试集与整个数据集相比产生了较大的偏差。

现在你可以把 income_cat 屬性删除让数据回到它的初始状态(income_cat 属性是为了进行分层采样的):

我们之所以花很多时间在划分测试集上,是因为在机器学习项目中這非常重要但却容易被忽视更重要的,这些概念在我们之后讨论交叉验证(cross-validation)时会很有用现在,我们开始进入下一阶段:探索数据

}

我要回帖

更多关于 数学符号入 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信