机器学习项目开发实战,应用

来源:互联网 发布:修改mysql配置文件 编辑:程序博客网 时间:2024/05/29 06:32

1.图像分类----分类

1.1模型---构建一个数字识别系统

数据集组织,图像由像素点组成

读取数据, 从CSV文件读取数据放入一组观测值中,

计算图像之间的距离,取得两个像素数组,并返回描述它们的差异的数字,曼哈顿距离

编写分类器,提供一个已知观测值的训练集对分类器进行训练

1.2验证

交叉验证,计算模型执行任务的质量;

验证集,一个具有已知标签的图像数据集,用来测试模型质量。交叉验证,将可用的数据拆分为训练集和验证集,留出部分数据,使用第一个数据集训练模型,第二个评估质量。

评估质量模型,

改进模型,

1.3改进模型

调整距离函数,搜索多个最靠近的点,对图像进行一些巧妙处理

试验距离的另一种定义,欧几里得距离

重构距离函数,切换距离


2.垃圾邮件识别-----贝叶斯

用贝叶斯定理自动检测垃圾邮件

2.1构建检测引擎

了解数据集,

建立标签模型,

读取数据集

2.2根据一个单词决定

以单词作为线索,

用一个数字表示我们的确定程度,

贝叶斯定理,

处理罕见的单词

2.3组合多个单词

将文本分解为标记,

简单组合得分,

简化的文档得分

2.4实现分类器

将代码提取到模块中,

文档评分与分类,

集合和序列简介,

从文档语料库中学习

2.5训练第一个分类器

实现第一个标记化程序,

交互式验证设计,

用交叉验证确定基准

2.6改进分类器

使用每个单词,

大小写是否重要,

简单就是美,

仔细选择单词,

创建新特征,

处理数字值

2.7理解分类错误


3.类型提供程序的快乐

3.1探索StackOverflow数据

StackExchange API, 使用JSON类型提供程序, 构建查询问题的最小化DSL

3.2世界上的所有数据

世界银行类型提供程序,R类型提供程序,分析数据与R数据框架,.NET数据框架Deedle,全世界的数据统一起来


4.自行车与人-----梯度下降

预测一个数据,给定一个二手机特性(车龄,里程数,发动机规格等),预测售价;

与分类模型两点不同:模型预测的是真实数字,取值范围可能很广且有意义;关注特征的编号如何影响预测。 price = α1α2 x age + α3 x miles 回归模型

本章目标,预测指定日期信息(天气星期)条件下使用自行车共享服务的人数,回归模型,试图找出一个函数,组合各个特征以预测某个数字值,并尽可能拟合以接近真实数据。

4.1了解数据

数据集有哪些内容,日期,季节,年月日,是否假日,是否周末,天气,温度,湿度,风速,临时用户计数,注册用户计数,。租车总数

用Fsharp.Charting检查数据,数据相当不规则,每天波动很多,波动的幅度大,总体趋势向上

用移动平均数发现趋势,在一定长度的时间窗口内求取平均值

4.2为数据适配模型

定义简单直线模型,fα(obs)=α0 + α1 x obs.Instant

定义一整类的预测模型(线性回归模型),这些模型遵循相同的通用模式,尝试用一个或多个输入变量(obs.Instant)预测一个数值,每个输入变量都有自己的隶属乘数α,用索引区分,这个乘数称为回归系数,预测值由每个变量乘以其系数并加总求得,组成线性组合

寻找最低代价模型,寻找与数据匹配得最好的直线,或与实际数据距离最小的曲线;

可以改编距离函数,计算预测曲线与实际值的欧几里得距离,比较每个数据点的真值和预测值(欧几里得通过求差值的平方数对误差予以惩罚,较大的误差比较小的误差受到惩罚严重),欧几里得距离使数学模型更简单

用梯度下降找出函数的最小值,

从一个α值开始,观察预测误差,逐渐调整α以减小误差

极值点,从随机值x开始,可以计算导数(或者梯度)逐步迈向下降的方向:Xk+1 = Xk - α x g'(Xk),α的值称作学习速率,谢啦只有在非常接近x时才能产生正确值,α使我们可以调整更新x的步长。变化取决于g',当斜率很大时,我们对x进行较大的改变,当g'较小时,很有可能接近最小值,我们将做较小的调整;利用这种方法,如果一切按计划进行,就可以得到一个序列x0,x1,...,每一项都产生一个更小的g值,这就是梯度下降算法。

