机器学习是人工智能的一个分支畛域,致力于构建主动学习和自适应的零碎,它利用统计模型来可视化、剖析和预测数据。一个通用的机器学习模型包含一个数据集 (用于训练模型) 和一个算法(从数据学习)。然而有些模型的准确性通常很低产生的后果也不太精确,克服这个问题的最简略的解决方案之一是在机器学习模型上应用集成学习。
集成学习是一种元办法,通过组合多个机器学习模型来产生一个优化的模型,从而进步模型的性能。集成学习能够很容易地缩小过拟合,防止模型在训练时体现更好,而在测试时不能产生良好的后果。
总结起来,集成学习有以下的长处:
- 减少模型的性能
- 缩小过拟合
- 升高方差
- 与单个模型相比,提供更高的预测精度。
- 能够解决线性和非线性数据。
- 集成技术能够用来解决回归和分类问题
上面咱们将介绍各种集成学习的办法:
Voting
Voting 是一种集成学习,它将来自多个机器学习模型的预测联合起来产生后果。在整个数据集上训练多个根底模型来进行预测。每个模型预测被认为是一个“投票”。失去少数选票的预测将被选为最终预测。
有两种类型的投票用于汇总根底预测 - 硬投票和软投票。
硬投票抉择投票数最高的预测作为最终预测,而软投票将每个模型中每个类的概率联合起来,抉择概率最高的类作为最终预测。
在回归问题中,它的工作形式有些不同,因为咱们不是寻找频率最高的类,而是采纳每个模型的预测并计算它们的平均值,从而得出最终的预测。
from sklearn.ensemble import VotingClassifier
## Base Models
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
ensemble_voting = VotingClassifier(estimators = [('dtc',DecisionTreeClassifier(random_state=42)),
('lr', LogisticRegression()),
('gnb', GaussianNB()),
('knn',KNeighborsClassifier()),
('svc',SVC())],
voting='hard')
ensemble_voting.fit(X_train,y_train)
Bagging
Bagging 是采纳几个弱机器学习模型,并将它们的预测聚合在一起,以产生最佳的预测。它基于 bootstrap aggregation,bootstrap 是一种应用替换办法从汇合中抽取随机样本的抽样技术。aggregation 则是利用将几个预测联合起来产生最终预测的过程。
随机森林是利用 Bagging 的最驰名和最罕用的模型之一。它由大量的决策树组成,这些决策树作为一个整体运行。它应用 Bagging 和特色随机性的概念来创立每棵独立的树。每棵决策树都是从数据中随机抽取样本进行训练。在随机森林中,咱们最终失去的树不仅承受不同数据集的训练,而且应用不同的特色来预测后果。
Bagging 通常有两种类型——决策树的汇合 (称为随机森林) 和决策树以外的模型的汇合。两者的工作原理类似,都应用聚合办法生成最终预测,惟一的区别是它们所基于的模型。在 sklearn 中,咱们有一个 BaggingClassifier 类,用于创立除决策树以外的模型。
## Bagging Ensemble of Same Classifiers (Decision Trees)
from sklearn.ensemble import RandomForestClassifier
classifier= RandomForestClassifier(n_estimators= 10, criterion="entropy")
classifier.fit(x_train, y_train)
## Bagging Ensemble of Different Classifiers
from sklearn.ensemble import BaggingClassifier
from sklearn.svm import SVC
clf = BaggingClassifier(base_estimator=SVC(),
n_estimators=10, random_state=0)
clf.fit(X_train,y_train)
Boosting
加强集成办法通过器重先前模型的谬误,将弱学习者转化为强学习者。Boosting 以程序的形式实现同构 ML 算法,每个模型都试图通过缩小前一个模型的误差来进步整个过程的稳定性。
在训练 n + 1 模型时,数据集中的每个数据点都被赋予了相等的权重,这样被模型 n 谬误分类的样本就能被赋予更多的权重(重要性)。误差从 n 个学习者传递给 n + 1 个学习者,每个学习者都试图缩小误差。
ADA Boost 是应用 Boost 生成预测的最根本模型之一。ADA boost 创立一个决策树桩森林(一个树桩是一个只有一个节点和两个叶子的决策树),不像随机森林创立整个决策树森林。它给分类谬误的样本调配更高的权重,并持续训练模型,直到失去较低的错误率。
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
dt = DecisionTreeClassifier(max_depth=2, random_state=0)
adc = AdaBoostClassifier(base_estimator=dt, n_estimators=7, learning_rate=0.1, random_state=0)
adc.fit(x_train, y_train)
Stacking
Stacking 也被称为叠加泛化,是 David H. Wolpert 在 1992 年提出的集成技术的一种模式,目标是通过应用不同的泛化器来缩小谬误。
叠加模型利用来自多个根底模型的预测来构建元模型,用于生成最终的预测。重叠模型由多层组成,其中每一层由几个机器学习模型组成,这些模型的预测用于训练下一层模型。
在叠加过程中,将数据分为训练集和测试集两局部。训练集会被进一步划分为 k -fold。根底模型在 k - 1 局部进行训练,在 kᵗʰ局部进行预测。这个过程被重复迭代,直到每一折都被预测进去。而后将根本模型拟合到整个数据集,并计算性能。这个过程也实用于其余根本模型。
来自训练集的预测被用作构建第二层或元模型的特色。这个第二级模型用于预测测试集。
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import StackingClassifier
base_learners = [('l1', KNeighborsClassifier()),
('l2', DecisionTreeClassifier()),
('l3',SVC(gamma=2, C=1)))
]
model = StackingClassifier(estimators=base_learners, final_estimator=LogisticRegression(),cv=5)
model.fit(X_train, y_train)
Blending
Blending 是从 Stacking 派生进去另一种模式的集成学习技术,两者之间的惟一区别是它应用来自一个训练集的保留 (验证) 集来进行预测。简略地说,预测只针对保留得数据集。保留得数据集和预测用于构建第二级模型。
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
## Base Models
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
## Meta Learner
from sklearn.linear_model import LogisticRegression
## Creating Sample Data
X,y = make_classification(n_samples=10000, n_features=20, n_informative=15, n_redundant=5, random_state=42)
## Training a Individual Logistic Regression Model
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
logrec = LogisticRegression()
logrec.fit(X_train,y_train)
pred = logrec.predict(X_test)
score = accuracy_score(y_test, pred)
print('Base Model Accuracy: %.3f' % (score*100))
## Defining Base Models
def base_models():
models = list()
models.append(('knn', KNeighborsClassifier()))
models.append(('dt', DecisionTreeClassifier()))
models.append(('svm', SVC(probability=True)))
return models
## Fitting Ensemble Blending Model
## Step 1:Splitting Data Into Train, Holdout(Validation) and Test Sets
X_train_full, X_test, y_train_full, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
X_train, X_val, y_train, y_val = train_test_split(X_train_full, y_train_full, test_size=0.33, random_state=1)
## Step 2: train base models on train set and make predictions on validation set
models = base_models()
meta_X = list()
for name, model in models:
# training base models on train set
model.fit(X_train, y_train)
# predict on hold out set
yhat = model.predict_proba(X_val)
# storing predictions
meta_X.append(yhat)
# horizontal stacking predictions
meta_X = np.hstack(meta_X)
## Step 3: Creating Blending Meta Learner
blender = LogisticRegression()
## training on base model predictions
blender.fit(meta_X, y_val)
## Step 4: Making predictions using blending meta learner
meta_X = list()
for name, model in models:
yhat = model.predict_proba(X_test)
meta_X.append(yhat)
meta_X = np.hstack(meta_X)
y_pred = blender.predict(meta_X)
# Evaluate predictions
score = accuracy_score(y_test, y_pred)
print('Blending Accuracy: %.3f' % (score*100))
---------------------------------
Base Model Accuracy: 82.367
Blending Accuracy: 96.733
总结
在浏览完本文之后,您可能想晓得是否有抉择一个更好的模型最好得办法或者如果需要的话,应用哪种集成技术呢?
在这个问题时,咱们总是倡议从一个简略的个体模型开始,而后应用不同的建模技术 (如集成学习) 对其进行测试。在某些状况下,单个模型可能比集成模型体现得更好,甚至好很多好。
须要阐明并且须要留神的一点是:集成学习绝不应该是第一抉择,而应该是最初一个抉择。起因很简略: 训练一个集成模型将破费很多工夫,并且须要大量的解决能力。
回到咱们的问题,集成模型旨在通过组合同一类别的几个根本模型来进步模型的可预测性。每种集成技术都是最好的,有助于进步模型性能。
如果你正在寻找一种简略且易于实现的集成办法,那么应该应用 Voting。如果你的数据有很高的方差,那么你应该尝试 Bagging。如果训练的根底模型在模型预测中有很高的偏差,那么能够尝试不同的 Boosting 技术来进步准确性。如果有多个根底模型在数据上体现都很好好,并且不晓得抉择哪一个作为最终模型,那么能够应用 Stacking 或 Blending 的办法。当然具体那种办法体现得最好还是要取决于数据和特色散布。
最初集成学习技术是进步模型精度和性能的弱小工具,它们很容易缩小数据过拟合和欠拟合的机会,尤其在加入较量时这是提分的要害。
https://avoid.overfit.cn/post/f815d35fd51d44de8a17a3a5e609dfa6
作者:Abhay Parashar