原标题 | Stacked generalization with mlxtend: Predicting the NBA MVP
者 | Steven Liu
译者 | 汪鹏(重庆邮电大学)
注:本文的相关链接请访问文末【阅读原文】

堆栈泛化: 基础知识

堆栈是一种集成学习技术,通过结合几个更简单模型的优势,构建更具预测性的模型。中心思想是训练几个不同的基础模型,然后将这些预测作为最终元学习者的输入。换句话说,取每个1级模型学习的内容,然后创建一个比任何一个模型更具预测性的新广义学习者(2级模型)。

堆栈泛化的例子
当我们创建这些堆叠的集合时,选择各种各样的1级模型非常重要,因为我们希望每个模型都添加尚未学习的信息。每个模型都应该为最终的元学习者贡献一些价值。因此,避免模型只是彼此的变化,否则我们只会添加冗余。
堆叠模型通常用于Kaggle比赛,并且非常适合团队,每个团队成员可以将他们的模型堆叠在一起。
只要记住要考虑准确性和可解释性/努力之间的权衡是否值得。一些堆叠的模型可能变得非常大。例如,Netflix第一次电影评级预测竞赛的成功解决方案涉及107个算法和200多个小时的工作!这是一个如此复杂的模型,Netflix最终决定额外的准确性增益不值得将模型投入生产所需的工程努力。

mlxtend

有很多方法可以创建堆叠模型,但在我看来,最简单的方法是从mlxtend开始,这是一个允许我们快速组装堆叠回归器的库。
在这个例子中(以及NBA季后赛的精神!),我们将尝试预测2018-2019赛季的MVP。数据集可以从Kaggle下载,它包含两个文件:
  • mvp_votings代表我们的训练集,并且具有从1980-81赛季开始的历史数据。这是媒体开始对联盟MVP投票的时候。目标是award_share,即球员获得MVP头衔的投票份额。
  • test_data来自当前赛季胜利贡献值前40名的球员,这个指标可以估算个人球员对球队的贡献。
开始入门
训练集共有637条数据。在读入并清理了一些数据之后,这就是数据帧的样子:
历史赛季的NBA统计数据
下一步是数据预处理:
# create feature and target variable X = df1.drop(columns='award_share') y = df1['award_share']# standardize features from sklearn.preprocessing import StandardScaler X = StandardScaler().fit_transform(X)
数据标准化非常重要,因为存在具有显着不同大小的值,并且我们不希望任何一个特征支配目标函数。使用StandardScaler功能,我们可以:
  • 通过减去每个要素中的平均值来使数据适中。
  • 按标准偏差缩放每个要素。
单一随机森林回归
为了比较单个模型与堆叠回归量的性能,我们训练了随机森林回归模型。
# train with a single model from sklearn.ensemble import RandomForestRegressorrandom_forest = RandomForestRegressor(n_estimators=500, max_depth=3) random_forest.fit(X, y) random_forest.score(X, y)
随机森林模型产生0.65的准确度分数。让我们看看堆叠回归器的表现如何。
堆栈回归
# train with stacked modelfrom sklearn.linear_model import LinearRegressionfrom sklearn.neighbors import KNeighborsRegressorfrom sklearn.svm import LinearSVRfrom sklearn.neural_network import MLPRegressorfrom mlxtend.regressor import StackingRegressor# initialize first layer of models and final learnerregr = StackingRegressor(regressors=[KNeighborsRegressor(), LinearRegression(), LinearSVR(), MLPRegressor()], meta_regressor=RandomForestRegressor(n_estimators=500, max_depth=3))# fit on dataregr.fit(X, y)# get accuracy scoreregr.score(X, y)
创建堆栈回归器非常简单:
  1. 从mlextend初始化StackingRegressor。
  2. 使用多个基本模型填充StackingRegressor。
  3. 指定用于元回归量(或最终学习者)的模型。
就是这样!从这里开始,您可以像平常一样使用scikit-learn模型进行拟合和预测。堆叠回归器的精度得分为0.84,与单一型号相比,精度提高了22%!
您可能还注意到我们没有在堆叠回归量中指定任何超参数,但是mlextend允许我们调整基本和元模型中的超参数。
要获取所有可调参数的列表,请调用estimator.get_params().keys()以查找支持的内容。
# tune hyperparametersfrom sklearn.model_selection import RandomizedSearchCVknn = KNeighborsRegressor()rf = RandomForestRegressor()mlp = MLPRegressor()params = {'kneighborsregressor__n_neighbors':[5, 7, 9], 'mlpregressor__solver':['sgd', 'adam'], 'meta-randomforestregressor__n_estimators':[200, 500, 1000]}grid = RandomizedSearchCV(estimator=regr, param_distributions=params, cv=5, refit=True)grid.fit(X, y)
然后我们可以调用grid.best_params_来返回最佳的超参数集以进行训练。
谁会是2018-2019赛季的MVP?
现在已经调整了叠加回归量,让我们预测谁将赢得MVP,并将其与NBA自己的预测进行比较。

字母哥是全场最受欢迎的球员,他赢得了MVP,而且击败了哈登!

哈登(左)字母哥(右)
来自我们堆叠回归的一些值得注意的内容,包括Rudy Gobert,Steven Adams,Andre Drummond和Nikola Vucevic,他们都不是真正的MVP级别球员。我们可以看到,在Giannis和Harden之后,预测的award_share在第10名玩家中迅速衰减至0.18。
为了了解我们的堆叠模型的精确程度,您必须在2019年NBA奖项揭晓后后的6月24日回来查看谁真正赢得了MVP冠军。决赛选手被命名为:Giannis,Harden和Paul George(我们的模型中排名第五)。但事实上,毫无疑问,MVP将会给Giannis或Harden,他们每个人都有一个令人难以置信的赛季。
就我个人而言,我将支持Giannis(字母哥)在进攻和防守方面成为如此具有统治力的最高荣誉,同时在如此年轻的时候带领雄鹿队成为联盟的佼佼者。
感谢阅读,并随时发表评论或留下你可能有的任何反馈——包括你认为这届NBA的MVP应该是谁。
本文编辑:王立鱼
英语原文:https://heartbeat.fritz.ai/stacked-generalization-with-mlxtend-predicting-the-nba-mvp-fc5171daac60
想要继续查看该篇文章相关链接和参考文献?

点击底部【阅读原文】即可访问:
https://ai.yanxishe.com/page/TextTranslation/1779
你可能还想看
点击
阅读原文,查看本文更多内容
继续阅读
阅读原文