使用梯度下降进行曲线拟合,

调整一下问题:不将焦点放在模型预测的值上,而是考虑我们试图减小的误差(或者代价函数),另一个调整,不考虑将观测值x作为输入参数,而是换一个角度,考虑以α为参数,

在这个框架下使用参数α计量模型代价的函数如下:cost(α0,α1)=(obs.Cnt - (α0 + α1 x obs.Instant))平方

这个模型计量对模型使用参数α0和α1时,某个观测值obs的误差

首先将代价改写为α1的函数,略作扩展并重新组织各项为aα1(平方)+bα1+c的形式

cost(α1)=α1(平方)Xobs.Instant(平方) - (2 x obs.Instant x (obs.Cnt - α0)) + (obs.Cnt - α0)平方

ax(平方)的导数为2ax,bx的导数为b,由此代价函数的导数


更通用的模型公式

有N个特征X1,X2,....,Xn,试图用如下预测模型拟合:Y = α0 + α1X1 + α2X2 + ... + αnXn,简单直线模型为N=1特例。

在模型中引入‘伪’特征X0,对每个特征值都设X0=1,这样Y = α0X0 + α1X1 + α2X2 + ... + αnXn

现在可以改写代价函数cost(αk) = (Y-(α0X0 + α1X1 + α2X2 + ... + αnXn))平方

现在尝试为0-N之间的任何K值找出更新αk的方法,在求导并重复上面的步骤之后,最终得到如下公式:αk <--- αk - 2α x Xk x (α0X0 + α1X1 + α2X2 + ... + αnXn)

如上可以用于同时更新所有参数α(包括应用到常数项的α0),可用于任意多个特征

4.3实施梯度下降的方法

随机梯度下降,简单的在观测值上迭代,在每一步中进行小的调整,首先需要一个函数在给定的观测值和α值下,以学习速率β更新α(前面公式的直接实现),计算α的值并以元组形式返回

分析模型改进,进一步观察算法表现,具体的说观察预测误差的变化,在这里我们要做的是取一个激进的α值(10倍于前面确定的最有效点),绘制并执行每次调整后的总体误差图表;更新过程一次只关注一个观测值,进行的一系列修正都向相同方向倾斜

随机梯度下降潜在的局限性:(与样本数据选取时间段相关,冬季夏季)我们尝试实现一致性的估算,但是处理过程实际上是一个接一个地探查每个观测值,并遵循最后一个观测值表现出来的方向,这可能导致某些不必要的充电。例如一个或一连串的非典型观测值。

处理上述问题方法之一,避免依赖单个观测自,而代之以根据整个数据集进行更新,这是批量梯度下降的基础

随机梯度下降,易于实施,适合于广泛的情况,可以进行所谓的‘在线学习’,该算法在学习时不需要事先获得整个数据集,如果随着时间的推移获得新数据,模型可以仅用当前模型和最新的观测值进行更新。

批量梯度下降

在随机梯度下降中,我们的目标是最小化单一观测值上的误差,我们也可以将焦点放在整个数据集的平均误差(所有单独误差的平均值)上,而不是聚焦于单一观测值。

我们要做的是提取每个观测值,根据该观测值单独计算α的调整值,再取所有调整的平均值,然后重复更新过程,逐步微调α的估算值,在一定的迭代次数之后或者搜索已经稳定,α值在两次迭代之间没有太大变化时停止;

上述问题缺点,需要人工调整学习速率,如果大量迭代运行该算法,就会注意到迭代不断降低,参数α0不断增加,只有经过很长时间才能稳定----线性代数可解决

4.4线性代数

问题域的细节并不重要,将终端放在数据的结构上,将问题域转换成公共结构,应用通用算法解决共享同一结构的问题。

缩短公式,将整个批量梯度下降算法改写为一系列向量和矩阵运输,

用math.NET进行线性代数运算,

标准形式,

利用MKL开足马力

4.5快速演化和验证模型

交叉验证和过度拟合,简单地打乱数据集并返回两个‘切片’,创建训练和验证集,第一个切片占70%,作为训练集,剩下30%用作验证集

