在本次实验中以决策树、svm和随机森林为基学习器,以决策树为元学习器。
Stacking的做法是首先构建多个不同类型的一级学习器,并使用他们来得到一级预测结果,然后基于这些一级预测结果,构建一个二级学习器,来得到最终的预测结果。Stacking的动机可以描述为:如果某个一级学习器错误地学习了特征空间的某个区域,那么二级学习器通过结合其他一级学习器的学习行为,可以适当纠正这种错误。具体步骤如下图所示:
过程1-3 是训练出来个体学习器,也就是初级学习器。
过程5-9 是 使用训练出来的个体学习器来得预测的结果,这个预测的结果当做次级学习器的训练集。
过程11 是用初级学习器预测的结果训练出次级学习器,得到我们最后训练的模型。
但是这样的实现是有很大的缺陷的。在原始数据集D上面训练的模型,然后用这些模型再D上面再进行预测得到的次级训练集肯定是非常好的。会出现过拟合的现象。因此一般通过使用交叉验证法或留一法这样的方式,用训练初级学习器未使用的样本来产生次级学习器的训练样本。以K折交叉为例,具体情况如下图:
from sklearn import datasets
from sklearn import model_selection
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import StackingClassifier
# 加载鸢尾花数据集
iris = datasets.load_iris()
X, y = iris.data, iris.target
# 定义基学习器
base_learners = [
('rf', RandomForestClassifier(n_estimators=10, random_state=42)),
('svc', SVC()),
('dt', DecisionTreeClassifier())
]
# 定义元学习器
meta_learner = DecisionTreeClassifier()
# 定义Stacking模型
stacking_model = StackingClassifier(estimators=base_learners, final_estimator=meta_learner, cv=5)
# 训练模型
stacking_model.fit(X, y)
# 预测
y_pred = stacking_model.predict(X)
# 打印预测结果
print(y_pred)
在这个例子中,我们首先加载了鸢尾花数据集,然后定义了三个基学习器:随机森林、SVM和决策树。然后,我们定义了一个决策树作为元学习器。然后,我们使用这些学习器创建了一个Stacking模型,并设置了5折交叉验证。最后,我们训练了模型,并进行了预测。