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

简介: 超级实用!如何为机器学习算法准备数据?

image.png

本文为《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']


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


from sklearn.preprocessing import OrdinalEncoder
housing_cat = housing[['ocean_proximity']]
ordinal_encoder = OrdinalEncoder()
housing_cat_encoded = ordinal_encoder.fit_transform(housing_cat)
housing_cat_encoded[:10]
housing_cat_encoded[:10]

array([[ 0.],

      [ 0.],

      [ 4.],

      [ 1.],

      [ 0.],

      [ 1.],

      [ 0.],

      [ 1.],

      [ 0.],

      [ 0.]])

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


from sklearn.preprocessing import OneHotEncoder
cat_encoder = OneHotEncoder(sparse=False)
housing_cat_1hot = cat_encoder.fit_transform(housing_cat)
housing_cat_1hot

array([[ 1.,  0.,  0.,  0.,  0.],

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

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

      ...,

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

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

      [ 0.,  0.,  0.,  1.,  0.]])

自定义转换器


虽然 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, 6
class CombinedAttributesAdder(BaseEstimator, TransformerMixin):
   def __init__(self, add_bedrooms_per_room = True): # no *args or **kargs
       self.add_bedrooms_per_room = add_bedrooms_per_room
   def fit(self, X, y=None):
       return self  # nothing else to do
   def 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 StandardScaler
num_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 ColumnTransformer
num_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)
相关文章
|
17天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
55 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
21天前
|
机器学习/深度学习 数据采集 数据处理
谷歌提出视觉记忆方法,让大模型训练数据更灵活
谷歌研究人员提出了一种名为“视觉记忆”的方法,结合了深度神经网络的表示能力和数据库的灵活性。该方法将图像分类任务分为图像相似性和搜索两部分,支持灵活添加和删除数据、可解释的决策机制以及大规模数据处理能力。实验结果显示,该方法在多个数据集上取得了优异的性能,如在ImageNet上实现88.5%的top-1准确率。尽管有依赖预训练模型等限制,但视觉记忆为深度学习提供了新的思路。
23 2
|
29天前
|
存储 编解码 负载均衡
数据分片算法
【10月更文挑战第25天】不同的数据分片算法适用于不同的应用场景和数据特点,在实际应用中,需要根据具体的业务需求、数据分布情况、系统性能要求等因素综合考虑,选择合适的数据分片算法,以实现数据的高效存储、查询和处理。
|
29天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
2月前
|
机器学习/深度学习 人工智能 算法
"拥抱AI规模化浪潮:从数据到算法,解锁未来无限可能,你准备好迎接这场技术革命了吗?"
【10月更文挑战第14天】本文探讨了AI规模化的重要性和挑战,涵盖数据、算法、算力和应用场景等方面。通过使用Python和TensorFlow的示例代码,展示了如何训练并应用一个基本的AI模型进行图像分类,强调了AI规模化在各行业的广泛应用前景。
32 5
|
2月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
26天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的决策树算法
【10月更文挑战第29天】本文将深入浅出地介绍决策树算法,一种在机器学习中广泛使用的分类和回归方法。我们将从基础概念出发,逐步深入到算法的实际应用,最后通过一个代码示例来直观展示如何利用决策树解决实际问题。无论你是机器学习的初学者还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和指导。
|
1月前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
38 0
|
2月前
|
人工智能 算法 前端开发
无界批发零售定义及无界AI算法,打破传统壁垒,累积数据流量
“无界批发与零售”是一种结合了批发与零售的商业模式,通过后端逻辑、数据库设计和前端用户界面实现。该模式支持用户注册、登录、商品管理、订单处理、批发与零售功能,并根据用户行为计算信用等级,确保交易安全与高效。
|
7月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
246 14