Python & 机器学习之项目实践 | 赠书

2017 年 12 月 26 日 人工智能头条 魏贞原
Python & 机器学习之项目实践 | 赠书

文章节选自《机器学习——Python实践》

文末评论赠送本书,欢迎留言!


机器学习是一项经验技能,经验越多越好。在项目建立的过程中,实践是掌握机器学习的最佳手段。在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的。


预测模型项目模板


不能只通过阅读来掌握机器学习的技能,需要进行大量的练习。本文将介绍一个通用的机器学习的项目模板,创建这个模板总共有六个步骤。通过本文将学到:

  • 端到端地预测(分类与回归)模型的项目结构。

  • 如何将前面学到的内容引入到项目中。

  • 如何通过这个项目模板来得到一个高准确度的模板。

机器学习是针对数据进行自动挖掘,找出数据的内在规律,并应用这个规律来预测新数据,如图19-1所示。


图19-1

在项目中实践机器学习

端到端地解决机器学习的问题是非常重要的。可以学习机器学习的知识,可以实践机器学习的某个方面,但是只有针对某一个问题,从问题定义开始到模型部署为止,通过实践机器学习的各个方面,才能真正掌握并应用机器学习来解决实际问题。

在部署一个项目时,全程参与到项目中可以更加深入地思考如何使用模型,以及勇于尝试用机器学习解决问题的各个方面,而不仅仅是参与到自己感兴趣或擅长的方面。一个很好的实践机器学习项目的方法是,使用从 UCI机器学习仓库(http://archive.ics.uci.edu/ml/datasets.html) 获取的数据集开启一个机器学习项目。如果从一个数据集开始实践机器学习,应该如何将学到的所有技巧和方法整合到一起来处理机器学习的问题呢?

分类或回归模型的机器学习项目可以分成以下六个步骤:

(1)定义问题。 
(2)理解数据。 
(3)数据准备。 
(4)评估算法。 
(5)优化模型。 
(6)结果部署。

有时这些步骤可能被合并或进一步分解,但通常是按上述六个步骤来开展机器学习项目的。为了符合Python的习惯,在下面的Python项目模板中,按照这六个步骤分解整个项目,在接下来的部分会明确各个步骤或子步骤中所要实现的功能。

机器学习项目的Python模板

下面会给出一个机器学习项目的Python模板。代码如下:

# Python机器学习项目的模板


# 1. 定义问题

# a) 导入类库

# b) 导入数据集


# 2. 理解数据

# a) 描述性统计

# b) 数据可视化


# 3. 数据准备

# a) 数据清洗

# b) 特征选择

# c) 数据转换


# 4. 评估算法

# a) 分离数据集

# b) 定义模型评估标准

# c) 算法审查

# d) 算法比较


# 5. 优化模型

# a) 算法调参

# b) 集成算法


# 6. 结果部署

# a) 预测评估数据集

# b) 利用整个数据集生成模型

# c) 序列化模型


当有新的机器学习项目时,新建一个Python文件,并将这个模板粘贴进去,再按照前面章节介绍的方法将其填充到每一个步骤中。

各步骤的详细说明

接下来将详细介绍项目模板的各个步骤。

步骤1:定义问题

主要是导入在机器学习项目中所需要的类库和数据集等,以便完成机器学习的项目,包括导入Python的类库、类和方法,以及导入数据。同时这也是所有的配置参数的配置模块。当数据集过大时,可以在这里对数据集进行瘦身处理,理想状态是可以在1分钟内,甚至是30秒内完成模型的建立或可视化数据集。

步骤2:理解数据

这是加强对数据理解的步骤,包括通过描述性统计来分析数据和通过可视化来观察数据。在这一步需要花费时间多问几个问题,设定假设条件并调查分析一下,这对模型的建立会有很大的帮助。

步骤3:数据准备

数据准备主要是预处理数据,以便让数据可以更好地展示问题,以及熟悉输入与输出结果的关系。包括:

  • 通过删除重复数据、标记错误数值,甚至标记错误的输入数据来清洗数据。

  • 特征选择,包括移除多余的特征属性和增加新的特征属性。

  • 数据转化,对数据尺度进行调整,或者调整数据的分布,以便更好地展示问题。

要不断地重复这个步骤和下一个步骤,直到找到足够准确的算法生成模型。

步骤4:评估算法

评估算法主要是为了寻找最佳的算法子集,包括:

  • 分离出评估数据集,以便于验证模型。

  • 定义模型评估标准,用来评估算法模型。

  • 抽样审查线性算法和非线性算法。

  • 比较算法的准确度。 

在面对一个机器学习的问题的时候,需要花费大量的时间在评估算法和准备数据上,直到找到3~5种准确度足够的算法为止。

步骤5:优化模型

当得到一个准确度足够的算法列表后,要从中找出最合适的算法,通常有两种方法可以提高算法的准确度:

  • 对每一种算法进行调参,得到最佳结果。

  • 使用集合算法来提高算法模型的准确度。

步骤6:结果部署

一旦认为模型的准确度足够高,就可以将这个模型序列化,以便有新数据时使用该模型来预测数据。

  • 通过验证数据集来验证被优化过的模型。

  • 通过整个数据集来生成模型。

  • 将模型序列化,以便于预测新数据。

做到这一步的时候,就可以将模型展示并发布给相关人员。当有新数据产生时,就可以采用这个模型来预测新数据。

使用模板的小技巧

快速执行一遍:首先要快速地在项目中将模板中的每一个步骤执行一遍,这样会加强对项目每一部分的理解并给如何改进带来灵感。

循环:整个流程不是线性的,而是循环进行的,要花费大量的时间来重复各个步骤,尤其是步骤3或步骤4(或步骤3~步骤5),直到找到一个准确度足够的模型,或者达到预定的周期。

尝试每一个步骤:跳过某个步骤很简单,尤其是不熟悉、不擅长的步骤。坚持在这个模板的每一个步骤中做些工作,即使这些工作不能提高算法的准确度,但也许在后面的操作就可以改进并提高算法的准确度。即使觉得这个步骤不适用,也不要跳过这个步骤,而是减少该步骤所做的贡献。

定向准确度:机器学习项目的目标是得到一个准确度足够高的模型。每一个步骤都要为实现这个目标做出贡献。要确保每次改变都会给结果带来正向的影响,或者对其他的步骤带来正向的影响。在整个项目的每个步骤中,准确度只能向变好的方向移动。 

按需适用:可以按照项目的需要来修改步骤,尤其是对模板中的各个步骤非常熟悉之后。需要把握的原则是,每一次改进都以提高算法模型的准确度为前提。

总结

本章介绍了预测模型项目的模板,这个模板适用于分类或回归问题。接下来将介绍机器学习中的一个回归问题的项目,这个项目比前面介绍的鸢尾花的例子更加复杂,会利用到本章介绍的每个步骤。


回归项目实例


机器学习是一项经验技能,实践是掌握机器学习、提高利用机器学习解决问题的能力的有效方法之一。那么如何通过机器学习来解决问题呢?本章将通过一个实例来一步一步地介绍一个回归问题。本章主要介绍以下内容:

  • 如何端到端地完成一个回归问题的模型。

  • 如何通过数据转换提高模型的准确度。

  • 如何通过调参提高模型的准确度。

  • 如何通过集成算法提高模型的准确度。

定义问题

在这个项目中将分析研究波士顿房价(Boston House Price)数据集,这个数据集中的每一行数据都是对波士顿周边或城镇房价的描述。数据是1978年统计收集的。数据中包含以下14个特征和506条数据(UCI机器学习仓库中的定义)。

  • CRIM:城镇人均犯罪率。

  • ZN:住宅用地所占比例。

  • INDUS:城镇中非住宅用地所占比例。

  • CHAS:CHAS虚拟变量,用于回归分析。

  • NOX:环保指数。

  • RM:每栋住宅的房间数。

  • AGE:1940年以前建成的自住单位的比例。

  • DIS:距离5个波士顿的就业中心的加权距离。

  • RAD:距离高速公路的便利指数。

  • TAX:每一万美元的不动产税率。

  • PRTATIO:城镇中的教师学生比例。

  • B:城镇中的黑人比例。

  • LSTAT:地区中有多少房东属于低收入人群。

  • MEDV:自住房屋房价中位数。

通过对这些特征属性的描述,我们可以发现输入的特征属性的度量单位是不统一的,也许需要对数据进行度量单位的调整。

导入数据

首先导入在项目中需要的类库。代码如下:

# 导入类库

import numpy as np

from numpy import arange

from matplotlib import pyplot

from pandas import read_csv

from pandas import  set_option

from pandas.plotting import scatter_matrix

from sklearn.preprocessing import StandardScaler

from sklearn.model_selection import train_test_split

from sklearn.model_selection import KFold

from sklearn.model_selection import cross_val_score

from sklearn.model_selection import GridSearchCV

from sklearn.linear_model import LinearRegression

from sklearn.linear_model import Lasso

from sklearn.linear_model import ElasticNet

from sklearn.tree import DecisionTreeRegressor

from sklearn.neighbors import KNeighborsRegressor

from sklearn.svm import SVR

from sklearn.pipeline import Pipeline

from sklearn.ensemble import RandomForestRegressor

from sklearn.ensemble import GradientBoostingRegressor

from sklearn.ensemble import ExtraTreesRegressor

from sklearn.ensemble import AdaBoostRegressor

from sklearn.metrics import mean_squared_error


接下来导入数据集到Python中,这个数据集也可以从UCI机器学习仓库下载,在导入数据集时还设定了数据属性特征的名字。代码如下:

# 导入数据

filename = 'housing.csv'

names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS',

         'RAD', 'TAX', 'PRTATIO', 'B', 'LSTAT', 'MEDV']

