03_集成学习(Ensemble Learning)里的堆叠(Stacking)

集成学习(Ensemble Learning)里的堆叠

堆叠是我们将要学习的第二种集成学习技术。与投票一起,它属于非生成方法类,因为它们都使用经过单独训练的分类器作为基础学习器。元学习是广义的机器学习术语。它具有多种含义,但通常需要将元数据用于特定问题才能解决。它的应用范围从更有效地解决问题到设计全新的学习算法,这是一个正在发展的研究领域。堆叠是元学习的一种形式。主要思想是,我们使用基础学习器来生成问题数据集的元数据,然后使用另一个称为元学习器的学习器来处理元数据。基础学习器被认为是0级学习器,而元学习器被认为是1级学习器。换句话说,元学习器堆叠在基础学习器之上,因此名称堆叠。在堆叠过程中,我们没有明确定义组合规则,而是训练了一个模型,该模型学习如何最佳地组合基础学习器的预测。元学习器的输入数据集由基础学习器的预测(元数据)组成,如图所示:

在这里插入图片描述

如前所述,我们需要元数据来训练和操作我们的集。在操作阶段,我们仅传递来自基础学习器的数据。另一方面,训练阶段要复杂一些。我们希望元学习器发现基础学习器之间的优缺点。尽管有些人认为我们可以在训练集上训练基础学习器,对其进行预测,然后使用这些预测来训练我们的元学习器,但这会引起差异。我们的元学习器将发现(基础学习器)已经看到的数据的优缺点。由于我们要生成具有不错的预测(训练样本外)性能的模型,而不是描述性(训练样本内)性能,因此必须采用另一种方法。另一种方法是将我们的训练集分为基础学习器训练集和元学习器训练(验证)集。这样,我们仍将保留一个真实的测试集,在这里我们可以测量集成的性能。这种方法的缺点是我们必须将一些实例给验证集。此外,验证集合大小和训练集集合大小都将小于原始训练集合大小。因此,首选方法是利用K折交叉验证。对于每个K,基础学习器将在K-1折中进行训练,并在第K折中进行预测,从而生成最终训练元数据的100 / K百分比。通过重复此过程K次(每次折叠一次),我们将为整个训练数据集生成元数据。下图描述了该过程。最终结果是整个数据集的一组元数据,其中元数据是根据样本外数据生成的(从基础学习器的角度来看,是针对每个折叠):在这里插入图片描述
堆叠取决于基础学习器的多样性。如果基础学习器在问题的整个领域表现出相同的特征和表现,那么元学习器将很难显着提高他们的集体表现。此外,将需要一个复杂的元学习器。如果基础学习器本身是多样化的,并且在问题的不同领域表现出不同的绩效特征,那么即使是简单的元学习器也将能够极大地提高他们的集体表现。混合使用不同的学习算法通常是一个好主意,以便捕获特征本身以及目标变量之间的线性和非线性关系。

通常,元学习器应该是一种相对简单的机器学习算法,以避免过度拟合。此外,应采取其他步骤以正规化元学习器。例如,如果使用决策树,则应限制树的最大深度。如果使用回归模型,则应首选正则化回归(例如弹性网或岭回归)。如果需要更复杂的模型以提高整体的预测性能,则可以使用多级堆栈,其中,随着堆栈级别的增加,模型的数量和每个模型的复杂性都会降低

在这里插入图片描述
元学习器的另一个真正重要的特征应该是能够处理相关的输入,尤其是像朴素的贝叶斯分类器那样,不对特征彼此之间的独立性做出任何假设。如果元学习器(元数据)的输入将高度相关, 发生这种情况是因为所有基础学习器都受过训练以预测相同的目标。因此,他们的预测将来自相同函数的近似值。尽管预测值会有所不同,但它们会彼此接近。

尽管scikit-learn确实可以实现大多数集成方法,但堆栈并不是其中一种。下面我们会提供回归和分类问题中怎么用Python实现堆叠技术。

