点击上方“AI有道”,选择“星标”公众号

重磅干货,第一时间送达

本文为《Scikit-Learn 和 TensorFlow 机器学习指南》的第二章的第 3 讲:为机器学习算法准备数据。

1. 使用实际数据

2. 整体规划

3. 获取数据

4. 发现、可视化数据,增加直观印象

5. 为机器学习准备数据

6. 选择模型并进行训练

7. 调试模型

8. 部署、监控、维护系统

第二章前 2 讲的地址如下:

如何入手第一个机器学习项目?

如何从数据可视化中发现数据规律?

笔记尽量突出重点,提炼关键知识点。正文开始!

数据清洗(处理缺失值)

对于数据集中出现缺失值的情况,需要对其进行处理。对缺失值常用的三种方法是:

  • 丢弃有缺失值的样本

  • 丢弃有缺失值的整个特征

  • 对缺失值进行填充(补零、均值填充或中位数填充等)

三种方法相应的代码如下:

housing.dropna(subset=["total_bedrooms"])    # option 1
housing.drop("total_bedrooms", axis=1)       # option 2
median = housing["total_bedrooms"].median()
housing["total_bedrooms"].fillna(median, inplace=True) # option 3

一般 option 3 应用更为广泛。值得注意的是,应该保留训练样本的 median 值,测试样本中的缺失值将以此 median 值进行填充。

在 Scikit-Learn 中提供了 Imputer 类,进行缺失值处理。示例代码如下:

from sklearn.preprocessing import Imputer
imputer = Imputer(strategy="median")
housing_num = housing.drop('ocean_proximity', axis=1)
imputer.fit(housing_num)
X = imputer.transform(housing_num)
housing_tr = pd.DataFrame(X, columns=housing_num.columns)

处理文字或类别属性

本章的波士顿房价问题中,ocean_proximity 属性是非数值的字符属性,因此无法进行中位数填充。该属性如下所示:

['<1H OCEAN' 'INLAND' 'ISLAND' 'NEAR BAY' 'NEAR OCEAN']

你可以直接使用下面代码,将字符属性转换成数值属性:

更方便地,还可以直接将字符属性转换为 one-hot 编码:

自定义转换器

虽然 Scikit-Learn 已经提供了许多有用的转换器,但是你仍然可以编写自己的转换器,例如特定属性组合。自定义转换器很简单,只需要创建一个类,然后实现以下三个方法:fit()(返回自身)、transform()、fit_transform()。如果添加 TransformerMixin 作为基类,就可以直接得到最后一个方法。同时,如果添加 BaseEstimator 作为基类(并在构造函数中避免 *args 和 **kargs),你还能额外获得两个非常有用的自动调整超参数的方法 get_params()和 set_params()。

下面是自定义转换器,添加组合属性的例子:

from sklearn.base import BaseEstimator, TransformerMixin# column index
rooms_ix, bedrooms_ix, population_ix, household_ix = 3, 4, 5, 6class CombinedAttributesAdder(BaseEstimator, TransformerMixin):def __init__(self, add_bedrooms_per_room = True): # no *args or **kargsself.add_bedrooms_per_room = add_bedrooms_per_roomdef fit(self, X, y=None):return self  # nothing else to dodef transform(self, X, y=None):rooms_per_household = X[:, rooms_ix] / X[:, household_ix]population_per_household = X[:, population_ix] / X[:, household_ix]if self.add_bedrooms_per_room:bedrooms_per_room = X[:, bedrooms_ix] / X[:, rooms_ix]return np.c_[X, rooms_per_household, population_per_household,bedrooms_per_room]else:return np.c_[X, rooms_per_household, population_per_household]attr_adder = CombinedAttributesAdder(add_bedrooms_per_room=False)
housing_extra_attribs = attr_adder.transform(housing.values)

特征缩放

不同的特征属性范围不一,容易给训练造成困难,增加训练时间。因此,一般会对不同特征进行同尺度缩放。常用的两种方式是归一化和标准化。

归一化很简单:将值重新缩放于 0 到 1 之间。实现方法是将值减去最小值并除以最大值和最小值的差。对此,Scikit-Learn 提供了一个名为 MinMaxScaler 的转换器。如果希望范围不是 0~1,可以通过调整超参数 feature_range 进行更改。

标准化的做法是首先减去平均值(所以标准化值的均值总是零),然后除以方差。不同于归一化,标准化不将值绑定到特定范围,对某些算法而言,这可能是个问题(例如,神经网络期望的输入值范围通常是0到1)。但是标准化的方法受异常值的影响更小。Scikit-Learn 提供了一个标准化的转换器 StandadScaler。

管道 Pipeline

我们可以把机器学习算法中许多转换操作使用管道 pipeline 统一顺序进行。Scikit-Learn 正好提供了 Pipeline 来支持这样的转换。下面是一个数值属性的流水线例子:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScalernum_pipeline = Pipeline([('imputer', Imputer(strategy="median")),('attribs_adder', CombinedAttributesAdder()),('std_scaler', StandardScaler()),])housing_num_tr = num_pipeline.fit_transform(housing_num)