data = read_csv(filename, names=names, delim_whitespace=True)


在这里对每一个特征属性设定了一个名称,以便于在后面的程序中使用它们。因为CSV文件是使用空格键做分隔符的,因此读入CSV文件时指定分隔符为空格键(delim_whitespace=True)。

理解数据

对导入的数据进行分析,便于构建合适的模型。

首先看一下数据维度,例如数据集中有多少条记录、有多少个数据特征。代码如下:

# 数据维度print(dataset.shape)


执行之后我们可以看到总共有506条记录和14个特征属性,这与UCI提供的信息一致。

(506, 14)

再查看各个特征属性的字段类型。代码如下:

# 特征属性的字段类型

print(dataset.dtypes)

可以看到所有的特征属性都是数字,而且大部分特征属性都是浮点数,也有一部分特征属性是整数类型的。执行结果如下:

CRIM       float64

ZN         float64

INDUS      float64

CHAS         int64

NOX        float64

RM         float64

AGE        float64

DIS        float64

RAD          int64

TAX        float64

PRTATIO    float64

B          float64

LSTAT      float64

MEDV       float64

dtype: object

接下来对数据进行一次简单的查看,在这里我们查看一下最开始的30条记录。代码如下:

# 查看最开始的30条记录

set_option('display.line_width', 120)

