书摘:《机器学习——Python实践》-魏贞原

第一部分初始

机器学习(MachineLearning,ML)是一门多领域的交叉学科,涉及概率论、统计学、线性代数、算法等多门学科。

监督学习即在机器学习过程中提供对错指示。一般是在数据组中包含最终结果(0,1),通过算法让机器自己减少误差。这一类学习主要应用于分类和预测(Regression&Classify)。

非监督学习又称归纳性学习(Clustering),利用K方式(KMean)建立中心(Centriole),通过循环和递减运算(Iteration&Descent)来减小误差,达到分类的目的。

下面三个技巧可以有效地帮助你快速提高学习机器学习的能力。·启动一个可以在一个小时内完成的小项目。·通过每周完成一个项目来保持你的学习势头,并建立积累自己的项目工作区。·在微博、微信、Github等社交工具上分享自己的成果,或者随时随地地展示自己的兴趣,增加技能、知识,并获得反馈。

Python是一门面向对象的动态解释语言,简单易学,并且具有很好的可读性。

Python具有丰富和强大的类库,它常被称为“胶水语言”,能够很轻松地把用其他语言制作的各种模块(尤其是C/C++)联结在一起。

Python是一门动态语言,非常适合于交互性开发和大型项目的快速原型开发。

SciPy是在数学运算、科学和工程学方面被广泛应用的Python类库。它包括统计、优化、整合、线性代数模块、傅里叶变换、信号和图像处理、常微分方程求解器等,因此被广泛地应用在机器学习项目中。

NumPy:是Python的一种开源数值计算扩展。它可用来存储和处理大型矩阵,提供了许多高级的数值编程工具,如矩阵数据类型、矢量处理、精密的运算库。

Matplotlib:Python中最著名的2D绘图库,十分适合交互式地进行制图;也可以方便地将它作为绘图控件,嵌入GUI应用程序中。

Pandas:是基于NumPy的一种工具,是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具,也提供了大量能使我们快速、便捷地处理数据的函数和方法。

scikit-learn是Python中开发和实践机器学习的著名类库之一,依赖于SciPy及其相关类库来运行。scikit-learn的基本功能主要分为六大部分:分类、回归、聚类、数据降维、模型选择和数据预处理。

使用with语句,简化了对异常的处理。因此,当需要对异常进行处理时,如果对象遵循了上下文管理协议(ContextManagementProtocol),建议使用with语句来实现。

第二部分数据理解

下面将介绍三种将CSV数据导入到Python中的方法,以便完成对机器学习算法的训练。·通过标准的Python库导入CSV文件。·通过NumPy导入CSV文件。·通过Pandas导入CSV文件。

Python提供了一个标准类库CSV,用来处理CSV文件。这个类库中的reader()函数用来读入CSV文件。

也可以使用NumPy的loadtxt()函数导入数据。使用这个函数处理的数据没有文件头,并且所有的数据结构是一样的,也就是说,数据类型是一样的。

通过Pandas来导入CSV文件要使用pandas.read_csv()函数。这个函数的返回值是DataFrame,可以很方便地进行下一步的处理。

介绍七种方法来帮助大家理解数据。·简单地查看数据。·审查数据的维度。·审查数据的类型和属性。·总结查看数据分类的分布情况。·通过描述性统计分析数据。·理解数据属性的相关性。·审查数据的分布状况。

在分类算法中,需要知道每个分类的数据大概有多少条记录,以及数据分布是否平衡。如果数据分布的平衡性很差,需要在数据加工阶段进行数据处理,来提高数据分布的平衡性。

数据属性的相关性是指数据的两个属性是否互相影响,以及这种影响是什么方式的等。非常通用的计算两个属性的相关性的方法是皮尔逊相关系数,皮尔逊相关系数是度量两个变量间相关程度的方法。它是一个介于1和-1之间的值,其中,1表示变量完全正相关,0表示无关,-1表示完全负相关。