简化模型的创建,通过包含或者删除特征,简单地创建多个模型,然后求出有效的参数值,我们需要的是一种将观测值转换为一组特征的手段,每个特征从一个观测值中提取一个浮点数,这样就能将观测值转换为一个特征矩阵,通过标准形式估算对应的α

MAE表明预测的平均偏离程度。

在模型中添加连续特征,在模型中添加选自可用连续变量的特征----也就是有数学意义的变量,如温度或风速,并将其添加到新的特征化器中。

4.6用更多特征改进预测

处理分类特征,(周一到周日,但是没有数字上的意义,为分类变量)

共线性问题,

两种措施,首先可以从列表中删除一天,这样实际上将这天作为参考日,赋予其他6天的α值将捕捉和该日相比的微分增益或损耗。另一方面,从方程中删除常数项,可以得到7天的直接估算。将各个类别划分为单独特征并使用指标变量(1表示该类别,0为其他类别)表示其活跃度,这样可以在工作量最小的情况下,于回归模型中使用分类变量;

非线性特征,考虑温度,非线性关系,引入高次多项式

正规化,过度拟合,将所有特征都投入到模型中,只是机械地提高在训练集上的质量,不一定能够产生稳定的预测模型。

正规化,过度拟合过度拟合的症状之一是在尝试用特征拟合训练集时,算法开始产生某些‘疯狂’的α系数值,而在合理的模型中,系数应该保持在某一范围内,使得输入的变化不会造成疯狂的波动。

引入补偿函数(惩罚函数),使高的单独值在代价上高于小的单独值,

规格化,重新标度模型中的所有特征,使其可以相互比较。

normalized = (x-xmin)/(xmax-xmin),将每个特征按比例转换成0-1的数

在正规化补偿中忽略了α0,因为很难找到规格化常数项的方法,该特征的每个观测值都为1,α0起的是偏移值的作用,可以是任何值

补偿项之前的参数入,这个参数可以解释为权重,驱动正规化补偿函数在代价函数中的价值。该参数需要人工调整,找出具有最小误差的值

4.7用梯度下降最大限度地减小代价,用回归方法预测数字

梯度下降算法,按照梯度(从当前状态最陡峭的下降方向)迭代调整参数,确定使函数值最小的参数的通用方法

只要函数存在最值,即可使用这种方法(找到一个最适合于某个数据集的模型,打算最小化某种形式的距离或者代价函数)

随机梯度下降方法每次用一个观测值更新参数,不需要一次操作整个数据集,因此对于在线学习很方便,如果数据集随时间推移而扩展,随时接收新观测值,就可以用刚收到的最新数据点更新预测,并不断逐步学习。缺点是,该方法相对较慢,稳定与也可能较差,虽然总体保持正确方向,但是每个单独步骤不能保证改善;

批量梯度下降一次操作整个数据集,每一步都产生改善,缺点是每一步都需要更多的计算,而且使用整个数据集可能不现实,特别是在数据集很大的情况下。


5.你不是独一无二的雪花------聚类

有监督学习方法(如分类或回归),从一个问题和带有标签的数据(即带有问题答案的例子)开始,由此学习一个拟合数据的模型

无监督学习中,只拥有数据,希望计算机能够帮助我们找出数据中的某种结构

两种数据分析技术,k均值聚类分析和主成分分析,目标都是从数据集中自动提取信息,提供更简单实用的表现形式

5.1发现数据中的模式

无趣的数据就是没有突出特征的数据

有趣的数据,数据是有些组织,而不是均匀同质的分布

观测值分为两组,围绕两个中心随机分布,这类模式称作’聚类‘,聚类分析是自动识别数据集中此类结构的过程

线性结构等多种形式

5.2理解StackOverflow上的主题

观察在StackOverflow问题使用的标签中能否找出模式,目标通过观察一段时间的用户和问题以及最活跃的标签看能否找出一些结构和常见的组合

数据集:

找出StackOverflow上最常见的30个标签,读取每个标签最活跃的用户,将提供答案最多和提问最多的用户集中在一起,提供了一个大约1600个不同用户列表

然后对每个单独用户,读取他们2015年中积极参与的100个标签,以及对应的活跃度,仅保留属于30个主要标签的数据