print(dataset.head(30))

这里指定输出的宽度为120个字符,以确保将所有特征属性值显示在一行内。而且这些数据不是用相同的单位存储的,进行后面的操作时,也许需要将数据整理为相同的度量单位。执行结果如图20-1所示。


图20-1

接下来看一下数据的描述性统计信息。代码如下:

# 描述性统计信息

set_option('precision', 1)

print(dataset.describe())

在描述性统计信息中包含数据的最大值、最小值、中位值、四分位值等,分析这些数据能够加深对数据分布、数据结构等的理解。结果如图20-2所示。


图20-2

接下来看一下数据特征之间的两两关联关系,这里查看数据的皮尔逊相关系数。代码如下:

# 关联关系

set_option('precision', 2)

print(dataset.corr(method='pearson'))

执行结果如图20-3所示。


图20-3

通过上面的结果可以看到,有些特征属性之间具有强关联关系(>0.7或<-0.7),如:

  • NOX与INDUS之间的皮尔逊相关系数是0.76。

  • DIS与INDUS之间的皮尔逊相关系数是-0.71。

  • TAX与INDUS之间的皮尔逊相关系数是0.72。

  • AGE与NOX之间的皮尔逊相关系数是0.73。

  • DIS与NOX之间的皮尔逊相关系数是-0.77。

数据可视化

单一特征图表

首先查看每一个数据特征单独的分布图,多查看几种不同的图表有助于发现更好的方法。我们可以通过查看各个数据特征的直方图,来感受一下数据的分布情况。代码如下:

# 直方图

dataset.hist(sharex=False, sharey=False, xlabelsize=1, ylabelsize=1)

pyplot.show()

执行结果如图20-4所示,从图中可以看到有些数据呈指数分布,如CRIM、ZN、AGE和B;有些数据特征呈双峰分布,如RAD和TAX。

 

图20-4

通过密度图可以展示这些数据的特征属性,密度图比直方图更加平滑地展示了这些数据特征。代码如下:

# 密度图

dataset.plot(kind='density', subplots=True, layout=(4,4), sharex=False, fontsize=1)

pyplot.show()

在密度图中,指定layout=(4, 4),这说明要画一个四行四列的图形。执行结果如图20-5所示。


图20-5

通过箱线图可以查看每一个数据特征的状况,也可以很方便地看出数据分布的偏态程度。代码如下:

#箱线图

dataset.plot(kind='box', subplots=True, layout=(4,4), sharex=False, sharey=False, fontsize=8)

pyplot.show()

执行结果如图20-6所示。


图20-6

多重数据图表

接下来利用多重数据图表来查看不同数据特征之间的相互影响关系。首先看一下散点矩阵图。代码如下:

# 散点矩阵图

scatter_matrix(dataset)

pyplot.show()

通过散点矩阵图可以看到,虽然有些数据特征之间的关联关系很强,但是这些数据分布结构也很好。即使不是线性分布结构,也是可以很方便进行预测的分布结构,执行结果如图20-7所示。

 
图20-7

再看一下数据相互影响的相关矩阵图。代码如下:

# 相关矩阵图

fig = pyplot.figure()

ax = fig.add_subplot(111)

cax = ax.matshow(dataset.corr(), vmin=-1, vmax=1, interpolation='none')

fig.colorbar(cax)

ticks = np.arange(0, 14, 1)

ax.set_xticks(ticks)

ax.set_yticks(ticks)

ax.set_xticklabels(names)

ax.set_yticklabels(names)

pyplot.show()

执行结果如图20-8所示,根据图例可以看到,数据特征属性之间的两两相关性,有些属性之间是强相关的,建议在后续的处理中移除这些特征属性,以提高算法的准确度。


图20-8

思路总结

通过数据的相关性和数据的分布等发现,数据集中的数据结构比较复杂,需要考虑对数据进行转换,以提高模型的准确度。可以尝试从以下几个方面对数据进行处理:

  • 通过特征选择来减少大部分相关性高的特征。

  • 通过标准化数据来降低不同数据度量单位带来的影响。

  • 通过正态化数据来降低不同的数据分布结构,以提高算法的准确度。

可以进一步查看数据的可能性分级(离散化),它可以帮助提高决策树算法的准确度。

分离评估数据集

