中使用swiper不能自动切换_在Python中使用自动堆栈泛化(stacked generalizations)

介绍

在将机器学习算法推向新的高度时,利用堆栈(堆栈泛化)是一个非常热门的话题。最初由David Wolpert 在1992年论文《Stacked Generalization》中介绍,他们的主要目的是减少泛化错误。根据Wolpert的说法,他们可以被理解为“更复杂的交叉验证版本” 。而Wolpert当时指出,大部分堆栈泛化都是“black art”,但似乎构建越来越大的堆栈泛化要优于较小的堆栈泛化。然而,随着这些模型的尺寸不断增加,它们的复杂性也会增加。自动化构建不同体系结构的过程将大大简化此过程。

4026bcc223fb5e8cc4f38901a1f0d869.gif

堆栈泛化是什么样的?

堆栈泛化结构的概念是使用一个或多个初级模型,使用这些模型进行预测,然后将这些预测用作特征以在顶部拟合一个或多个二级模型。为了避免过度拟合,交叉验证通常用于预测训练集的out-of-fold部分。这个包中有两种不同的变体,但我将在本段中描述“变体A”。为了得到这个变体的最终预测,我们采用所有预测的均值或模式。整个过程可以使用vecstacks文档中的这个GIF进行可视化:

35f99775da2965c7e879ca389fd0b292.gif

使用案例:构建用于分类的堆栈通用化

看完文档之后,是时候尝试自己使用这个包了,看看它是如何工作的。我决定使用UCI机器学习库中提供的葡萄酒数据集。该数据集的问题陈述是使用13个特征,这些特征都代表葡萄酒的不同方面,以预测葡萄酒是从意大利的哪三个品种中衍生出来的。

首先,让我们首先导入我们项目所需的软件包:

import pandas as pdfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_scorefrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.ensemble import RandomForestClassifierfrom xgboost import XGBClassifierfrom vecstack import stacking
3e703779dc55f58dbc79d9ed7309705e.png

现在我们已准备好导入我们的数据并查看和理解:

link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'names = ['Class', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash' ,'Magnesium', 'Total phenols', 'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue', 'OD280/OD315 of diluted wines', 'Proline']df = pd.read_csv(link, header=None, names=names)df.sample(5)
0bc9d078a97bf9565cc563f0144cc9ea.png

运行上面的代码块后,如图:

36db73b04ac6530c3a1422daa0b59f8e.png

请注意,我使用.sample()代替.head()以避免由于假设整个数据集具有前5行结构而产生潜在的错误。不过,这个数据集没有任何缺失值,所以我们可以很容易地使用它来立即测试我们的包,而无需任何通常需要的数据清理和准备。

接下来,我们将把响应与输入变量分开,并按照vecstacks文档中的示例执行80:20的train-test-split。

y = df[['Class']]X = df.iloc[:,1:]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
2542b039cf4f32a51e2779d870a0c538.png

现在是时候为我们的堆栈泛化定义一些初级模型。为了简单起见,我们将使用三种模型:KNN分类器,随机森林分类器和XGBoost分类器。

models = [ KNeighborsClassifier(n_neighbors=5, n_jobs=-1),  RandomForestClassifier(random_state=0, n_jobs=-1,  n_estimators=100, max_depth=3),  XGBClassifier(random_state=0, n_jobs=-1, learning_rate=0.1,  n_estimators=100, max_depth=3)]
1e554aa4e2980b4954a74422765a088a.png

这些参数在设置之前未进行调整,因为本文的目的是测试包。如果要优化性能,则不应只复制和粘贴这些。

从文档中获取下一部分代码,我们基本上使用初级模型执行GIF的第一部分来进行预测:

S_train, S_test = stacking(models,  X_train, y_train, X_test,  regression=False,   mode='oof_pred_bag',   needs_proba=False,  save_dir=None,   metric=accuracy_score,   n_folds=4,   stratified=True,  shuffle=True,   random_state=0,   verbose=2)
697a3d400ab3d05f232a14de984f7bbc.png

堆栈函数需要几个输入:

  • models:我们之前定义的初级模型
  • X_train,y_train,X_test:我们的数据
  • regression:Boolean提示否要将该函数用于回归。在我们的例子中设置为False,因为这是一个分类
  • mode:在交叉验证期间使用前面描述的折叠方式
  • needs_proba:Boolean提示是否需要类标签的概率
  • save_dir:将结果保存到Boolean目录
  • metric:要使用的评估指标(我们在开头导入了accuracy_score)
  • n_folds:用于交叉验证的折叠数
  • stratified:是否使用分层交叉验证
  • shuffle:是否要改组数据
  • random_state:为可重现性设置一个随机状态
  • verbose:指的是打印所有信息

这样做,我们得到以下输出:

task: [classification]n_classes: [3]metric: [accuracy_score]mode: [oof_pred_bag]n_models: [4]model 0: [KNeighborsClassifier] fold 0: [0.72972973] fold 1: [0.61111111] fold 2: [0.62857143] fold 3: [0.76470588] ---- MEAN: [0.68352954] + [0.06517070] FULL: [0.68309859]model 1: [ExtraTreesClassifier] fold 0: [0.97297297] fold 1: [1.00000000] fold 2: [0.94285714] fold 3: [1.00000000] ---- MEAN: [0.97895753] + [0.02358296] FULL: [0.97887324]model 2: [RandomForestClassifier] fold 0: [1.00000000] fold 1: [1.00000000] fold 2: [0.94285714] fold 3: [1.00000000] ---- MEAN: [0.98571429] + [0.02474358] FULL: [0.98591549]model 3: [XGBClassifier] fold 0: [1.00000000] fold 1: [0.97222222] fold 2: [0.91428571] fold 3: [0.97058824] ---- MEAN: [0.96427404] + [0.03113768] FULL: [0.96478873]
35f0b08867697f01365d2b3b052d5eaf.png

再次提到GIF,现在剩下要做的就是将我们选择的第二级模型拟合到我们的预测中,以进行最终预测。在我们的例子中,我们将使用XGBoost分类器。这一步与sklearn中的常规fit-and- forecast没有显着差异,只是我们没有使用X_train来训练我们的模型,而是使用预测S_train。

model = XGBClassifier(random_state=0, n_jobs=-1, learning_rate=0.1,  n_estimators=100, max_depth=3) model = model.fit(S_train, y_train)y_pred = model.predict(S_test)print('Final prediction score: [%.8f]' % accuracy_score(y_test, y_pred))Output: Final prediction score: [0.97222222]
8bafd1dc647122936444fb45c665fc60.png

结论

使用vecstacks的自动堆栈,我们成功预测出正确的葡萄酒品种,准确度约为97.2%。该API不会与sklearn API发生冲突,因此可以在尝试加快您的堆栈工作的时候为您提供一个有用的工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值