关于算法:R语言样条曲线决策树Adaboost梯度提升GBM算法进行回归分类和动态可视化

52次阅读

共计 3133 个字符,预计需要花费 8 分钟才能阅读完成。

原文链接:http://tecdat.cn/?p=22336 

Boosting 算法是一种把若干个分类器整合为一个分类器的办法,也就是一种 集成分类办法(Ensemble Method)

计量经济学的视角

能够从计量经济学的角度了解晋升办法(Boosting)的内容。
这里的指标是要解决:

损失函数ℓ,以及预测器汇合 M。这是一个优化问题。这里的优化是在函数空间中进行的,是一个简略的优化问题。从数值的角度来看,优化是用梯度降落来解决的(这就是为什么这种技术也被称为梯度晋升)。

同样,最佳值不是某个实值 x⋆,而是某个函数 m⋆。因而,在这里咱们会有相似 m

其中左边的式子也能够写成

从后者能够分明地看到 f 是咱们在残余残差上拟合的模型。
咱们能够这样改写:定义

指标是拟合一个模型,使 ri,k=h⋆(xi),当咱们有了这个最优函数。设 mk(x)=mk-1(x)+γkh⋆(x)。
这里有两个重要点。

首先,咱们拟合一个模型,通过一些协变量 x 来解释 y。而后思考残差 ε,并以雷同的协变量 x 来解释它们。如果你尝试用线性回归,你会在第 1 步完结时实现,因为残差 ε 与协变量  x 是正交的:咱们没有方法从它们那里学习。在这里它是无效的,因为咱们思考的是简略的非线性模型。而实际上,能够应用的货色是增加一个膨胀参数。不要思考 ε=y-m(x),而是 ε=y-γm(x)。弱学习的概念在这里是极其重要的。咱们膨胀得越多,花的工夫就越长。一直从谬误中学习是件坏事。但从启发式的角度来看,当咱们开始适度拟合时,咱们应该进行。而这能够通过对初始数据集进行宰割训练验证或应用穿插验证来察看。

样条曲线

咱们尝试用样条曲线来学习。因为规范的样条曲线有固定的结点,

在这里,咱们将(以某种形式)优化结点地位。为了阐明问题,这里应用的是高斯回归,而不是分类。思考以下数据集(只有一个协变量):


对于结点的最佳抉择,咱们能够应用

lsgen(x, y, degree = 1, numknot = 2)

在 5% 的膨胀参数下,代码简略如下

v=.05

fit=lm(y~bs(x,degree=1,knots=optknot))
yp=predict(fit,newdata=df)
 yr= y - v*yp
