数据科学中的堆叠和集成方法

数据挖掘 预测建模 统计数据 算法 集成建模
2021-09-15 02:12:42

我知道使用堆叠和集成已经变得流行,并且这些方法可以提供比使用单一算法更好的结果。

我的问题是:结果改善背后的原因是什么,无论是统计的还是其他的?

我也明白,在高层次上,结合这些方法将结合来自不同算法的预测。每种算法都有自己的优点和缺点,但不确定如何将它们结合起来实际上会改善结果。

这是一个简单的平衡示例(50% 的标签实际上是 T,50% 实际上是 F),我认为堆叠或集成算法仍然会给出与原始模型相同的结果。在这种情况下,对于平局(1 F 和 1 T),我决定选择 T。如果我选​​择 F,也会出现同样的问题。如果我使用 predict_proba,这会稍微复杂一些,但认为会出现同样的问题。

在此处输入图像描述

2个回答

有很多方法可以完成集成,每种方法都有不同的基础逻辑来获得改进
关键变化可以是 -
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。

简化示例:假设您要预测二元结果。假设您有两个不同的模型,它们的表现不是特别好,但比随机猜测表现得更好。此外,假设模型是独立的。假设您的每个模型都做出了正确的预测0.8%可能性。现在,当您有两个模型时,可能的结果是:

正确,正确: 0.8*0.8=0.64

错,错: 0.2*0.2=0.04

正确,错误: 0.8*0.2=0.16

错误,正确: 0.2*0.8=0.16

您会看到两个模型都错误的概率是“仅” 0.04. 因此,如果您设法通过某些中间/元(堆叠)模型将其余情况识别为“正确预测”,那么您最终会得到相当好的结果。从本质上讲,您将“提高”模型的预期准确性0.8 (单一模型)到 0.64+0.16+0.16=0.96 (合奏)在这里。