最后在最终数据集中重新排列数据,组织为30列(每个标签一列),1600行(每行一个用户),每行和每列都包含用户2015年之内活跃与该标签的次数

获得数据:将每行用户标签活跃度解析为一个浮点数组

数据就绪后,通过计算平均值,最小值和最大值等统计数字,看看每个变量的样子

输出特征:每个标签最小值都为0,说明每个标签都有无活跃用户的情况;其次每种情况下平均值都很小,和最大值比,它和0的距离更近,说明对于每个标签,大量用户的活跃度都很低;每个标签的活跃度分两组(非常活跃,非常不活跃)

图表显示有几个标签使用量明显大于其他标签,更全面的视角理解这些主题之间可能存在的关系:

首先使用k-均值聚类识别有类似行为的用户组,然后使用主成分分析,更好的理解变量之间的相互关联

5.3用k-均值聚类方法找出聚类

质心,位于聚类的中心位置,距离所有聚类观测值都不远,能够代表整个组;确定聚类质心最明显的候选方法是取其成分的平均值

分类规则:如果想确定观测值属于哪个聚类,可以简单地查找所有可用的质心,选择最靠近的一个

改进聚类和质心,

k-均值聚类算法

将数据集分为k个聚类,选择k个随机的质心,逐渐更新其位置,直到达到稳定。

实施k-均值聚类方法,

算法:

必须提供一组观测值和聚类的数量k,还需要定义距离的定义,以便将观测值分配给最近的质心;还需要一种方法将统一聚类的观测值归纳为单一的聚合观测值---更新后的质心

首先,需要一个新文件,开始编写一个聚类化函数。在开始迭代更新聚类和分配之前必须初始化聚类和分配,并决定如何表示他们(为每个聚类提供一个整数并定义分配为一个观测值和所连接的聚类ID)

然后,初始化规程,创建一个随机数生成器,并随机选择k个观测值作为质心的初始候选,与1-k的聚类ID关联

更新规程,将每个观测值分配给最近的质心,得到一个新的分配,并将其与前一个分配比较。如果所有观测值都没有改变所属聚类工作就完成了,否则按照聚类ID集合观测值,将其归纳为平均质心,持续更新

5.4StackOverflow标签的归类

运行聚类分析,

使用欧几里得距离将一组观测值归纳为其平均值,

将淘汰没有使用任何标签的观测值(也就是用户在此期间在所选择的标签上完全没有任何活动)

随机选择k=5随机选择质心位置,可能在每次运行中得到不同结果

结果分析,

映射每个聚类,并将标签名称与我们所拥有的数值匹配

结果,有一个巨大的聚类,大约93%观测值属于此类;还有4个聚类,每个包含的观测值都不到数据集的2%

5.5好的聚类和坏的聚类

考虑方法可能出现的错误:首先数据中可能完全没有聚类;那就没什么措施了

算法两个方面可能出错:寻找的聚类数量,特征的标度差别是否太大无法以有意义的方式比较

实际三类被初始为2类,会导致有一些组合一起出现,同时出现在不同的组里,取决于初始质心选择

另一种,两个特征的标度大不相同,必须转换数据,使所有特征都处于可比较的相同量级,重新标度每个特征:x' < - (x - min) / (max - min),结果每个认真分布都在0-1范围

5.6重新标度数据集以改进聚类

问题:聚类数量不合适(每次预先都得到不同结果),特征标度有差异

忽略时长,考虑比例,将每个用户最活跃标签设置为100%,其他标签相应除以该值

5.7确定需要搜索的聚类数量

什么是好的聚类,

聚类是相互之间有合理相似度的一组观测值,与其他聚类有可识别的差异;即,相对于数据集中的总体偏差,每个观测值应该接近其质心;

残差平方和(RRS),取得每个观测值,计量与其质心的距离,并将其加总;

尝试不同k值,去RSS最小的一个;还需要复杂性的补偿项

赤池信息量准侧(AIC),计算一个数值型计量值,衡量特定k值的好坏。它将RSS和补偿项2xmxk组合为一个计量指标,其中m是特征数量,k是聚类数量

换言之,偏向于聚类较少的模型,对于具有许多特征的模型保持审慎态度

确定StackOverflow数据集的k值,

首先使用工业界常用的经验法则。根据数据集的大小,来大致了解合理值的范围,作为上界25