YP=v*yp
for(t in 1:200){fit=lm(yr~bs(x,degree=1,knots= optknot) )
 
 
plot(x,  y,ylab="",xlab="")
lines(x,y,type="l")

为了直观地看到 100 次迭代后的后果,应用

viz(100)

很显著,咱们看到,在这里从数据中学习。

决策回归树

咱们尝试一下别的模型。如果咱们在每一步都思考决策树,而不是线性逐步回归(这是用线性样条思考的)。

v=.1 
rpart(y~x,data=df)
yp=predict(fit)
 yr= y -  yp
YP=v*yp
for(t in 1:100){predict(fit,newdata=df)

同样,为了将学习过程可视化,应用

 plot(x, y,ylab="",xlab="")
lines( x,y,type="s"
fit=rpart(y~x,data=df)

这一次,通过这些树咱们不仅有一个好的模型,而且与咱们应用繁多的回归树所能失去的模型不同。
如果咱们扭转膨胀参数呢?

viz=function(v=0.05)
 f$yr=df$y -v*yp
 YP=v*yp
 for(t in 1:100){yp=predict(fit,newdata=df)
 yr= yr - v*yp
 lines(df$x,y,type="s"


显然,这个膨胀参数有影响。它必须很小能力失去一个好的模型。这就是应用弱学习来取得好的预测的想法。

分类和 Adaboost

当初咱们理解了 bootsting 的工作原理,并把它用于分类。这将更加简单,因为残差在分类中通常信息量不大,而且它很难缩减。因而,让咱们尝试一些略微不同的办法,来介绍 adaboost 算法,AdaBoost 是最驰名的 Boosting 族算法。
在咱们最后的探讨中,指标是最小化一个凸的损失函数。在这里,如果咱们把类示意为 {-1,+1},咱们思考的损失函数是(与逻辑模型相干的损失函数是
咱们在这里所做的与梯度降落(或牛顿算法)无关。之前,咱们是从误差中学习的。在每个迭代中,计算残差,并对这些残差拟合一个 (弱) 模型。这个弱模型的奉献被用于梯度降落优化过程。

这里的状况会有所不同,因为更难应用残差,空残差在分类中从不存在。所以咱们将减少权重。最后,所有的察看值都有雷同的权重。然而,迭代之后,咱们将减少预测谬误的个体的权重,缩小预测正确的个体的权重。
咱们从 ω0=1n 开始,而后在每一步拟合一个模型(分类树),权重为 ωk(咱们没有探讨树的算法中的权重,但实际上在公式中是很间接的)。让 hωk 示意该模型(即每个叶子里的概率)。而后思考分类器 ,它返回一个在{-1,+1} 的值。而后设

Ik 是被谬误分类的个体汇合。

而后设置

并在最初更新模型时应用

以及权重

除以总和,以确保总和是 1。如前所述,咱们能够包含一些膨胀参数。为了直观地看到这个过程的收敛性,咱们将在咱们的数据集上绘制总误差。

 for(i in 1:n_iter)rfit = rpart(y~., x, w, method="class")
g = -1 + 2*(predict(rfit,x)\[,2\]>.5) 
e = sum(w*(y*>0))
error\[i\] = mean(1\*f\*y<0)
plot(seq(1,n_iter),error

在这里,咱们面临一个机器学习中的经典问题:咱们有一个完满的模型,误差为零。用多项式拟合:有 10 个察看值,9 度的多项式,拟合很好。将咱们的数据集一分为二,一个训练数据集,一个验证数据集。

train\_car = car\[id\_train,\]
test\_car= car\[-id\_train,\]

咱们在第一个模型上构建模型,并在第二个模型上查看

for(i in 1:n_iter){rfit = rpart(y\_train~., x\_train, w_train, method="class")
  train\_error\[i\] = mean(1\*f\_train\*y_train&lt;0)
  test\_error\[i\] = mean(1\*f\_test\*y_test&lt;0)}
plot(seq(1,n\_iter),test\_error)

在这里,和以前一样,通过 80 次迭代,咱们在训练数据集上有一个不错的模型,但在验证数据集上体现得很差。在 20 次迭代后,成果比拟好。

R 函数:梯度晋升 (_GBM_) 算法

也能够应用 R 函数。

gbm(y~ .,n.trees = 200,shrinkage = .01,cv.folds = 5

这里思考的是穿插验证,而不是训练验证,以及用得是森林而不是单棵树,当然,输入要好得多(这里膨胀参数是一个十分小的参数,而且学习十分慢)。


最受欢迎的见解

1.从决策树模型看员工为什么到职

2. R 语言基于树的办法:决策树,随机森林

3.python 中应用 scikit-learn 和 pandas 决策树

4.机器学习:在 SAS 中运行随机森林数据分析报告

5. R 语言用随机森林和文本开掘进步航空公司客户满意度

6.机器学习助推快时尚精准销售工夫序列

7.用机器学习辨认一直变动的股市情况——隐马尔可夫模型的利用

8.python 机器学习:举荐零碎实现(以矩阵合成来协同过滤)

9.python 中用 pytorch 机器学习分类预测银行客户散失

正文完
 0