Python中的提升算法
本文旨在刷新读者对提升算法的认识,了解它们与现有的性能提升算法有什么不同,并讨论了现有的提升模型。
提升算法已经迅速崛起,成为机器学习中提高模型性能的最多选择的技术之一。在Kaggle的世界里,提升算法的使用呈指数级增长。在任何比赛中,人们很难在前20名中选出一个没有使用过提升算法的模型。
前提条件
读者应该对机器学习和[机器学习模型]有一个初级到中级的理解,重点是[决策树]。
绪论
有史以来第一个提升算法被称为AdaBoost(自适应提升),是由Freund和Schapire介绍给世界的。统计学家们纷纷站出来,提出证明和定理,说明这种集合方法是如何很好地改善预测结果的。
集合方法是指使用多个模型并将其合并为一个模型以提高结果的技术。术语 "模型 "可以指任何模型--回归、支持向量机和kNN,而其性能需要改进的模型被称为基础模型。尽管 "提升 "技术使用决策树来提高模型的准确性,但它可以应用于任何基础模型。
然而,据观察,提升一个基于决策树的模型比提升其他模型提供更好的结果。一个可能的解释是基础模型(决策树)和提升算法在结构上的相似性。
为了让读者更容易理解和保留信息,文章被分成两部分。这一部分主要是让读者对提升算法有所了解,并深入解释两种提升算法--自适应提升(AdaBoost)和极限梯度提升(XGBoost)。
文章的第二部分将重点解释两种更流行的提升技术--轻型梯度提升法(LightGBM)和类别提升法(CatBoost)。
要运行这些代码,用户需要具备以下库。NumPy、Pandas、Sklearn和XGBoost。
读者可以使用命令提示符中的以下命令在他们的Windows操作的机器上安装上述库。
pip install numpy
pip install pandas
pip install scikit-learn
pip install xgboost
让我们在Python中导入这些库。
import numpy as np
import pandas as pd
import sklearn
import xgboost
采样与提升
如前所述,boosting和bagging被混淆了。这是两个不同的术语,尽管两者都是集合方法。
Bagging和boosting都是通过在训练时产生额外的数据来使用任意数量的学习者N 。这些N 学习者通过从原始集合中抽取随机集合来创建M 新的训练集合。
bagging背后的想法是结合从抽样集产生的M 模型的结果。这些模型相互独立,并行运行,将模型的结果结合起来,就可以得到最终的结果。
而在提升中,M ,模型是按顺序训练的,模型继承前一个模型的性能,试图纠正其前一个模型的错误。
这些模型的性能是通过对各个模型的性能进行加权平均来分析的,其权重是根据它们的性能分配的。
数据预处理
文章使用UCI机器学习蘑菇数据集来实现AdaBoost和XGBoost算法。对于数据集中的一组特征,任务是识别蘑菇的类型是有毒的还是可食用的。我们鼓励读者下载该数据集,并跟随文章中的代码块来更好地理解。
首先,让我们导入所需的库。
import numpy as np
import pandas as pd
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
现在,让我们使用Pandas中的read_csv() 方法导入数据集,并分析每个特征中独特类别的数量。如果一个特征只有一个唯一的值,我们可以放弃它,因为它在建立模型时没有任何意义。
df = pd.read_csv("mushrooms.csv")
for col in df.columns:
print('Unique value count of', col, 'is', len(df[col].unique()))
输出
Unique value count of class is 2
Unique value count of cap-shape is 6
Unique value count of cap-surface is 4
Unique value count of cap-color is 10
Unique value count of bruises is 2
Unique value count of odor is 9
Unique value count of gill-attachment is 2
Unique value count of gill-spacing is 2
Unique value count of gill-size is 2
Unique value count of gill-color is 12
Unique value count of stalk-shape is 2
Unique value count of stalk-root is 5
Unique value count of stalk-surface-above-ring is 4
Unique value count of stalk-surface-below-ring is 4
Unique value count of stalk-color-above-ring is 9
Unique value count of stalk-color-below-ring is 9
Unique value count of veil-type is 1
Unique value count of veil-color is 4
Unique value count of ring-number is 3
Unique value count of ring-type is 5
Unique value count of spore-print-color is 9
Unique value count of population is 6
Unique value count of habitat is 7
正如你所看到的Unique value count of veil-type is 1 ,特征veil-type ,其中只有一个独特的值,因此,可以放弃。
df = df.drop("veil-type", axis=1)
让我们看一下数据,看看它是什么样子的。
df.head(6)
由于机器学习模型更喜欢数字数据,让我们通过编码将数据集转换为数字。LabelEncoder() 是Scikit-Learn包中的一个方法,可以将标签转换为数字。
读者需要通过这个关于标签编码的资源来了解为什么要对数据进行编码。
label_encoder = LabelEncoder()
for column in df.columns:
df[column] = label_encoder.fit_transform(df[column])
将数据集分割成目标矩阵Y 和特征矩阵X 。
X = df.loc[:, df.columns != 'class']
Y = df['class']
数据集必须被分成两部分--训练和测试数据。让我们去分割数据,70%的数据用于训练,30%的数据用于测试,并对数值进行标准化。
为了理解为什么数字数据必须被标准化,建议读者通过这篇文章。
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.3, random_state = 100)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
AdaBoost
AdaBoost是自适应提升(Adaptive Boosting)的简称,是最早的提升方法之一,在提高模型的性能方面看到了成功。AdaBoost专注于提高基础学习者失败领域的性能。基准学习器是模型的第一次迭代。
作为一个弱学习者,它结合了来自短树(单级树)的预测,称为决策树桩。AdaBoost被描述为一个 "阶段性的、加法的建模",其中 "加法 "并不意味着由协变量增加的模型拟合,而是指估计器的线性组合。
这些决策树桩算法被用来识别弱的学习者。从一棵决策树开始,被错误分类的例子通过增加它们的权重来进行惩罚(权重被提升了)。
另一棵决策树是由新的和修改过的训练数据建立的,这些数据包含加权的样本。新的弱学习者被依次添加到模型中,以学习和识别更严厉的模式。
每次迭代后的数据都是不一样的,可能的错误分类被指出来供算法识别和学习。错误分类的权重会被提高,以便下一次迭代时可以将其剔除。
这个过程在作为参数指定的迭代次数内重复进行。该算法根据弱学习者的多数票和他们各自的准确率来进行预测。
随着迭代次数的增加,AdaBoost对过度拟合有一定的抵抗力,当它在二元分类问题上工作时最为有效。AdaBoost包括一个额外的条件,即一个模型的误差必须小于50%才能保持,否则就重复迭代,直到产生一个更好的学习者。
AdaBoost回归法的工作原理是一样的,唯一的区别是预测是使用决策树的加权平均数,权重是学习者对训练数据的准确性。AdaBoost在构建模型的过程中包含了随机性,所以每次运行一段代码,都会生成一个稍微不同的模型。
随机学习算法在每次运行代码时都会产生不同的结果,因此,通过运行几次代码并取其平均值来评估这种算法的性能是很好的做法。
AdaBoost在Python中的实现
Python中的sklearn 库有一个AdaBoostClassifier 方法,用于将特征分类为有毒或可食用。
该方法有以下参数。
base_estimator:提升的集合是由这个参数建立的。如果None,其值为DecisionTreeClassifier(max_depth=1)。n_estimators:估算器中的上限,在这个上限时终止提升,默认值为50。如果有一个完美的拟合,学习将提前停止。learning_rate:学习率通过这个值减少分类器的贡献。它的默认值是1。algorithm:默认值为'SAAME'。这个参数的另一个选项,SAMME.R算法,比SAMME算法收敛得更快,同时需要更少的提升迭代,产生更低的测试误差。random_state:随机数发生器使用的种子。
让我们调用AdaBoostClassifier 的一个实例,用训练数据来拟合它。
adaboost = AdaBoostClassifier(n_estimators = 50, learning_rate = 0.2).fit(X_train, Y_train)
score = adaboost.score(X_test, Y_test)
输出
0.9848236259228876
XGBoost
自从世界通过本文介绍了XGBoost算法后,XGBoost就被认为是提升算法中的蒙娜丽莎,因为它比同行提供的优势是无可争议的。
该算法被广泛认为是最重要的提升方法之一,它已被欧洲核子研究中心(CERN)所采用,那里的统计物理学家认为它是对来自大型强子对撞机的信号进行分类的最佳方法。是什么让它成为Kagglers赢得数据科学竞赛最抢手的技术?
从数学的角度来分解提升的过程,提升是用来帮助寻找'n'维空间中映射的'n'个特征的最小值,大多数算法使用梯度下降来寻找最小值。
然而,XGBoost使用了一种叫做[牛顿-拉弗逊法(Newton-Raphson method]的技术,它提供了一条更直接的通往最小值的路线。牛顿方法使用提供曲率信息的函数的二阶导数。
与使用一阶导数的[梯度下降]法相比,这有助于[更快地实现函数的最小化]。
在XGBoost中,那些拥有用较少证据产生的权重的节点的决策树会被大量缩减。这种消除不重要节点的巧妙方法反映在算法的速度和内存消耗上。
资料来源:Datascience.la。Datascience.la
XGBoost还带有一个额外的随机化参数,可以减少树之间的相关性。分类器树之间更少的相关性转化为分类器集合的更好的性能。
XGBoost通过用正则化修正复杂的模型,解决了过拟合的问题。正则化梯度提升也是一种选择,同时考虑到L1正则化和L2正则化。
在提高处理性能时,该算法使用CPU中的多个核心。该算法通过利用CPU中的所有核心,并行生成多个决策树。
该系统被设计成块状结构,这使得数据的布局可以在随后的迭代中被重复使用,而不是重新计算。
这被用来寻找树中的分割点,其中数据点的权重相等,这使得它难以处理。该算法使用分布式加权量化草图算法来处理加权数据。
用于Python的XGBoost库是用C++编写的,可用于C++、Python、R、Julia、Java、Hadoop以及AWS和Azure等基于云的平台。
XGBoost在Python中的实现
与AdaBoost不同,XGBoost本身有一个单独的库,希望一开始就能安装。在导入库和创建XGBClassifier 的实例之前,让我们看一下调用XGBClassifier 方法所需的一些参数。
max_depth:基础学习者的最大树深。learning_rate:XGBooster的学习率。verbosity:冗长的程度。有效值在0(无声)和3(调试)之间。objective:要使用的学习目标。booster:gbtree,gblinear和dart中选择的助推器。tree_method:要使用的树形方法。最保守的选项被设置为默认。n_jobs:并行线程的数量。gamma:在树的叶子节点上进行另一次分割所需的最小损失减少。reg_alpha:XGBoost权重上的L1正则化项。reg_lambda:XGBoost 权重的 L2 正则化项。base_score:初始预测(也叫全局偏置)。random_state:随机数种子。importance_type:要关注的特征;要么是gain,weight,cover,total_gain或total_cover。
from xgboost import XGBClassifier
xgboost = XGBClassifier(n_estimators = 1000, learning_rate = 0.05).fit(X_train, Y_train, early_stopping_rounds = 5, eval_set = [(X_test, Y_test)],verbose = False)
score_xgb = xgboost.score(X_test,Y_test)
最后的结果应该是。
0.9950779327317474
通过对参数的实验,人们可以用这个数据集达到100%的准确率。
总结
这篇文章简要介绍了两种流行的集合方法--bagging和boosting,解释了它们的区别。从技术角度讨论了AdaBoost和XGBoost算法,简单讨论了方法,并进行了编码。
鼓励读者运行代码位,并鼓励读者调整参数以获得更高的精确度。
最后,希望读者不要把他们对提升算法的认识局限于这篇文章,鼓励他们通过额外的资源来扩大他们对这个主题的视野。