找出上界,尝试1-25之间的所有可能性,得出对应的AIC平均值,成先下降再上升趋势,选择k=10使AIC最小

最终的聚类

根据AIC为k选择了值10,现在运行聚类算法多次以避免偶然性,选择特定k值下RSS最小的模型,结果看上去还不错。

5.8发现特征的相关性

主成分分析方法(Principal Component Analysis,PCA),在某种意义上是k-均值的补充,k-均值情绪地提供了对单独观测值的剖析,但是对于特征的相互关系没有提供太多信息,而PCA主要是发现特征(而非单独观测值)中的一些结构

协方差和相关系数,

每当数量A增加,质量B也增加。即为协方差和相关系数的含义;

两个计量值X和Y之间的协方差定义为: Cov(X, Y) = average [ ( X-average(X)) * ( Y- average(Y)) ]

如果两个值X和Y同时上升和下降,则一个值高于其平均值时,另一个也是,其乘积为正数,当一个值低于平均时另一个也是,与平均值差值皆为负数,但乘积为正。

根据相同的原因,可以预期两个变化相反的特征的协方差为负。

协方差为0并不意味着两个特征之间没有关系,这只是说明,它们不是简单的同时上升或下降。如描述圆形的数据点的相关系数为0

协方差依赖于特征的标度,自身没有明显的标度,因此很难诠释,什么是“高”协方差,取决于数据。

相关系数是协方差的改良形式,解决了这个问题,特征X和Y的相关系数公式定义如下:Corr(X, Y) = Cov(x, Y) / (stdDev(X) * stdDev(Y))

式中stdDev是标准差的缩写,标准差(及其平方,方差)被描述为特征分散程度的计量,标准差计量与平均值的平均距离

协方差的问题在于X和Y之间的标度差异,为了使不同特征可以比较,我们需要将(X- average(X))和(Y-average(Y))两项归约为类似的标度。

将(X-average(X))除以其平均值------X与其平均值之间的平均距离,就可实现这个目标

可以扩展方差部分,将公式重组如下等价版本: Corr(X, Y) = average [ (X-avg(X)) / stdDev(X) *(Y-avg(Y)) / stdDev(Y) ]

(X-avg(X)) / stdDev(X)项取协方差的平均值并用∑重新标度,平均差值现为1,X和Y项处与可比的标度,结果是,范围为-1和1之间

1代表X和Y以完全线性关系同向变化,-1表示方向相反的完全线性关系,0表示没有发现上述关系,系数越靠近1或-1,模式越明显,特征几乎是同时变化的

z-得分,将计量值X转换为(X-avg(X)) / stdDev(X)是重新标度某个特征的经典方法之一

StackOverflow标签之间的相关性

数据采用特征而非观测值形式,不是1600个观测值(每个包含30个值),而是需要将其转置为对应30个特征的30行。我们得到一个30*30的矩阵,每个元素对应于两个特征之间的相关系数。对角线元素都为1,矩阵是对称的(A和B以及B和A的相关系数相等),因为数据太多,我们要取得每个标签对,从矩阵中得到其相关系数,提前20个绝对值最大的,因为大的正负值表示同样的强相关。

5.9用主成分分析确定更好的特征

观察协方差和相关矩阵的结构,并利用他们将数据重组为一组新的特征,将现有特征组合为更有效地代表数据避免冗余的混合体

用代数方法重新组合特征,

重新组织数据集的手段,

问题简化为只有两个特征的数据集,表征变换的方式之一是使用2x2矩阵,如果将一个观测值(两个元素组成的向量)乘以该矩阵,就得到一个新向量,该向量仍然有两个特征。

变换矩阵的每一行可以视为权重,例如第一行表明第一个转换后的特征中包含1份第一个原特征,以及3份第二个特征,如果变换使用单位矩阵(对角线为1,其余为0),返回的就是原来的特征。

我们寻找的就是这样一个矩阵,在特殊场合下,可以转换重新安排特征,限制相关矩阵中发现的冗余信息,还希望有一种方法能够区别数据集中的重要趋势和不重要的差异。

一种线性代数技术可以完成:将矩阵分解为特征向量和特征值,概略来讲,NxX矩阵M可以唯一分解为N对特征值和特征向量(一个浮点数和一个N元素向量),每一对都满足如下等式:Mx特征向量=特征值x特征向量,换言之,特征向量是将M延伸到与其特征值对应的倍数的一个方向。