通过分析数据的高斯分布情况来确认数据的偏离情况。高斯分布又叫正态分布,是在数据、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响。

相关矩阵图主要用来展示两个不同属性相互影响的程度。如果两个属性按照相同的方向变化,说明是正向影响。如果两个属性朝相反方向变化,说明是反向影响。把所有属性两两影响的关系展示出来的图表就叫相关矩阵图。矩阵图法就是从多维问题的事件中找出成对的因素,排列成矩阵图,然后根据矩阵图来分析问题,确定关键点。它是一种通过多因素综合思考来探索问题的好方法。

第三部分数据准备

特征选择是困难耗时的,也需要对需求的理解和专业知识的掌握。在机器学习的应用开发中,最基础的是特征工程。

数据预处理需要根据数据本身的特性进行,有不同的格式和不同的要求,有缺失值的要填,有无效数据的要剔,有冗余维的要选,这些步骤都和数据本身的特性紧密相关。

介绍以下几种数据转换方法:·调整数据尺度(RescaleData)。·正态化数据(StandardizeData)。·标准化数据(NormalizeData)。·二值数据(BinarizeData)。

在scikit-learn的说明文档中,也有对这两种方法的详细说明:·适合和多重变换(FitandMultipleTransform)。·适合和变换组合(CombinedFit-and-Transform)。推荐优先选择适合和多重变换(FitandMultipleTransform)方法。首先调用fit()函数来准备数据转换的参数,然后调用transform()函数来做数据的预处理。适合和变换组合(CombinedFit-and-Transform)对绘图或汇总处理具有非常好的效果。

如果数据的各个属性按照不同的方式度量数据,那么通过调整数据的尺度让所有的属性按照相同的尺度来度量数据,就会给机器学习的算法模型训练带来极大的方便。这个方法通常会将数据的所有属性标准化,并将数据转换成0和1之间的值,这对于梯度下降等算法是非常有用的,对于回归算法、神经网络算法和K近邻算法的准确度提高也起到很重要的作用。

在统计学中,按照对事物描述的精确度,对所采用的尺度从低级到高级分成四个层次:定类尺度、定序尺度、定距尺度和定比尺度。定类尺度是对事物类别属性的一种测度,按照事物的属性进行分组或分类。定序尺度是对事物之间的等级或顺序的一种测度,可以比较优劣或排序。定距尺度和定比尺度是对事物类别或次序之间间距的测量,定距尺度的特点是其不仅能将事物区分为不同的类型并进行排序,而且可以准确地指出类别之间的差距。而定比尺度则更近一步,它和定距尺度的差别在于它有一个固定的绝对“零”点。由于这两种测量尺度在绝大多数统计分析中没有本质的差别,所以很多时候都没有严格的区分。

正态化数据(StandardizeData)是有效的处理符合高斯分布的数据的手段,输出结果以0为中位数,方差为1,并作为假定数据符合高斯分布的算法的输入。

标准化数据(NormalizeData)处理是将每一行的数据的距离处理成1(在线性代数中矢量距离为1)的数据又叫作“归一元”处理,适合处理稀疏数据(具有很多为0的数据),归一元处理的数据对使用权重输入的神经网络和使用距离的K近邻算法的准确度的提升有显著作用。

二值数据(BinarizeData)是使用值将数据转化为二值,大于阈值设置为1,小于阈值设置为0。这个过程被叫作二分数据或阈值转换。

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

在开始建立模型之前,执行特征选定有助于:降低数据的拟合度:较少的冗余数据,会使算法得出结论的机会更大。提高算法精度:较少的误导数据,能够提高算法的准确度。减少训练时间:越少的数据,训练模型所需要的时间越少。

统计分析可以用来分析选择对结果影响最大的数据特征。在scikit-learn中提供了SelectKBest类,可以使用一系列统计方法来选定数据特征,是对卡方检验的实现。

经典的卡方检验是检验定性自变量对定性因变量的相关性的方法。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望值的差距,构建统计量。卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,偏离程度决定了卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合;若两个值完全相等,卡方值就为0,表明理论值完全符合。