堆叠

  • 回归问题
  • 分类问题
  • 写stacking的模块

回归问题

加载模块

from sklearn.datasets import load_diabetes
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.model_selection import KFold
from sklearn import metrics
import numpy as np

生成训练测试集

diabetes = load_diabetes()

train_x, train_y = diabetes.data[:400], diabetes.target[:400]
test_x, test_y = diabetes.data[400:], diabetes.target[400:]

创建基础学习器(base-learner)和元学习器(meta-learner)

## 基础学习器

base_learners = []
knn = KNeighborsRegressor(n_neighbors=5)

base_learners.append(knn)
dtr = DecisionTreeRegressor(max_depth=4 , random_state=123456)

base_learners.append(dtr)
ridge = Ridge()

base_learners.append(ridge)

## 元学习器
meta_learner = LinearRegression()

初始化学习者之后,我们需要为训练集创建元数据。通过首先用KFold(n_splits = 5)指定分割数(K),然后调用KF.split(train_x),将训练集分成五个。反过来,这将返回生成训练集的五个分段的训练和测试索引。对于这些每个拆分,我们使用train_indices(四个folds)指示的数据来训练我们的基础学习器,并在与test_indices相对应的数据上创建元数据。此外,我们将每个分类器的元数据存储在meta_data数组中,并将相应的目标存储在meta_targets数组中。最后,我们转置meta_data以获得(实例,特征)形状。

在训练集创建元数据集(meta-data)

# Create variables to store metadata and their targets

meta_data = np.zeros((len(base_learners), len(train_x)))
meta_targets = np.zeros(len(train_x))
meta_data.shape
(3, 400)
# Create the cross-validation folds
KF = KFold(n_splits=5)
meta_index = 0
for train_indices, test_indices in KF.split(train_x):
    for i in range(len(base_learners)):
        learner = base_learners[i]
        learner.fit(train_x[train_indices], train_y[train_indices])
        predictions = learner.predict(train_x[test_indices])
        meta_data[i][meta_index:meta_index+len(test_indices)] = predictions

    meta_targets[meta_index:meta_index+len(test_indices)] = train_y[
  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于堆叠集成学习Python代码示例: ```python # 导入所需库 from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.neural_network import MLPClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble import VotingClassifier from sklearn.ensemble import StackingClassifier from sklearn.metrics import accuracy_score # 生成一个分类数据集 X, y = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=1) # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1) # 定义基础模型 decision_tree = DecisionTreeClassifier(random_state=1) knn = KNeighborsClassifier() mlp = MLPClassifier(random_state=1) # 定义估计器 estimators = [('dt', decision_tree), ('knn', knn), ('mlp', mlp)] # 定义估计器的估计器 rf = RandomForestClassifier(random_state=1) voting = VotingClassifier(estimators, voting='hard') stacking = StackingClassifier(estimators=estimators, final_estimator=rf) # 训练估计器 voting.fit(X_train, y_train) stacking.fit(X_train, y_train) # 预测测试集 voting_pred = voting.predict(X_test) stacking_pred = stacking.predict(X_test) # 计算准确率 voting_accuracy = accuracy_score(y_test, voting_pred) stacking_accuracy = accuracy_score(y_test, stacking_pred) print("Voting Classifier Accuracy:", voting_accuracy) print("Stacking Classifier Accuracy:", stacking_accuracy) ``` 这个示例中,我们首先生成了一个包含1000个样本和10个特征的分类数据集。然后我们将数据集分为训练集和测试集。接下来,我们定义了三个基础模型:决策树、KNN和多层感知器。然后,我们将它们作为估计器传递给投票集成方法和堆叠式集成方法。在这,我们使用随机森林作为最终估计器。我们训练了这两种集成方法,并使用测试集对它们进行了预测。最后,我们计算了两种方法的准确率并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值