分离出一个评估数据集是一个很好的主意,这样可以确保分离出的数据集与训练模型的数据集完全隔离,有助于最终判断和报告模型的准确度。在进行到项目的最后一步处理时,会使用这个评估数据集来确认模型的准确度。这里分离出20%的数据作为评估数据集,80%的数据作为训练数据集。代码如下:

# 分离数据集

array = dataset.values

X = array[:, 0:13]

Y = array[:, 13]

validation_size = 0.2

seed = 7

X_train, X_validation, Y_train, Y_validation = train_test_split(X, Y,test_size=validation_size, random_state=seed)

评估算法

评估算法——原始数据

分析完数据不能立刻选择出哪个算法对需要解决的问题最有效。我们直观上认为,由于部分数据的线性分布,线性回归算法和弹性网络回归算法对解决问题可能比较有效。另外,由于数据的离散化,通过决策树算法或支持向量机算法也许可以生成高准确度的模型。到这里,依然不清楚哪个算法会生成准确度最高的模型,因此需要设计一个评估框架来选择合适的算法。我们采用10折交叉验证来分离数据,通过均方误差来比较算法的准确度。均方误差越趋近于0,算法准确度越高。代码如下:

# 评估算法 —— 评估标准

num_folds = 10

seed = 7

scoring = 'neg_mean_squared_error'

对原始数据不做任何处理,对算法进行一个评估,形成一个算法的评估基准。这个基准值是对后续算法改善优劣比较的基准值。我们选择三个线性算法和三个非线性算法来进行比较。

线性算法:线性回归(LR)、套索回归(LASSO)和弹性网络回归(EN)。 
非线性算法:分类与回归树(CART)、支持向量机(SVM)和K近邻算法(KNN)。

算法模型初始化的代码如下:

# 评估算法 - baseline

models = {}

models['LR'] = LinearRegression()

models['LASSO'] = Lasso()

models['EN'] = ElasticNet()

models['KNN']  = KNeighborsRegressor()

models['CART'] = DecisionTreeRegressor()

models['SVM'] = SVR()

对所有的算法使用默认参数,并比较算法的准确度,此处比较的是均方误差的均值和标准方差。代码如下:

# 评估算法

results = []

for key in models:

    kfold = KFold(n_splits=num_folds, random_state=seed)

    cv_result = cross_val_score(models[key], X_train, Y_train, cv=kfold, scoring=scoring)

    results.append(cv_result)

    print('%s: %f (%f)' % (key, cv_result.mean(), cv_result.std()))

从执行结果来看,线性回归(LR)具有最优的MSE,接下来是分类与回归树 (CART)算法。执行结果如下:

LR: -21.379856 (9.414264)

LASSO: -26.423561 (11.651110)

EN: -27.502259 (12.305022)

KNN: -41.896488 (13.901688)

CART: -26.608476 (12.250800)

SVM: -85.518342 (31.994798)

再查看所有的10折交叉分离验证的结果。代码如下:

#评估算法——箱线图

fig = pyplot.figure()

fig.suptitle('Algorithm Comparison')

ax = fig.add_subplot(111)

pyplot.boxplot(results)

ax.set_xticklabels(models.keys())

pyplot.show()

执行结果如图20-9所示,从图中可以看到,线性算法的分布比较类似,并且K近邻算法的结果分布非常紧凑。

 
图20-9

不同的数据度量单位,也许是K近邻算法和支持向量机算法表现不佳的主要原因。下面将对数据进行正态化处理,再次比较算法的结果。

评估算法——正态化数据

在这里猜测也许因为原始数据中不同特征属性的度量单位不一样,导致有的算法的结果不是很好。接下来通过对数据进行正态化,再次评估这些算法。在这里对训练数据集进行数据转换处理,将所有的数据特征值转化成“0”为中位值、标准差为“1”的数据。对数据正态化时,为了防止数据泄露,采用Pipeline来正态化数据和对模型进行评估。为了与前面的结果进行比较,此处采用相同的评估框架来评估算法模型。代码如下:

# 评估算法——正态化数据

pipelines = {}

pipelines['ScalerLR'] = Pipeline([('Scaler', StandardScaler()), ('LR', LinearRegression())])

pipelines['ScalerLASSO'] = Pipeline([('Scaler', StandardScaler()), ('LASSO', Lasso())])

pipelines['ScalerEN'] = Pipeline([('Scaler', 

StandardScaler()), ('EN', ElasticNet())])

pipelines['ScalerKNN'] = Pipeline([('Scaler', 

StandardScaler()), ('KNN', KNeighborsRegressor())])

pipelines['ScalerCART'] = Pipeline([('Scaler', 

StandardScaler()), ('CART', DecisionTreeRegressor())])

pipelines['ScalerSVM'] = Pipeline([('Scaler', 

StandardScaler()), ('SVM', SVR())])

results = []

for key in pipelines:

    kfold = KFold(n_splits=num_folds, random_state=seed)

    cv_result = cross_val_score(pipelines[key], X_train, Y_train, cv=kfold, scoring=scoring)

    results.append(cv_result)

    print('%s: %f (%f)' % (key, cv_result.mean(), cv_result.std()))

执行后发现K近邻算法具有最优的MSE。执行结果如下:

