IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 集成学习07-Stacking -> 正文阅读

[人工智能]集成学习07-Stacking

Stacking集成方法在比赛中被称为“懒人”算法,因为它不需要花费过多时间的调参就可以得到一个效果不错的算法,同时,Stacking算法容易理解,因为这种集成学习的方式不需要理解太多的理论,只需要在实际中加以运用即可。

Stacking严格来说并不是一种算法,而是精美而又复杂的,对模型集成的一种策略。Stacking集成算法可以理解为一个两层的集成,第一层含有多个基础分类器,把预测的结果(元特征)提供给第二层, 而第二层的分类器通常是逻辑回归,他把一层分类器的结果当做特征做拟合输出预测结果。在介绍Stacking之前,我们先来对简化版的Stacking进行讨论,也叫做Blending,接着我们对Stacking进行更深入的讨论。

1. Blending算法

类似解题时,对各个同学的答案加以总结和分析,最终得出正确答案。

下面详细讨论下Blending集成学习方式:

  • (1) 将数据划分为训练集和测试集(test_set),其中训练集需要再次划分为训练集(train_set)和验证集(val_set);
  • (2) 创建第一层的多个模型,这些模型可以使同质的也可以是异质的;
  • (3) 使用train_set训练步骤2中的多个模型,然后用训练好的模型预测val_set和test_set得到val_predict, test_predict1;
  • (4) 创建第二层的模型,使用val_predict作为训练集训练第二层的模型;
  • (5) 使用第二层训练好的模型对第二层测试集test_predict1进行预测,该结果为整个测试集的结果。

梳理下这个过程:
在(1)步中,总的数据集被分成训练集和测试集,如80%训练集和20%测试集,然后在这80%的训练集中再拆分训练集70%和验证集30%,因此拆分后的数据集由三部分组成:训练集80%* 70% 、测试集20%、验证集80%* 30% 。训练集是为了训练模型,测试集是为了调整模型(调参),测试集则是为了检验模型的优度。
在(2)-(3)步中,我们使用训练集创建了K个模型,如SVM、random forests、XGBoost等,这个是第一层的模型。 训练好模型后将验证集输入模型进行预测,得到K组不同的输出,我们记作𝐴1,...,𝐴𝐾,然后将测试集输入K个模型也得到K组输出,我们记作𝐵1,...,𝐵𝐾,其中𝐴𝑖Ai的样本数与验证集一致,𝐵𝑖Bi的样本数与测试集一致。如果总的样本数有10000个样本,那么使用5600个样本训练了K个模型,输入验证集2400个样本得到K组2400个样本的结果𝐴1,...,𝐴𝐾,输入测试集2000个得到K组2000个样本的结果𝐵1,...,𝐵𝐾。
在(4)步中,我们使用K组2400个样本的验证集结果𝐴1,...,𝐴𝐾作为第二层分类器的特征,验证集的2400个标签为因变量,训练第二层分类器,得到2400个样本的输出。
在(5)步中,将输入测试集2000个得到K组2000个样本的结果𝐵1,...,𝐵𝐾放入第二层分类器,得到2000个测试集的预测结果。

Blending集成方式的优劣:
其中一个最重要的优点就是实现简单粗暴,没有太多的理论的分析。但是这个方法的缺点也是显然的:blending只使用了一部分数据集作为留出集进行验证,也就是只能用上数据中的一部分,实际上这对数据来说是很奢侈浪费的。

作业:
留个小作业吧,使用Blending方式对iris数据集进行预测,并用第四章的决策边界画出来,找找规律。

代码:

from sklearn import datasets
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

iris = datasets.load_iris()
X = iris.data
y = iris.target
features = iris.feature_names
print(features)
iris_data = pd.DataFrame(X, columns = features)
iris_data['target'] = y
print(iris_data.head())

# 选取需要的数据和特征
iris_data = iris_data[iris_data['target'] != 2]
y = iris_data['target'].values
X = iris_data[[features[0], features[2]]].values
print("the shape of y:", y.shape)
print("the shape of X:", X.shape)

from sklearn.model_selection import train_test_split
## 创建训练集和测试集
X_train1,X_test,y_train1,y_test = train_test_split(X, y, test_size=0.2, random_state=1)
## 创建训练集和验证集
X_train,X_val,y_train,y_val = train_test_split(X_train1, y_train1, test_size=0.3, random_state=1)
print("The shape of training X:",X_train.shape)
print("The shape of training y:",y_train.shape)
print("The shape of test X:",X_test.shape)
print("The shape of test y:",y_test.shape)
print("The shape of validation X:",X_val.shape)
print("The shape of validation y:",y_val.shape)