PCA工作方式预览,

将4个特征简化为2个特征,并且几乎没有失去任何信息

实现PCA,

PCA依赖数据集协方差矩阵的特征分解

计算每个特征列的协方差,利用该矩阵对此避免重复工作

对StackOverflow数据集应用PCA,

观察输出,检查特征值,可以提取每个主成分(新特征)包含的信息量,为此,我们将计算提取的30个特征值的总量,然后输出每个特征的占比,以及仅使用信息量最大的特征时覆盖的总量。按照特征值降序查看特征是习惯做法。前5个特征可以解释数据集的50%,前10个覆盖80%,后10个仅覆盖不到1%

分析提取的特征

每个特征值直接将旧特征映射到一个新特征(主成分),我们需要的就是从前面的PCA得到的分析结果中捕捉特征向量,将每个特征向量的值映射到对应的标签名称。

PCA和聚类分析都在无监督的情况下创建数据的有效摘要,但是两者在解决问题的方式上有极大的不同,聚类分析提取具有类似行为的观测值分组,与此不同,PCA重组数据,创建新特征,将原始特征重新组合成新特征,描述观测值之间行为上更广泛的差异。在此过程中,创建了数据集的全面高级别‘映射’,使用量少,信息量大的特征,以更有效的方式描述数据。

5.10提出建议----推荐系统

简单标签推荐系统,

实现推荐系统,

验证做出的推荐


6.树与森林------决策树

6.1泰坦尼克上的生死存亡

了解数据集,

观察各个特征(计算不同因素的影响,头等舱有63%幸存率三等舱24%,女性74%),

构造决策桩(取得样本数据,按照上面的做法将其分成不同组,对每一组预测最频繁出现的标签,称做决策桩模型;决策桩是树的组成部分,是最小化的分类器,常常作为其他模型的组成部分),

训练决策桩

6.2不适合的特征

尝试将更大数据及信息组合起来麻将多个决策桩组合形成一棵决策树,改进预测

数值该如何处理(将具有连续数字值特征的数字转换为离散值,将票价转换为一个分类特征,高于或低于平均值),

缺失数据怎么办(具有漏失值的特征,从样本中过滤具有漏失值的例子,然后仅为这些情况创建一个分支,将其保存为一个Map类型值以提供方便)

6.3计量数据中的信息

