机器学习之SG(stacking)

1.关于堆栈泛化Stacked Generalization(SG)
作为一个在kaggle比赛中高分选手常用的技术,SG在部分情况下,甚至可以让错误率相比当前最好的方法进一步降低30%之多。
以下图为例,简单介绍什么是SG:
① 将训练集分为3部分,分别用于让3个基分类器(Base-leaner)进行学习和拟合
② 将3个基分类器预测得到的结果作为下一层分类器(Meta-learner)的输入
③ 将下一层分类器得到的结果作为最终的预测结果
当然,分类器个数不是固定的,具体到模型也没有统一要求。本次实验的第一层是两个子分类器(分别是knn和perception),第二层是逻辑回归。

在这里插入图片描述

我们使用两个模型作为子模型进行stacking,使用线性模型作为聚合器模型。
子模型1:k-Nearest Neighbors。
子模型2:感知器。
聚合器模型:Logistic回归。
每个模型有各自的训练模型的函数和用于进行预测的函数。

子模型1:k-Nearest Neighbors
k-Nearest Neighbors算法使用整个训练数据集作为模型。
knn_model函数用于训练模型。
在这里插入图片描述
进行预测需要在训练数据集中查找k个最相似的记录并选择最常见的类值。 euclidean_distance函数用于计算训练数据集中数据之间的相似性。
以下是对kNN模型进行预测的一些函数。函数euclidean_distance()计算两行数据之间的距离,get_neighbors()定位训练数据集中新数据行的所有邻居,knn_predict()根据邻居做出新数据行的预测。
在这里插入图片描述
我们把邻居数(k)设置为2,它是knn_predict()函数的默认参数。现在knn部分完成了,接下来看看Perceptron算法。

Perceptron算法的模型是从训练数据中学习得到一组权重。
为了训练权重,需要对训练数据进行许多预测以便计算误差值。因此,模型的训练和预测都需要预测函数。
下面是实现Perceptron算法的函数。perceptron_model()函数在训练数据集上使用随机梯度下降训练Perceptron模型,而perceptron_predict()根据权重做出预测。
在这里插入图片描述
perceptron_model()将learning rate和epoch指定为默认的参数,不需要我们再额外设置。我们现在已经实现了两个子模型,让我们看一下实现聚合器模型。

与Perceptron算法一样,Logistic回归使用一组权重(称为系数)作为模型的表示,通过迭代地对训练数据进行预测并更新它们来学习系数。
以下是用于实现逻辑回归算法的函数。 logistic_regression_model()用于训练训练数据集上的系数,logistic_regression_predict()根据系数对数据进行预测。
在这里插入图片描述
logistic_regression_model()同样将learning rate和epoch设置为默认参数。

机器学习算法中,学习如何组合预测与从训练数据集学习非常相似。
我们可以根据子模型的预测构建新的训练数据集,规则如下所示:
每行代表训练数据集中的一行。
第一列是由第一个子模型给出的训练数据集中每一行的预测,即k-Nearest Neighbors。
第二列是由第二个子模型给出的训练数据集中每一行的预测,即Perceptron算法。
第三列是训练数据集中的预期输出值。
构造出的stacking数据集的大概是下面这样:
在这里插入图片描述
然后可以在这个新数据集上训练机器学习算法,例如逻辑回归,实质上,这种新的算法是学习如何最好地组合来自多个子模型的预测。

下面的to_stacked_row()实现了为此stacking数据集创建新行的过程。
该函数将模型列表作为输入,这些用于进行预测;还将函数列表作为输入,一个函数用于对对应模型进行预测。最后,还要加上训练数据集中的单行。
使用每个模型和训练数据行计算预测,然后将训练数据集行的预期输出值添加到行的最后一列。
在这里插入图片描述
在一些预测建模问题上,通过在训练行和子模型做出的预测上训练聚合模型,可以获得更大的提升。
这种改进为聚合器模型提供了训练行中所有数据的上下文,帮助确定怎样才能更好地聚合子模型给出的预测。
我们可以通过聚合训练行(减去最后一列)和上面创建的stacked_row来更新我们的to_stacked_row()来进行改进。
下面是改进后的to_stacked_row()

在这里插入图片描述

堆栈泛化的主要步骤就是如上,接下来我们解决实际的案例。数据集名称为sonar.all-data.csv。 这是一个描述声纳不同表面反弹的返回的数据集。 60个input是不同角度的反弹回的数据。这是一个二元分类问题,需要一个模型来区分岩石和金属圆柱。共给出了208个观测结果。

首先加载数据集,通过load_csv(),str_column_to_float()和str_column_to_int()加载和准备数据集。
在这里插入图片描述
我们将使用k-fold交叉验证来估计模型的性能。
在这里插入图片描述
计算精确度
在这里插入图片描述
使用交叉验证对模型进行评估
在这里插入图片描述
接下来的函数我们在前面的部分都已经提到过了。
Knn部分
在这里插入图片描述
感知器及逻辑回归部分
在这里插入图片描述
构建stacked_row
在这里插入图片描述
然后堆栈泛化的最重要的函数,这个函数做了4件事:
首先训练一个模型列表(kNN和Perceptron)。
然后,它使用模型进行预测并创建新的stacked数据集。
然后,它在stacked数据集上训练聚合器模型(逻辑回归)。
然后,它使用子模型和聚合器模型对测试数据集进行预测。
在这里插入图片描述
最后是指定设置一些必要的参数,如数据集,“k”等以及调用相应的函数进行工作
在这里插入图片描述
全部代码在SG.py
测试结果如下
在这里插入图片描述
打印出了每折的分数以及平均准确率。
参考:
1.<机器学习实战>
2https://blog.csdn.net/zgx123666/article/details/82499217
3.<机器学习>(周志华的西瓜书)
4. https://machinelearningmastery.com/category/algorithms-from-scratch/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值