ScalerLR: -21.379856 (9.414264)

ScalerLASSO: -26.607314 (8.978761)

ScalerEN: -27.932372 (10.587490)

ScalerKNN: -20.107620 (12.376949)

ScalerCART: -26.978716 (12.164366)

ScalerSVM: -29.633086 (17.009186)

接下来看一下所有的10折交叉分离验证的结果。代码如下:

#评估算法——箱线图

fig = pyplot.figure()

fig.suptitle('Algorithm Comparison')

ax = fig.add_subplot(111)

pyplot.boxplot(results)

ax.set_xticklabels(models.keys())

pyplot.show()

执行结果,生成的箱线图如图20-10所示,可以看到K近邻算法具有最优的MSE和最紧凑的数据分布。

调参改善算法

目前来看,K近邻算法对做过数据转换的数据集有很好的结果,但是是否可以进一步对结果做一些优化呢?K近邻算法的默认参数近邻个数(n_neighbors)是5,下面通过网格搜索算法来优化参数。代码如下:

# 调参改善算法——KNN

scaler = StandardScaler().fit(X_train)

rescaledX = scaler.transform(X_train)

param_grid = {'n_neighbors': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21]}

model = KNeighborsRegressor()

kfold = KFold(n_splits=num_folds, random_state=seed)

grid = GridSearchCV(estimator=model, 

param_grid=param_grid, scoring=scoring, cv=kfold)

grid_result = grid.fit(X=rescaledX, y=Y_train)


print('最优:%s 使用%s' % (grid_result.best_score_, grid_result.best_params_))

cv_results = 

zip(grid_result.cv_results_['mean_test_score'],


grid_result.cv_results_['std_test_score'],

                 grid_result.cv_results_['params'])

for mean, std, param in cv_results:

    print('%f (%f) with %r' % (mean, std, param))

最优结果——K近邻算法的默认参数近邻个数(n_neighbors)是3。执行结果如下:

最优:-18.1721369637 使用{'n_neighbors': 3}

-20.208663 (15.029652) with {'n_neighbors': 1}

-18.172137 (12.950570) with {'n_neighbors': 3}

-20.131163 (12.203697) with {'n_neighbors': 5}

-20.575845 (12.345886) with {'n_neighbors': 7}

-20.368264 (11.621738) with {'n_neighbors': 9}

-21.009204 (11.610012) with {'n_neighbors': 11}

-21.151809 (11.943318) with {'n_neighbors': 13}

-21.557400 (11.536339) with {'n_neighbors': 15}

-22.789938 (11.566861) with {'n_neighbors': 17}

-23.871873 (11.340389) with {'n_neighbors': 19}

-24.361362 (11.914786) with {'n_neighbors': 21}

集成算法

除调参之外,提高模型准确度的方法是使用集成算法。下面会对表现比较好的线性回归、K近邻、分类与回归树算法进行集成,来看看算法能否提高。

装袋算法:随机森林(RF)和极端随机树(ET)。 
提升算法:AdaBoost(AB)和随机梯度上升(GBM)。

依然采用和前面同样的评估框架和正态化之后的数据来分析相关的算法。代码如下:

# 集成算法

ensembles = {}

ensembles['ScaledAB'] = Pipeline([('Scaler',

StandardScaler()), ('AB', AdaBoostRegressor())])

ensembles['ScaledAB-KNN'] = Pipeline([('Scaler', 

StandardScaler()), ('ABKNN', AdaBoostRegressor

(base_estimator= KNeighborsRegressor(n_neighbors=3)))])

ensembles['ScaledAB-LR'] = Pipeline([('Scaler', 

StandardScaler()), ('ABLR',

AdaBoostRegressor(LinearRegression()))])

ensembles['ScaledRFR'] = Pipeline([('Scaler', 

StandardScaler()), ('RFR', RandomForestRegressor())])

ensembles['ScaledETR'] = Pipeline([('Scaler', 

StandardScaler()), ('ETR', ExtraTreesRegressor())])

ensembles['ScaledGBR'] = Pipeline([('Scaler', 

StandardScaler()), ('RBR', GradientBoostingRegressor())])


results = []

for key in ensembles:

    kfold = KFold(n_splits=num_folds, random_state=seed)

    cv_result = cross_val_score(ensembles[key], X_train, Y_train, cv=kfold, scoring=scoring)

    results.append(cv_result)

    print('%s: %f (%f)' % (key, cv_result.mean(), cv_result.std()))

与前面的线性算法和非线性算法相比,这次的准确度都有了较大的提高。执行结果如下:

ScaledAB: -15.244803 (6.272186)

ScaledAB-KNN: -15.794844 (10.565933)

ScaledAB-LR: -24.108881 (10.165026)

ScaledRFR: -13.279674 (6.724465)

ScaledETR: -10.464980 (5.476443)

ScaledGBR: -10.256544 (4.605660)

接下来通过箱线图看一下集成算法在10折交叉验证中均方误差的分布状况。代码如下:

# 集成算法——箱线图

fig = pyplot.figure()

fig.suptitle('Algorithm Comparison')

ax = fig.add_subplot(111)

pyplot.boxplot(results)