用熵计量不确定性,(一个群体的分布越均匀,我们拥有的信息就越少,任何一种猜测都不比其他猜测好,信息论为此定义了一个指标:熵(香农熵),如果有一个样本群体,其熵计算如下:enrtopy(sample) = sum[ - p(x) * log p(x) ], p(x)是样本中x的比例,也就是观察到一个值x的概率,样本的信息量最小时(每个标签出现的次数相等),熵最大,对于组织完善(可预测)的样本熵降为0,样本纯度越高,越容易猜测,熵越小

信息增益,熵增益指的是按照一个特征分割样本所得到的信息量,而不是熵本身;当性别无法提供任何信息时(即各有一半遇难幸存),熵增益为0,完美分割时对应为1

实现最佳特征识别,按照给定特征分割样本计算平均熵,因为需要注意样本中可能有缺失的数据,我们只需过滤该特征没有值的观测点,按照特征值分组,按组计算熵的加权平均值;另外,特征类型不同(性别字符串,客舱等级数字),为特征定义一个类型,就可以用列斯的方式处理他们,更加清晰的方式分析他们

使用熵离散化数值型特征,获取最大信息增益值来确定分离点(12岁以上一下成年人和儿童),好处是完全自动化

6.4从数据中培育一棵决策树

依靠决策桩,有了最小的单位,可以经过训练,根据特征处理不同分支中的观测值;

凭借熵,可以计量给定观测值样本中某个特征的实用性

现在需要将决策桩组合成一棵完整的树,从一组特征和一个训练集开始,识别出信息量最大的特征,为每个结果创建一个桩,并对每个分支重复这一操作。

建立树的模型,桩的每个分支都给出一个明确答案,树可能是一个答案或引出另一棵树的桩

给定一位乘客和一棵树,如果树产生的结果是答案,工作完成;否则使用与桩相连的特征得出乘客的另一个特征值,继续在对应的树中搜索。如果值为空,说明遇到了缺失数据,将使用桩中指定的默认值,为了避免遇到未知的值,将其也当做默认值处理。

建立决策树,用样本和一组初始特征构建决策树,简单的找出样本中信息量最大的特征,为它建立一个桩,并且持续下去直到没有剩下任何特征,或者剩下少量数据

更漂亮的树,上面会生成一棵树切有明显改进,,但是输出的树奇丑无比,而且没有用交叉严重评估工作

下面,递归遍历决策树,每当遇到新的深度时就增加缩进,随之打印输出特征和分支名称

6.5改进决策树

为什么会过度拟合,对未出现的数据,预测值都是默认的未知值,

树是递归学习,随着算法的推进,这种方法在越来越小的样本上一次学习一个特征,而不是在完整的训练集上一次学习所有特征;

考虑熵的原理,首先信息不会消失,在最糟糕的情况下,按照一个特征分割样本不会提供任何信息,因此在当前的实现中,我们总是将所拥有的每个特征添加到树中,即使不能增加任何信息也是如此,其次,因为熵基于比例,只要成分完全相同,在分析小样本和大样本时会得出相同结论,(10和10000个观测值样本中得出的置信度不可能相同)

用过滤器限制过度的自信,在不足以得出结论的样本基础上学习,简单方法之一是在树生成算法中添加过滤器,在树向下扩展时删除弱的候选

目前选择的是具有最高条件熵的特征,可以通过仅保留有正面熵增益的特征改善算法,为了执行该操作,需要几部分数据:一个特征,一个样本和标签,才能计算熵和分割后的熵,并检查分割之后的熵是否更好(是否确实更低)

但是上述方法不容易扩展,所以另一种解决方案:在Map.filter中应用一个“特征过滤器‘---检查特征符合给定样本和标签中的一个条件的函数,可以简单地将一组过滤器传递给我们的算法,值保留满足所有过滤器的特征。

在最后的分支增加可能性,或合并对单一问题答案完全相同的桩

6.6从树到森林

从一个训练样本上学习,就有在一个样本上过度学习的固有风险;上述策略:应用某种方式的补偿(惩罚)限制算法的学习范围

另一个方向,尝试从不同数据集学习,避免依赖于单一模型,而不是随意限定可能的学习范围

用k-折方法进行更深入的交叉验证,

不选择单一的和随机的验证样本,而是构建多个训练/验证样本,在每个样本上重复相同的过程;

将样本分割为k个’切片‘,使用一个切片验证,剩下的k-1个切片用于训练,创建k种组合(分成3个一样大的切片,1个做验证,建立3中配对,而不是1/3验证,2/3训练)

k-折方法,k越大,操作成本越高,每个模型共享数据越多,因此可能表现的更像使用整个数据集的模型

将脆弱的树组合成健壮的森林,

k-折方法扩展产生更健全的预测模型,“集成方法”研究的是将多个弱预测模型组合成强于各部分综合的整体模型

Bagging{自助聚集法Bootstrap aggregating),简单的从原始数据中统一地随机采样观测值,生成多个训练集,其中利用了置换方法,相同的观测值可能出现多次。直觉上,这种方法将缓解过度拟合的风险,因为每个模型将在不同样本上训练,每个模型仍然会拾取数据中的虚假信息,但是各不相同,在组合起来时可能相互抵消。

决策树中,因为生成规程中每次推进一个特征,有些特征可能会屏蔽其他特征的影响,按照熵的顺序(选择了强相关特征),可能忽略能够传达某些有用信息的特征;可以采用随机采样特征,使隐含特征有机会参与决策树

两种思路合二为一,创建多个较简单的树,组成一个森林,每棵树使用随机选择的训练样本和特征的一个子集,每个单独的模型都弱于一次使用所有数据的决策树,组合起来提供更可靠的预测

实现缺失的部分,用森林代替树,只需添加3个要素:从一个列表中随机选择特征(没有重复),从元素样本中随机选择样本(可以重复),将多棵树的预测组合成多数表决

发展一个森林,按照用户定义数量创建树

尝试森林,创建一个特征列表,使用和前面相同的10个训练/验证集对,训练一个由1000棵树组成的森林(每次使用稍有不同的特征和观测值组合),然后计算算法在训练集和验证集上的准确度


7.一个奇怪的游戏-----增强学习方法借鉴经验

更多的去做看上去有效地事,较少的做看上去会失败的事(模拟一个物种发现未知世界的行为,从行动的结果中学习,随经验积累做更好的决策)

7.1构建一个简单的游戏

游戏元素建模,Hero(小人儿),直走,左转,右转;位置和方向信息,每个单元(空,陷阱,宝藏)

游戏逻辑建模,移动函数moveTo,棋盘保存,不同位置状态(加分减分)

以控制台应用的形式运行游戏,

初始化游戏世界,随机填充陷阱宝藏;Hero行走决策随机确定(无脑状态);

游戏显示

7.2构建一个粗糙的‘大脑’

决策过程建模,每一次都处在某种状态,执行某个动作,观察某个结果,最终进入下一个新状态

从经验中学习制胜策略,

算法:评估策略的学习过程,可行性之一是记录积累的所有经验,当Hero进入一个状态时,可以搜索过去遇到的相同状态,计算所做出的每个决策的平均回报,(不现实:积累数据太大);更有效的方法,为尝试过的每个策略维护单一记录,也就是状态和决策的组合,并根据到目前为止积累的所有经验,逐步估算策略的好坏,当我们遇到已知状态时,所需要做到就是在策略目录(大脑)中查找3个可能匹配的策略,并选择具有最高值的策略。

两个问题:Hero遇到未知状态时,采取随机动作,观察发生的情况。

Hero在两次采取相同行动时应该怎么办?始终保持学习,逐步改善对某个策略预期回报的估算,使用一个学习速率α(0-1)决定策略价值更新的激进程度,每当一个状态下采取某种行动时,根据如下方案更新策略的价值。    价值(策略) <--- (1-α) x 价值(策略) + α x 收益

将α设为0意味着从不学习,保持初始估算结果;将α设为1表示望京所有已经学习的,用观察到的最新值代替;α越靠近0,调整越慢,该值越高,对新观测值反应越快

实现‘大脑’,进入一个特定state时,如果brain之前没有见过这种状态,将采用随机的决策,否则有3种可能的策略(直行左右转),将选择具有最大价值的策略,尚未评估的策略价值为0

测试‘大脑’,使用大脑代替随机决策,必须在某个时点进行某种学习;多次测比较,多次运行游戏

7.3我们能跟高效的学习

探索与利用的对比,

Hero可以不断尝试随机策略,深圳在有合适的策略时也可以这么做,最简单的方法成为e-学习,在每一轮中,我们以一个较小的概率e,不管已知的策略采用随机决策进行探索。

红色的门和蓝色的门是否不同,对对称或旋转的预处理,减少内存,加快学习速度

贪婪与规划的对比,不仅包含直接收益,还包含策略最终结果的价值 价值(策略) <--- (1-α) x 价值(策略) + α x (收益 + γ x 价值(下一状态的最佳选择))

q-学习,在短期收益和长期规划之间的妥协,γ=0完全忽略下一步发生的情况,γ=1直接收益和最终收益同样重要

7.4无限的瓷砖组成的世界

不仅有陷阱和宝藏,还有随机数量的瓷砖类型,每种瓷砖有不同的颜色和奖励;

已访问单元的内容不会消失,而是由一块随机的砌砖代替;这样新的游戏世界不断变化并创建新状态,同时仍然有可以学习的知识;

7.5实现‘大脑’2.0

减少状态数量,展望未来而不只是观察短期收益,保留一些探索的空间

简化游戏世界,通过旋转减少状态数量

预先规划,为学习规程增加前瞻性,在学习函数中包含γ项

E-学习,时常采用随机决策,即使在已知策略有不错的结果是也如此,从而促进探索;

7.6符合直觉的简单模型,自适应机制


8,重回数字

8.1调整代码

寻求的目标,调整距离函数,使用Array.Parallel

8.2使用Accord.NET实现不同的分类器

逻辑回归,用Accord实现简单逻辑回归,一对一一对多分类,支持向量机,神经网络,用Accord创建和训练一个神经网络

8.3用m-brace.net实现伸缩性

用Brisk启动Azure上的MBrace,用MBrace处理大数据集





原创粉丝点击