递归特征消除(RFE)使用一个基模型来进行多轮训练,每轮训练后消除若干权值系数的特征,再基于新的特征集进行下一轮训练。通过每一个基模型的精度,找到对最终的预测结果影响最大的数据特征。在scikit-learn文档中有更多的关于递归特征消除(RFE)的描述。

主要成分分析(PCA)是使用线性代数来转换压缩数据,通常被称作数据降维。常见的降维方法除了主要成分分析(PCA),还有线性判别分析(LDA),它本身也是一个分类模型。PCA和LDA有很多的相似之处,其本质是将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说,PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。在聚类算法中,通常会利用PCA对数据进行降维处理,以利于对数据的简化分析和可视化。

袋装决策树算法(BaggedDecisionTress)、随机森林算法和极端随机树算法都可以用来计算数据特征的重要性。这三个算法都是集成算法中的袋装算法,

第四部分选择模型

学习四种不同的分离数据集的方法,用来分离训练数据集和评估数据集,并用其评估算法模型:·分离训练数据集和评估数据集。·K折交叉验证分离。·弃一交叉验证分离。·重复随机评估、训练数据集分离。

交叉验证是用来验证分类器的性能的一种统计分析方法,有时也称作循环估计,在统计学上是将数据样本切割成小子集的实用方法。基本思想是按照某种规则将原始数据进行分组,一部分作为训练数据集,另一部分作为评估数据集。

K折交叉验证是将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,再用这K个模型最终的验证集的分类准确率的平均数,作为此K折交叉验证下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取值,只有在原始数据集和数据量小的时候才会尝试取2。K折交叉验证可以有效地避免过学习及欠学习状态的发生,最后得到的结果也比较具有说服力。通常情况下,K的取值为3、5、10。

如果原始数据有N个样本,那么弃一交叉验证就是N-1个交叉验证,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以弃一交叉验证会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此次弃一交叉验证分类器的性能指标。

较于K折交叉验证,弃一交叉验证有两个显著的优点:·每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。·实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。

弃一交叉验证的缺点是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,弃一交叉验证在实际运行上便有困难,需要花费大量的时间来完成算法的运算与评估,除非每次训练分类器得到模型的速度很快,或者可以用并行化计算减少计算所需的时间。

另外一种K折交叉验证的用途是随机分离数据为训练数据集和评估数据集,但是重复这个过程多次,就如同交叉验证分离。

分类问题或许是最常见的机器学习问题,并且有多种评估矩阵来评估分类算法。本章将介绍以下几种用来评估分类算法的评估矩阵:·分类准确度。·对数损失函数(Logloss)。·AUC图。·混淆矩阵。·分类报告(ClassificationReport)。

在逻辑回归的推导中,它假设样本服从伯努利分布(0~1分布),然后求得满足该分布的似然函数,再取对数、求极值等。而逻辑回归并没有求似然函数的极值,而是把极大化当作一种思想,进而推导出它的经验风险函数为:最小化负的似然函数[maxF(y,f(x))→min-F(y,f(x))]。从损失函数的视角来看,它就成了对数(Log)损失函数了。对数损失函数越小,模型就越好,而且使损失函数尽量是一个凸函数,便于收敛计算。

ROC和AUC是评价分类器的指标。ROC是受试者工作特征曲线(ReceiverOperatingCharacteristicCurve)的简写,又称为感受性曲线(SensitivityCurve)。得此名的原因在于曲线上各点反映相同的感受性,它们都是对同一信号刺激的反应,只不过是在几种不同的判定标准下所得的结果而已。ROC是反映敏感性和特异性连续变量的综合指标,用构图法揭示敏感性和特异性的相互关系,通过将连续变量设定出多个不同的临界值计算出一系列敏感性和特异性,再以敏感性为纵坐标、(1-特异性)为横坐标绘制成曲线。AUC是ROC曲线下的面积(AreaUnderROCCurve)的简称,顾名思义,AUC的值就是处于ROCCurve下方的那部分面积的大小。通常,AUC的值介于0.5到1.0之间,AUC的值越大,诊断准确性越高。在ROC曲线上,靠近坐标图左上方的点为敏感性和特异性均较高的临界值。