ax.set_xticklabels(ensembles.keys())

pyplot.show()

执行结果如图20-11所示,随机梯度上升算法和极端随机树算法具有较高的中位值和分布状况。

 
图20-11

集成算法调参

集成算法都有一个参数n_estimators,这是一个很好的可以用来调整的参数。对于集成参数来说,n_estimators会带来更准确的结果,当然这也有一定的限度。下面对随机梯度上升(GBM)和极端随机树(ET)算法进行调参,再次比较这两个算法模型的准确度,来确定最终的算法模型。代码如下:

# 集成算法GBM——调参

caler = StandardScaler().fit(X_train)

rescaledX = scaler.transform(X_train)

param_grid = {'n_estimators': [10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900]}

model = GradientBoostingRegressor()

kfold = KFold(n_splits=num_folds, random_state=seed)

grid = GridSearchCV(estimator=model, 

param_grid=param_grid, scoring=scoring, cv=kfold)

grid_result = grid.fit(X=rescaledX, y=Y_train)

print('最优:%s 使用%s' % (grid_result.best_score_, 

grid_result.best_params_))


# 集成算法ET——调参

scaler = StandardScaler().fit(X_train)

rescaledX = scaler.transform(X_train)

param_grid = {'n_estimators': [5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]}

model = ExtraTreesRegressor()

kfold = KFold(n_splits=num_folds, random_state=seed)

grid = GridSearchCV(estimator=model, param_grid=param_grid, scoring=scoring, cv=kfold)

grid_result = grid.fit(X=rescaledX, y=Y_train)

print('最优:%s 使用%s' % (grid_result.best_score_, grid_result.best_params_))

对于随机梯度上升(GBM)算法来说,最优的n_estimators是500;对于极端随机树(ET)算法来说,最优的n_estimators是80。执行结果,极端随机树(ET)算法略优于随机梯度上升(GBM)算法,因此采用极端随机树(ET)算法来训练最终的模型。执行结果如下:

最优:-9.3078229754 使用{'n_estimators': 500}

最优:-8.99113433246 使用{'n_estimators': 80}

也许需要执行多次这个过程才能找到最优参数。这里有一个技巧,当最优参数是param_grid的边界值时,有必要调整param_grid进行下一次调参。

确定最终模型

我们已经确定了使用极端随机树(ET)算法来生成模型,下面就对该算法进行训练和生成模型,并计算模型的准确度。代码如下:

#训练模型

caler = StandardScaler().fit(X_train)

rescaledX = scaler.transform(X_train)

gbr = ExtraTreesRegressor(n_estimators=80)

gbr.fit(X=rescaledX, y=Y_train)

再通过评估数据集来评估算法的准确度。

# 评估算法模型

rescaledX_validation = scaler.transform(X_validation)

predictions = gbr.predict(rescaledX_validation)

print(mean_squared_error(Y_validation, predictions))

执行结果如下:

14.077038511

总结

本项目实例从问题定义开始,直到最后的模型生成为止,完成了一个完整的机器学习项目。通过这个项目,理解了上一章中介绍的机器学习项目的模板,以及整个机器学习模型建立的流程。接下来会介绍一个机器学习的二分类问题,以进一步加深对这个模板的理解。

编者按:《机器学习——Python实践》不同于很多讲解机器学习的书籍,本书以实践为导向,使用 scikit-learn 作为编程框架,强调简单、快速地建立模型,解决实际项目问题。读者通过对《机器学习——Python实践》的学习,可以迅速上手实践机器学习,并利用机器学习解决实际问题。《机器学习——Python实践》非常适合于项目经理、有意从事机器学习开发的程序员,以及高校相关专业在的读学生阅读。



《机器学习——Python实践》订购链接(点击阅读原文订购):https://item.jd.com/12252293.html


赠书啦!!!

留言告诉头条菌你想获得这本书的理由,获点赞前5名就可获得本书。

开奖截止时间12月28日(本周四)中午12点!

登录查看更多
10

相关内容

有兴趣的数据科学专业人士可以通过本书学习Scikit-Learn图书馆以及机器学习的基本知识。本书结合了Anaconda Python发行版和流行的Scikit-Learn库,演示了广泛的有监督和无监督机器学习算法。通过用Python编写的清晰示例,您可以在家里自己的机器上试用和试验机器学习的原理。

所有的应用数学和编程技能需要掌握的内容,在这本书中涵盖。不需要深入的面向对象编程知识,因为工作和完整的例子被提供和解释。必要时,编码示例是深入和复杂的。它们也简洁、准确、完整,补充了介绍的机器学习概念。使用示例有助于建立必要的技能,以理解和应用复杂的机器学习算法。

对于那些在机器学习方面追求职业生涯的人来说,Scikit-Learn机器学习应用手册是一个很好的起点。学习这本书的学生将学习基本知识,这是胜任工作的先决条件。读者将接触到专门为数据科学专业人员设计的蟒蛇分布,并将在流行的Scikit-Learn库中构建技能,该库是Python世界中许多机器学习应用程序的基础。