#  设置第一层分类器
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier

clfs = [SVC(probability=True), RandomForestClassifier(n_estimators=5, n_jobs=-1, criterion='gini'),
        KNeighborsClassifier()]

# 设置第二层分类器
from sklearn.linear_model import LinearRegression
lr = LinearRegression()

# 得到第一层的验证集结果与测试集结果
val_features = np.zeros((X_val.shape[0],len(clfs)))  # 初始化验证集结果
test_features = np.zeros((X_test.shape[0],len(clfs)))  # 初始化测试集结果
for i,clf in enumerate(clfs):
    clf.fit(X_train,y_train)
    val_feature = clf.predict_proba(X_val)[:, 1]
    test_feature = clf.predict_proba(X_test)[:,1]
    val_features[:,i] = val_feature
    test_features[:,i] = test_feature

# 将第一层的验证集的结果输入第二层训练第二层分类器
lr.fit(val_features,y_val)
print("the shape of test_features:", test_features.shape)
print("the shape of X_test:", X_test.shape)
print("the shape of y_test", y_test.shape)
# 输出预测的结果
from sklearn.model_selection import cross_val_score
print("测试集结果:", cross_val_score(lr,test_features,y_test,cv=5))

# 画出训练的分类器的分隔线
x_min = X[:, 0].min() - 1
x_max = X[:, 0].max() + 1
y_min = X[:, 1].min() - 1
y_max = X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),np.arange(y_min, y_max, 0.1))
f, axarr = plt.subplots(nrows=1, ncols=1,sharex='col',sharey='row',figsize=(6, 6))
feature_grid = np.c_[xx.ravel(), yy.ravel()]
features = np.zeros((feature_grid.shape[0], len(clfs)))
for i,clf in enumerate(clfs):
    feature = clf.predict_proba(feature_grid)[:, 1]
    print('The shape of feature:', feature.shape)
    features[:,i] = feature
Z = lr.predict(features)
Z = Z.reshape(xx.shape)
axarr.contourf(xx, yy, Z, alpha = 0.3)
axarr.scatter(X[y == 0, 0], X[y == 0, 1], c='blue', marker='^')
axarr.scatter(X[y == 1, 0], X[y == 1, 1], c='red', marker='o')
plt.show()

运行结果:

决策边界图像:

2. Stacking算法

基于前面对Blending算法的讨论,我们知道:Blending在集成的过程中只会用到验证集的数据,对数据实际上是一个很大的浪费。为了解决这个问题,我们详细分析下Blending到底哪里出现问题并如何改进。在Blending中,我们产生验证集的方式是使用分割的方式,产生一组训练集和一组验证集,这让我们联想到交叉验证的方式。顺着这个思路,我们对Stacking进行建模(如下图):

  • 首先将所有数据集生成测试集和训练集(假如训练集为10000,测试集为2500行),那么上层会进行5折交叉检验,使用训练集中的8000条作为训练集,剩余2000行作为验证集(橙色)。
  • 每次验证相当于使用了蓝色的8000条数据训练出一个模型,使用模型对验证集进行验证得到2000条数据,并对测试集进行预测,得到2500条数据,这样经过5次交叉检验,可以得到中间的橙色的5* 2000条验证集的结果(相当于每条数据的预测结果),5* 2500条测试集的预测结果。
  • 接下来会将验证集的5* 2000条预测结果拼接成10000行长的矩阵,标记为𝐴1,而对于5* 2500行的测试集的预测结果进行加权平均,得到一个2500一列的矩阵,标记为𝐵1。
  • 上面得到一个基模型在数据集上的预测结果𝐴1、𝐵1,这样当我们对3个基模型进行集成的话,相于得到了𝐴1、𝐴2、𝐴3、𝐵1、𝐵2、𝐵3六个矩阵。
  • 之后我们会将𝐴1、𝐴2、𝐴3并列在一起成10000行3列的矩阵作为training data,𝐵1、𝐵2、𝐵3合并在一起成2500行3列的矩阵作为testing data,让下层学习器基于这样的数据进行再训练。
  • 再训练是基于每个基础模型的预测结果作为特征(三个特征),次学习器会学习训练如果往这样的基学习的预测结果上赋予权重w,来使得最后的预测最为准确。


Blending与Stacking对比:

??优点:

  • 比stacking简单(因为不用进行k次的交叉验证来获得stacker feature)

? 缺点:

  • 使用了很少的数据(是划分hold-out作为测试集,并非cv)
  • blender可能会过拟合(其实大概率是第一点导致的)
  • stacking使用多次的CV会比较稳健
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:38:10  更:2021-07-29 11:38:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/8 8:40:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码