混淆矩阵(CnfusionMatrix)主要用于比较分类结果和实际测得值,可以把分类结果的精度显示在一个混淆矩阵里面。

在scikit-learn中提供了一个非常方便的工具,可以给出对分类问题的评估报告,Classification_report()方法能够给出精确率(precision)、召回率(recall)、F1值(F1-score)和样本数目(support)。在这里简单地介绍一下三个指标数据:精确率、召回率、F1值。

介绍三种评估机器学习的回归算法的评估矩阵。·平均绝对误差(MeanAbsoluteError,MAE)。·均方误差(MeanSquaredError,MSE)。·决定系数(R2)。

平均绝对误差是所有单个观测值与算术平均值的偏差的绝对值的平均值。与平均误差相比,平均绝对误差由于离差被绝对值化,不会出现正负相抵消的情况,因而,平均绝对误差能更好地反映预测值误差的实际情况。

均方误差是衡量平均误差的方法,可以评价数据的变化程度。均方根误差是均方误差的算术平方根。均方误差的值越小,说明用该预测模型描述实验数据的准确度越高。

决定系数,反映因变量的全部变异能通过回归关系被自变量解释的比例。拟合优度越大,自变量对因变量的解释程度越高,自变量引起的变动占总变动的百分比越高,观察点在回归直线附近越密集。如R2为0.8,则表示回归关系可以解释因变量80%的变异。换句话说,如果我们能控制自变量不变,则因变量的变异程度会减少80%。

决定系数(R2)的特点:·可决系数是非负的统计量。·可决系数的取值范围:0≤R2≤1。·可决系数是样本观测值的函数,是因随机抽样而变动的随机变量。为此,对可决系数的统计的可靠性也应进行检验。

审查算法前没有办法判断哪个算法对数据集最有效、能够生成最优模型,必须通过一系列实验判断出哪些算法对问题最有效,然后再进一步来选择算法。这个过程被叫作算法审查。

审查算法的几点建议:·尝试多种代表性算法。·尝试多种机器学习的算法。·尝试多种模型。

回归是一种极易理解的模型,相当于y=f(x),表明自变量x与因变量y的关系。犹如医生治病时先望、闻、问、切,再判定病人是否生病或生了什么病,此处的“望、闻、问、切”就是获取自变量x,即特征数据;判断是否生病就相当于获取因变量y,即预测分类。逻辑回归其实是一个分类算法而不是回归算法,通常是利用已知的自变量来预测一个离散型因变量的值(如二进制值0/1、是/否、真/假)。简单来说,它就是通过拟合一个逻辑函数(LogitFunction)来预测一个事件发生的概率。所以它预测的是一个概率值,它的输出值应该为0~1,因此非常适合处理二分类问题。