以上是数值型的 Pipeline 处理过程。对于非数值型的字符属性,可以建立一个新的完整的 Pipeline,将上面的 num_pipeline 和字符属性的转换整合到一个 Pipeline 中,如下所示:

from sklearn.compose import ColumnTransformernum_attribs = list(housing_num)
cat_attribs = ["ocean_proximity"]full_pipeline = ColumnTransformer([("num", num_pipeline, num_attribs),("cat", OneHotEncoder(), cat_attribs),])housing_prepared = full_pipeline.fit_transform(housing)

【推荐阅读】

干货 | 公众号历史文章精选(附资源)

我的深度学习入门路线

我的机器学习入门路线图

超级实用!如何为机器学习算法准备数据?相关推荐

  1. 机器学习算法基础——数据降维

    12.数据的降维之特征选择 特征选择 冗余:部分特征的相关度高,容易消耗计算性能 噪声:部分特征对预测结果有负影响 特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择 ...

  2. 机器学习实战 2.5机器学习算法的数据准备

    回到一个干净的训练集(再次复制strat_train_set),然后将预测器和标签分开(因为不一定对它们使用相同的转换方式). # 获取删除标签列后的数据集 housing = strat_train ...

  3. 机器学习算法基础——数据特征预处理

    08.特征预处理-归一化 特征处理 通过特定的统计方法(数学方法)将数据转换成算法要求的数据 数值型数据:标准缩放: 归一化 标准化 缺失值 类别型数据:one-hot编码            时间 ...

  4. 《人工智能-机器学习》数据预处理和机器学习算法(以企鹅penguins数据集为例)

    文章目录 一.数据预处理 1 内容和目标: 2 加载和分析数据 2.1 导入基本库和加载数据 2.2 分析数据 3 数据清洗 3.1 重复值处理 3.2 数据脱敏-提取重要特征 3.3 缺失值处理 3 ...

  5. 机器学习算法一览,应用建议与解决思路

    机器学习算法一览,应用建议与解决思路 作者:寒小阳  时间:2016年1月.  出处:http://blog.csdn.net/han_xiaoyang/article/details/5046933 ...

  6. 机器学习系列(4)_机器学习算法一览,应用建议与解决思路

    作者:寒小阳 时间:2016年1月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/50469334 声明:版权所有,转载请联系作者并注明出 ...

  7. 对于这些机器学习算法 数学不好你还真看不懂

    [PConline 技术]机器学习技术不仅仅影响着当前的人工智能领域,在笔者看来,机器学习当中的算法技术甚至还可能影响到大数据对于很多领域的应用深度和广度,对于机器学习的算法来说,我们可以描述成学习一 ...

  8. 你可能过于高估了机器学习算法能力,带你解读鲜为人知的数据泄露问题

    本文是<机器学习宝典>第 6 篇,读完本文你能够掌握机器学习中数据泄露问题. 读完分类与回归算法的评估指标.排序算法的评估指标以及机器学习模型的离线评估方法之后,你已经知道了在机器学习中的 ...

  9. 机器学习中的数据简介

    数据是机器学习领域的重要组成部分.它指的是可用于训练机器学习模型的一组观察或测量.可用于训练和测试的数据的质量和数量在确定机器学习模型的性能方面起着重要作用.数据可以采用各种形式,例如数字.分类或时间 ...

最新文章

  1. matlab中fminunc函数使用方法,[分享]无约束非线性规划函数\fminunc函数使用方法(MATLAB)...
  2. python爬取分页数据
  3. Cannot find package module @sap/cds/common
  4. STM32----摸石头过河系列(五)
  5. 查找重复文件_快速查找、删除重复图片及文件!
  6. 图片放大不失真软件 S-Spline V2
  7. 用计算机进行有理数除法时,《有理数的乘除法》的教案
  8. EMNLP'21 Oral | 拓展你的视野!UCLA提出:地区多样性视觉常识推理
  9. PHP扩展部署之最佳实践
  10. 项目按jar包方式部署
  11. 常用DB9 232接口定义
  12. 性能监控之 Linux 命令 top、vmstat、iostat、free、iftop 基础
  13. python怎样开发软件_Python是怎么编写软件的?
  14. Java基础学习笔记(十)——常用API(3)
  15. 在线教育火拼硬件,是炒概念还是真转型?
  16. 新年寄语+从业感受+祝大家新年快乐~
  17. 中粤拼音在线转换_挖儿思:提高“汉字注拼音”作业的批改效率
  18. 通过SNMP重启POE端口供电
  19. ios应用白名单打包
  20. Hadoop书籍介绍

热门文章

  1. windows 2008 enterprise tcpip.sys问题总结。
  2. Oracle不使用索引的几种情况列举
  3. android-2.3.5_r1
  4. .NET(C#) Internals: 以一个数组填充的例子初步了解.NET 4.0中的并行(一)
  5. 在IAR 中出现the stack plug-in failed to set a breakpoint on main
  6. Python中的split,rsplit,splitlines
  7. Python从入门到入土-Python3 File(文件) 方法
  8. mybatis关系映射(1对1,1对多,多对多)
  9. javaweb学习总结(三十九)——数据库连接池
  10. adodb.stream文件操作类