数据科学中的堆叠和集成方法
有很多方法可以完成集成,每种方法都有不同的基础逻辑来获得改进。
关键变化可以是 -
1. 集合中模型的性质(高偏差/高方差)
2. 我们如何将模型投入工作,即相同的模型类型、不同的模型类型、并行、顺序、样本数据、完整数据等
3.我们如何结合个人预测
让我们看看一些关键方法 -
1. 基于简单投票的集成
数据集在特征空间中没有相同的模式。它的模式将在大部分零件中支持一种类型的模型,但在某些零件中支持不同类型的模型。
对多个模型的实验进行观察。
尽管它们的总体得分相同,但两个最好的模型——神经网络和最近邻——有三分之一的时间不一致;也就是说,他们在非常不同的数据区域上犯了错误。我们观察到,这两种方法中更有信心的人往往是正确的。
Ref - 数据挖掘中的集成方法:通过组合预测提高准确性
这意味着,如果两个模型各有 70% 的准确率,并且在 10% 的数据上都存在差异。
很有可能在0-10%的时间里,更自信的人是正确的,这将是使用软投票策略将两者结合起来的好处。
直觉- 如果我们使用 KNN 和线性回归。当然,KNN 在大部分空间(即远离 Regression 平面)会更好,但对于靠近平面的数据点,Regression 会更有信心。
Ref - 使用 Scikit-Learn、Keras 和 TensorFlow 进行机器学习
2. 基于 Bagging 的集成
具有非常高方差的模型容易过拟合。如果我们找到一种平均方差的方法,我们可以将这一挑战转化为我们的优势。这是基于 bagging 的模型背后的逻辑。
直觉- 在非常高的水平上,当建立在不同的随机样本上时,高方差模型将创建决策边界,当平均时,决策边界将平滑预测并且方差将减少。
一个直观的示例是Here
Why not High Bias models - 高偏差模型(例如回归线)不会随每个样本发生太大变化,因为样本将具有大致相同的分布,并且微小的差异不会影响这些模型。因此,每个样本最终都会得到几乎相同的模型。
如本例所示,适用于 3 种不同的模型。
参考 - R、Bradley Boehmke 和 Brandon Greenwell 的动手机器学习
3. 基于提升的集成
提升的主要思想是按顺序将新模型添加到集成中。从本质上讲,boosting 从一个弱模型(例如,只有几个分裂的决策树)开始攻击偏差-方差-权衡,并通过继续构建新树来依次提高其性能,其中序列中的每棵新树都试图修复前一棵树出错最大的地方(即序列中的每棵新树都将关注前一棵树预测错误最大的训练行)
参考 - 与 R、Bradley Boehmke 和 Brandon Greenwell 合作的动手机器学习
直觉- 我们从一个弱模型(例如 DT 树桩)开始,我们可能认为它是一条跨越数据集空间的简单线(超平面),将其分成两部分。我们重复此步骤,但添加额外信息,即为未分类记录增加权重。最后,我们进行权重投票,例如对更好的模型进行权重投票。
假设第一个模型在 100 条记录中预测了 57 条正确。现在,第二个模型将为 43 条记录增加权重。假设它最终正确率为 55。因此,第一个模型将具有更高的权重。这意味着您肯定有 57 次正确 + 由于 43 条记录的权重增加,很有可能会以非常高的置信度正确预测一些记录,这将是合奏的补充。
4. 元学习器/广义堆叠
在这种方法中,多个模型的预测被用作元学习器的输入,以使用额外的数据集来决定最终预测。
因此,这里我们没有使用任何现成的投票功能,例如软/硬投票,而是允许另一个模型学习初始模型预测的偏差模式并学习调整(如果有)。
Ref - developer.ibm.com
这是对通用堆叠方法的一个非常简单的解释,但堆叠已在竞赛中广泛使用。到了几乎无法理解和解释的难以想象的程度。
正如在下面提到的方法参考中所做的那样
您的样本数据
我们必须攻击模型偏差/方差模式、预测概率的置信度等。以获得优势。我们无法通过硬投票来改进任何数据集/模型组合。
也许你可以调查这个例子
dataset = sklearn.datasets.load_breast_cancer(return_X_y=False)
X = pd.DataFrame(dataset.data, columns=dataset.feature_names)
y = dataset.target
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X,y,test_size=0.20,random_state=201)
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
knn_clf = KNeighborsClassifier(n_neighbors=2)
svm_clf = SVC(probability=True)
voting_clf = VotingClassifier(
estimators=[('knn', knn_clf), ('svc', svm_clf)], voting='soft')
voting_clf.fit(x_train, y_train)
from sklearn.metrics import accuracy_score
for clf in (knn_clf, svm_clf, voting_clf):
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)
print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
KNeighborsClassifier 0.9298245614035088
SVC 0.9122807017543859
VotingClassifier 0.956140350877193
它有时被称为“集成学习”,其中几个“弱学习者”进行预测。这些预测由一些元模型“组合”。一种简单的方法是您只使用多数票。您还可以使用逻辑回归。您当然可以(并且应该!)通过预测测试数据来检查堆叠模型的性能。相关的集成技术是 boosting 和 bagging。
简化示例:假设您要预测二元结果。假设您有两个不同的模型,它们的表现不是特别好,但比随机猜测表现得更好。此外,假设模型是独立的。假设您的每个模型都做出了正确的预测可能性。现在,当您有两个模型时,可能的结果是:
正确,正确:
错,错:
正确,错误:
错误,正确:
您会看到两个模型都错误的概率是“仅” . 因此,如果您设法通过某些中间/元(堆叠)模型将其余情况识别为“正确预测”,那么您最终会得到相当好的结果。从本质上讲,您将“提高”模型的预期准确性 (单一模型)到 (合奏)在这里。