线性判别分析(LinearDiscriminantAnalysis,LDA),也叫作Fisher线性判别(

线性判别分析的基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳的可分离性。因此,它是一种有效的特征抽取方法。使用这种方法能够使投影后模式样本的类间散布矩阵最大,并且类内散布矩阵最小。就是说,它能够保证投影后模式样本在新的空间中有最小的类内距离和最大的类间距离,即模式在该空间中有最佳的可分离性。

K近邻算法是一种理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,距离一般使用欧氏距离或曼哈顿距离;同时,KNN通过依据k个对象中占优的类别进行决策,而不是通过单一的对象类别决策。这就是KNN算法的优势。在scikit-learn中的实现类是KNeighborsClassifier。

贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其在所有类别上的后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。

分类与回归树的英文缩写是CART,也属于一种决策树,树的构建基于基尼指数。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归二分每个特征,将输入空间(特征空间)划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。

回归算法是一种专门用于共线性数据分析的有偏估计回归方法,实际上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价,获得回归系数更符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。

套索回归算法和岭回归算法类似,套索回归算法也会惩罚回归系数,在套索回归中会惩罚回归系数的绝对值大小。此外,它能够减少变化程度并提高线性回归模型的精度。套索回归算法和岭回归算法有一点不同,它使用的惩罚函数是绝对值,而不是平方。这导致惩罚(或等于约束估计的绝对值之和)值使一些参数估计结果等于零。使用惩罚值越大,进一步估计会使缩小值越趋近零。

弹性网络回归算法是套索回归算法和岭回归算法的混合体,在模型训练时,弹性网络回归算法综合使用L1和L2两种正则化方法。当有多个相关的特征时,弹性网络回归算法是很有用的,套索回归算法会随机挑选算法中的一个,而弹性网络回归算法则会选择两个。与套索回归算法和岭回归算法相比,弹性网络回归算法的优点是,它允许弹性网络回归继承循环状态下岭回归的一些稳定性。另外,在高度相关变量的情况下,它会产生群体效应;选择变量的数目没有限制;可以承受双重收缩。在scikit-learn中的实现类是ElasticNet。

K近邻算法是按照距离来预测结果。在scikit-learn中对回归算法的K近邻算法的实现类是KNeighborsRegressor。默认的距离参数为闵式距离,可以指定曼哈顿距离作为距离的计算方式。

最合适的算法比较方法是:使用相同的数据、相同的方法来评估不同的算法,以便得到一个准确的结果。

在机器学习方面有一些可以采用的标准化流程,这些标准化流程是从共同的问题中提炼出来的,例如评估框架中的数据缺失等。在scikit-learn中提供了自动化运行流程的工具——Pipeline。Pipeline能够将从数据转换到评估模型的整个机器学习流程进行自动化处理。

在机器学习的实践中有一个很常见的错误,就是训练数据集与评估数据集之间的数据泄露,这会影响到评估的准确度。要想避免这个问题,需要有一个合适的方式把数据分离成训练数据集和评估数据集,这个过程被包含在数据的准备过程中。

Pipeline能够处理训练数据集与评估数据集之间的数据泄露问题,通常会在数据处理过程中对分离出的所有数据子集做同样的数据处理,如正态化处理。

特征选择也是一个容易受到数据泄露影响的过程。和数据准备一样,特征选择时也必须确保数据的稳固性,Pipeline也提供了一个工具(FeatureUnion)来保证数据特征选择时数据的稳固性。

第五部分优化模型

下面是三种流行的集成算法的方法。·装袋(Bagging)算法:先将训练集分离成多个子集,然后通过各个子集训练多个模型。·提升(Boosting)算法:训练多个模型并组成一个序列,序列中的每一个模型都会修正前一个模型的错误。·投票(Voting)算法:训练多个模型,并采用样本统计来提高模型的准确度。

装袋算法是一种提高分类准确率的算法,通过给定组合投票的方式获得最优解。比如你生病了,去n个医院看了n个医生,每个医生都给你开了药方,最后哪个药方的出现次数多,就说明这个药方越有可能是最优解,这很好理解,这也是装袋算法的思想。下面将介绍三种装袋模型:·装袋决策树(BaggedDecisionTrees)。·随机森林(RandomForest)。·极端随机树(ExtraTrees)。

装袋算法在数据具有很大的方差时非常有效,最常见的例子就是决策树的装袋算法。下面将在scikit-learn中通过BaggingClassifier实现分类与回归树算法。

随机森林是用随机的方式建立一个森林,森林由很多的决策树组成,而且每一棵决策树之间是没有关联的。得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行判断,看看这个样本应该属于哪一类,再看看哪一类被选择最多,就预测这个样本为哪一类。

在建立每一棵决策树的过程中,有两点需要注意:采样与完全分裂。首先是两个随机采样的过程,随机森林对输入的数据要进行行、列的采样。对于行采样采用有放回的方式,也就是在采样得到的样本集合中可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样在训练的时候,每一棵树的输入样本都不是全部的样本,就相对不容易出现过拟合。然后进行列采样,从M个feature中选出m个(m<<M)。之后再对采样之后的数据使用完全分裂的方式建立决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么所有样本都指向同一个分类。一般很多的决策树算法都有一个重要的步骤——剪枝,但是这里不这么做,因为之前的两个随机采样过程保证了随机性,所以不剪枝也不会出现过拟合。

随机森林算法:每一棵决策树就是一个精通某一个领域的专家,这样在随机森林中就有了很多个精通不同领域的专家,对于一个新的问题(新的输入数据),可以从不同的角度去看待它,最终由各个专家投票得到结果。

极端随机树是由PierreGeurts等人于2006年提出的,它与随机森林十分相似,都是由许多决策树构成。但它与随机森林有两个主要的区别:(1)随机森林应用的是Bagging模型,而极端随机树是使用所有的训练样本得到每棵决策树,也就是每棵决策树应用的是相同的全部训练样本。(2)随机森林是在一个随机子集内得到最优分叉特征属性,而极端随机树是完全随机地选择分叉特征属性,从而实现对决策树进行分叉的。

提升算法是一种用来提高弱分类算法准确度的方法,这种方法先构造一个预测函数系列,然后以一定的方式将它们组合成一个预测函数。提升算法也是一种提高任意给定学习算法准确度的方法,它是一种集成算法,主要通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。它可以用来提高其他弱分类算法的识别率,也就是将其他的弱分类算法作为基分类算法放于提升框架中,通过提升框架对训练样本集的操作,得到不同的训练样本子集,再用该样本子集去训练生成基分类器。每得到一个样本集就用该基分类算法在该样本集上产生一个基分类器,这样在给定训练轮数n后,就可产生n个基分类器,然后提升算法将这n个基分类器进行加权融合,产生最后的结果分类器。在这n个基分类器中,每个分类器的识别率不一定很高,但它们联合后的结果有很高的识别率,这样便提高了弱分类算法的识别率。

两个非常常见的用于机器学习的提升算法:·AdaBoost.·随机梯度提升(StochasticGradientBoosting)。

AdaBoost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。它将修改过权值的新数据集送给下层分类器进行训练,再将每次训练得到的分类器融合起来,作为最后的决策分类器。使用AdaBoost分类器可以排除一些不必要的训练数据特征,并放在关键的训练数据上面。在scikit-learn中的实现类是AdaBoostClassifier。

随机梯度提升法(GBM)基于的思想是:要找到某个函数的最大值,最好的办法就是沿着该函数的梯度方向探寻。梯度算子总是指向函数值增长最快的方向。由于梯度提升算法在每次更新数据集时都需要遍历整个数据集,计算复杂度较高,于是有了一个改进算法——随机梯度提升算法,该算法一次只用一个样本点来更新回归系数,极大地改善了算法的计算复杂度。在scikit-learn中的实现类是GradientBoostingClassifier。

投票算法(Voting)是一个非常简单的多个机器学习算法的集成算法。投票算法是通过创建两个或多个算法模型,利用投票算法将这些算法包装起来,计算各个子模型的平均预测状况。在实际的应用中,可以对每个子模型的预测结果增加权重,以提高算法的准确度。但是,在scikit-learn中不提供加权算法。下面通过一个例子来展示在scikit-learn中如何实现一个投票算法。在scikit-learn中的实现类是VotingClassifier。

调整算法参数是采用机器学习解决问题的最后一个步骤,有时也被称为超参数优化。学会调参是进行机器学习项目的前提,但第一次遇到这些算法和模型时,肯定会被其大量的参数吓到。其实,参数可分为两种:一种是影响模型在训练集上的准确度或防止过拟合能力的参数;另一种是不影响这两者的参数。模型在样本总体上的准确度由其在训练集上的准确度及其防止过拟合的能力共同决定,所以在调参时主要针对第一种参数进行调整,最终达到的效果是:模型在训练集上的准确度和防止过拟合能力的大和谐。

网格搜索优化参数是一种算法参数优化的方法。它是通过遍历已定义参数的列表,来评估算法的参数,从而找到最优参数。在scikit-learn中使用GridSearchCV来实现对参数的跟踪、调整与评估,从而找到最优参数。网格搜索优化参数适用于三四个(或更少)的超参数(当超参数的数量增加时,网格搜索的计算复杂度会呈现指数型增长,这时要换用随机搜索),由用户列出一个较小的超参数值域,这些超参数值域的笛卡尔集(排列组合)为一组组超参数。网格搜索算法使用每组超参数训练模型,并挑选验证集误差最小的超参数组合。

随机搜索优化参数是另一种对算法参数优化的方法。随机搜索优化参数通过固定次数的迭代,采用随机采样分布的方式搜索合适的参数。与网格搜索优化参数相比,随机搜索优化参数提供了一种更高效的解决方法(特别是在参数数量多的情况下),随机搜索优化参数为每个参数定义了一个分布函数,并在该空间中采样。在scikit-learn中通过RandomizedSearchCV类实现。

调参是算法模型生成之前很重要的一步,本章介绍了两种选择最优参数的方法:网格搜索优化参数和随机搜索优化参数。如果算法的参数少于三个,推荐使用网格搜索优化参数;如果需要优化的参数超过三个,推荐使用随机搜索优化参数。

第六部分结果部署

找到一个能够生成高准确度模型的算法不是机器学习最后的步骤,在实际的项目中,需要将生成的模型序列化,并将其发布到生产环境。当有新数据出现时,需要反序列化已保存的模型,然后用其预测新的数据。

pickle是标准的Python序列化的方法,可以通过它来序列化机器学习算法生成的模型,并将其保存到文件中。当需要对新数据进行预测时,将保存在文件中的模型反序列化,并用其来预测新数据的结果。

joblib是SciPy生态环境的一部分,提供了通用的工具来序列化Python的对象和反序列化Python的对象。通过joblib序列化对象时会采用NumPy的格式保存数据,这对某些保存数据到模型中的算法非常有效,如K近邻算法。

第七部分项目实践

分类或回归模型的机器学习项目可以分成以下六个步骤:(1)定义问题。(2)理解数据。(3)数据准备。(4)评估算法。(5)优化模型。(6)结果部署。

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

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

步骤3:数据准备数据准备主要是预处理数据,以便让数据可以更好地展示问题,以及熟悉输入与输出结果的关系。包括:·通过删除重复数据、标记错误数值,甚至标记错误的输入数据来清洗数据。·特征选择,包括移除多余的特征属性和增加新的特征属性。·数据转化,对数据尺度进行调整,或者调整数据的分布,以便更好地展示问题。要不断地重复这个步骤和下一个步骤,直到找到足够准确的算法生成模型。

步骤4:评估算法评估算法主要是为了寻找最佳的算法子集,包括:·分离出评估数据集,以便于验证模型。·定义模型评估标准,用来评估算法模型。·抽样审查线性算法和非线性算法。·比较算法的准确度。在面对一个机器学习的问题的时候,需要花费大量的时间在评估算法和准备数据上,直到找到3~5种准确度足够的算法为止。

步骤5:优化模型当得到一个准确度足够的算法列表后,要从中找出最合适的算法,通常有两种方法可以提高算法的准确度:·对每一种算法进行调参,得到最佳结果。·使用集合算法来提高算法模型的准确度。

步骤6:结果部署一旦认为模型的准确度足够高,就可以将这个模型序列化,以便有新数据时使用该模型来预测数据。·通过验证数据集来验证被优化过的模型。·通过整个数据集来生成模型。·将模型序列化,以便于预测新数据。做到这一步的时候,就可以将模型展示并发布给相关人员。当有新数据产生时,就可以采用这个模型来预测新数据。