你将学习

  • 使用Scikit-Learn中常见的简单和复杂数据集
  • 将数据操作为向量和矩阵,以进行算法处理
  • 熟悉数据科学中使用的蟒蛇分布
  • 应用带有分类器、回归器和降维的机器学习
  • 优化算法并为每个数据集找到最佳算法
  • 从CSV、JSON、Numpy和panda格式加载数据并保存为这些格式

这本书是给谁的

  • 有抱负的数据科学家渴望通过掌握底层的基础知识进入机器学习领域,而这些基础知识有时在急于提高生产力的过程中被忽略了。一些面向对象编程的知识和非常基本的线性代数应用将使学习更容易,尽管任何人都可以从这本书获益。
成为VIP会员查看完整内容
0
155

随着机器学习越来越多地被用于发现模式、进行分析和做出决策——投资于吸引更多的利益相关者加入是至关重要的。这本关于机器学习中的Python项目的书试图做到这一点:为今天和明天的开发人员提供工具,他们可以使用这些工具更好地理解、评估和塑造机器学习,以帮助确保它为我们所有人服务。

如果你还没有Python编程环境,这本书将为你提供一个,然后在“机器学习导论”一章中为你提供一个机器学习的概念理解。接下来是三个Python机器学习项目。它们将帮助你创建一个机器学习分类器,建立一个神经网络来识别手写数字,并通过为Atari构建一个机器人来给你一个深度强化学习的背景知识。

Python机器学习项目

  1. 前言
  2. 设置Python编程环境 3.机器学习入门
  3. 如何用Scikitlearn在Python中构建机器学习分类器
  4. 如何建立基于Tensorflow的神经网络识别手写数字
  5. 深度强化学习的偏差-方差: 如何用OpenAI Gym为Atari构建一个机器人

成为VIP会员查看完整内容
0
95

为了提取知识和做出预测,机器学习使用数学模型来拟合数据。这些模型将特征作为输 入。特征就是原始数据某个方面的数值表示。在机器学习流程中,特征是数据和模型之间 的纽带。特征工程是指从原始数据中提取特征并将其转换为适合机器学习模型的格式。它 是机器学习流程中一个极其关键的环节,因为正确的特征可以减轻构建模型的难度,从而 使机器学习流程输出更高质量的结果。机器学习从业者有一个共识,那就是建立机器学习 流程的绝大部分时间都耗费在特征工程和数据清洗上。然而,尽管特征工程非常重要,专 门讨论这个话题的著作却很少。究其原因,可能是正确的特征要视模型和数据的具体情况 而定,而模型和数据千差万别,很难从各种项目中归纳出特征工程的实践原则。

然而,特征工程并不只是针对具体项目的行为,它有一些基本原则,而且最好结合具体情 境进行解释说明。在本书中,每一章都集中阐述一个数据问题:如何表示文本数据或图像 数据,如何为自动生成的特征降低维度,何时以及如何对特征进行标准化,等等。你可以 将本书看作内容互有联系的短篇小说集,而不是一部长篇小说。每一章都对大量现有特征 工程技术进行了简单介绍,它们综合在一起,阐明了特征工程的基本原则。

掌握一门学科不仅仅是要了解其中的定义以及能够推导公式。仅知道它的工作机制和用途 是不够的,你还必须理解它为什么这样设计,它与其他技术有何联系,以及每种方法的优 点和缺点。只有清楚地知道事情是如何完成的,对其中的基本原理有直观的理解,并能将 知识融会贯通,才称得上精通。尽管一本好书可以让你初窥门径,但只靠读书不能登堂入 室,你必须动手实践,将你的想法变成实际的应用,这是一个不断迭代的过程。在每次迭 代中,我们都能将想法理解得更加透彻,并逐渐找到更巧妙、更有创造性的实现方法。本书的目的就是帮助你更好地实现想法。

  • 第1章介 绍机器学习流程中的基本概念(数据、模型、特征等)。
  • 第 2 章研究数值型数据的基础特 征工程:过滤、分箱、缩放、对数变换和幂次变换,以及交互特征。
  • 第 3 章开始介绍自然 文本的特征工程,并研究词袋、n-gram 和短语检测等技术。
  • 第 4 章介绍 tf-idf(词频 - 逆 文档频率),并将其作为特征缩放的一个例子,说明特征缩放为什么会有效。
  • 从第 5 章开 始,节奏开始加快,我们要讨论高效的分类变量编码技术,包括特征散列化和分箱计数。
  • 第 6 章介绍主成分分析(PCA),此时我们已经深入到机器学习的腹地了。
  • 第 7 章将 k-均 值聚类作为一种特征化技术,说明了模型堆叠这一重要概念。

第 8 章专门讲解图像处理, 图像数据的特征提取要比文本数据困难得多。我们先介绍两种手动提取特征的技术:SIFT 和 HOG,然后再介绍深度学习这种最新的图像特征提取技术。

最后,第 9 章通过一个完 整的例子(为一个学术论文数据集创建推荐器)演示几种技术的实际应用。

成为VIP会员查看完整内容
《Feature Engineering for Machine Learning》英文PDF.pdf
《精通特征工程》中文PDF.pdf
0
240

简介:

科学专业人员可以通过本书学习Scikit-Learn库以及机器学习的基础知识。该书将Anaconda Python发行版与流行的Scikit-Learn库结合在一起,展示了各种有监督和无监督的机器学习算法。通过Python编写的清晰示例向读者介绍机器学习的原理,以及相关代码。

本书涵盖了掌握这些内容所需的所有应用数学和编程技能。不需要深入的面向对象编程知识,因为可以提供并说明完整的示例。必要时,编码示例很深入且很复杂。它们也简洁,准确,完整,是对引入的机器学习概念的补充。处理示例有助于建立理解和应用复杂机器学习算法所需的技能。

本书的学生将学习作为胜任力前提的基础知识。读者将了解专门为数据科学专业人员设计的Python Anaconda发行版,并将在流行的Scikit-Learn库中构建技能,该库是Python领域许多机器学习应用程序的基础。

本书内容包括:

  • 使用Scikit-Learn通用的简单和复杂数据集
  • 将数据处理为向量和矩阵以进行算法处理
  • 熟悉数据科学中使用的Anaconda发行版
  • 通过分类器,回归器和降维应用机器学习
  • 调整算法并为每个数据集找到最佳算法
  • 从CSV,JSON,Numpy和Pandas格式加载数据并保存

内容介绍:

这本书分为八章。 第1章介绍了机器学习,Anaconda和Scikit-Learn的主题。 第2章和第3章介绍算法分类。 第2章对简单数据集进行分类,第3章对复杂数据集进行分类。 第4章介绍了回归预测模型。 第5章和第6章介绍分类调整。 第5章调整简单数据集,第6章调整复杂数据集。 第7章介绍了预测模型回归调整。 第8章将所有知识汇总在一起,以整体方式审查和提出发现。

作者介绍:

David Paper博士是犹他州立大学管理信息系统系的教授。他写了两本书-商业网络编程:Oracle的PHP面向对象编程和Python和MongoDB的数据科学基础。他在诸如组织研究方法,ACM通讯,信息与管理,信息资源管理期刊,AIS通讯,信息技术案例与应用研究期刊以及远程计划等参考期刊上发表了70余篇论文。他还曾在多个编辑委员会担任过各种职务,包括副编辑。Paper博士还曾在德州仪器(TI),DLS,Inc.和凤凰城小型企业管理局工作。他曾为IBM,AT&T,Octel,犹他州交通运输部和空间动力实验室执行过IS咨询工作。 Paper博士的教学和研究兴趣包括数据科学,机器学习,面向对象的程序设计和变更管理。

目录:

成为VIP会员查看完整内容
0
78
小贴士
相关资讯
Python中机器学习的特征选择工具
云栖社区
6+阅读 · 2018年7月16日
荐书丨机器学习——Python实践(留言送书)
程序人生
6+阅读 · 2018年1月5日
如何入门Python与机器学习 | 赠书
CSDN大数据
7+阅读 · 2017年11月12日
机器学习必备手册
机器学习研究会
12+阅读 · 2017年10月24日
课程 | 12个适合机器学习入门的经典案例
Python机器学习Kaggle案例实战
炼数成金订阅号
8+阅读 · 2017年8月10日
相关VIP内容
专知会员服务
155+阅读 · 2020年6月10日
【干货书】机器学习Python实战教程,366页pdf
专知会员服务
209+阅读 · 2020年3月17日
Sklearn 与 TensorFlow 机器学习实用指南,385页pdf
专知会员服务
76+阅读 · 2020年3月15日
机器学习速查手册,135页pdf
专知会员服务
178+阅读 · 2020年3月15日
【经典书】精通机器学习特征工程,中文版,178页pdf
专知会员服务
240+阅读 · 2020年2月15日
相关论文
Adaptive Neural Trees
Ryutaro Tanno,Kai Arulkumaran,Daniel C. Alexander,Antonio Criminisi,Aditya Nori
3+阅读 · 2018年12月10日
UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction
Leland McInnes,John Healy,James Melville
7+阅读 · 2018年12月6日
Felix Hieber,Tobias Domhan,Michael Denkowski,David Vilar,Artem Sokolov,Ann Clifton,Matt Post
6+阅读 · 2018年6月1日
Pierre-Luc Dallaire-Demers,Nathan Killoran
3+阅读 · 2018年4月30日
Xiaofeng Yang,Deepak Ajwani,Wolfgang Gatterbauer,Patrick K. Nicholson,Mirek Riedewald,Alessandra Sala
3+阅读 · 2018年4月10日
Zhen Yang,Wei Chen,Feng Wang,Bo Xu
3+阅读 · 2018年4月8日
Jiyi Zhang,Hung Dang,Hwee Kuan Lee,Ee-Chien Chang
4+阅读 · 2018年4月4日
Parisa Naderi Golshan,HosseinAli Rahmani Dashti,Shahrzad Azizi,Leila Safari
6+阅读 · 2018年3月15日
Avik Ray,Joe Neeman,Sujay Sanghavi,Sanjay Shakkottai
3+阅读 · 2018年2月24日
Srikrishna Karanam,Mengran Gou,Ziyan Wu,Angels Rates-Borras,Octavia Camps,Richard J. Radke
5+阅读 · 2018年2月14日
Top