集成学习技术:Python中使用随机森林的实例教程
集成学习技术:Python中使用随机森林的教程
机器学习模型已经成为多个行业决策的重要组成部分,然而,它们在处理嘈杂或多样化的数据集时常常遇到困难。这就是集成学习的作用所在。
本文将揭开集成学习的神秘面纱,并向您介绍其强大的随机森林算法。不论您是一位希望完善工具包的数据科学家,还是一位寻求实际见解以构建稳健机器学习模型的开发者,本文都适合每个人!
通过阅读本文,您将全面了解集成学习以及Python中随机森林的工作原理。因此,无论您是一位经验丰富的数据科学家,还是一位渴望扩展机器学习能力的好奇心人士,加入我们的冒险,提升您的机器学习专业知识!
1. 什么是集成学习?
集成学习是一种机器学习方法,它将多个弱模型的预测结果结合在一起,以获得更强的预测结果。集成学习的概念是通过充分利用每个模型的预测能力,减少单个模型的偏差和误差。
为了更好地理解,让我们举一个生活例子,假设您看到了一只动物,但不知道它属于哪个物种。因此,您不是只问一个专家,而是问了十个专家,并采纳多数专家的意见。这就是所谓的硬投票。
硬投票是指我们考虑每个分类器的类别预测,然后根据获得的最多票数将输入分类到特定类别。另一方面,软投票是指我们考虑每个分类器对每个类别的概率预测,然后根据该类别的平均概率(在分类器的概率之间取平均)将输入分类到具有最大概率的类别。
2. 何时使用集成学习?
集成学习通常用于改进模型性能,包括提高分类准确率和降低回归模型的平均绝对误差。此外,集成学习器始终能够产生更稳定的模型。当模型之间不相关时,集成学习器的效果最佳,因为每个模型都能学到独特的东西,并努力提高整体性能。
3. 集成学习策略
尽管集成学习可以以多种方式应用,但在实践中,有三种策略因其易于实现和使用而广受欢迎。这三种策略分别是:
- Bagging:Bagging是bootstrap aggregation的缩写,它是一种集成学习策略,通过使用数据集的随机样本来训练模型。
- Stacking:Stacking是stacked generalization的缩写,它是一种集成学习策略,我们训练一个模型来结合在我们的数据上训练的多个模型。
- Boosting:Boosting是一种集成学习技术,重点是选择被错误分类的数据来训练模型。
让我们深入研究这些策略,并看看如何使用Python在我们的数据集上训练这些模型。
4. Bagging集成学习
Bagging会对数据进行随机采样,并使用学习算法和平均值来找到随机采样的概率;也被称为自助聚合;它通过多个模型的结果聚合来得到一个广泛的结果。
该方法包括:
- 将原始数据集分成多个子集,带有替换。
- 为每个子集开发基础模型。
- 在运行所有模型的同时,将所有预测结果传递以获得最终预测。
Scikit-learn提供了实现BaggingClassifier和BaggingRegressor的能力。BaggingMetaEstimator标识原始数据集的随机子集来适应每个基础模型,然后通过投票或平均值将各个基础模型的预测结果聚合成最终预测。该方法通过随机化构建过程来减少方差。
让我们以使用scikit learn的bagging估计器为例:
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bagging = BaggingClassifier(base_estimator=DecisionTreeClassifier(), n_estimators=10, max_samples=0.5, max_features=0.5)
Bagging分类器考虑了几个参数:
- base_estimator: Bagging方法中使用的基模型。这里我们使用的是决策树分类器。
- n_estimators: Bagging方法中我们将使用的估计器的数量。
- max_samples: 每个基估计器从训练集中抽取的样本数量。
- max_features: 用于训练每个基估计器的特征数量。
现在我们将该分类器拟合到训练集上并评估其得分。
bagging.fit(X_train, y_train)
bagging.score(X_test, y_test)
对于回归任务,我们也可以做类似的操作,唯一的区别是我们将使用回归估计器。
from sklearn.ensemble import BaggingRegressor
bagging = BaggingRegressor(DecisionTreeRegressor())
bagging.fit(X_train, y_train)
model.score(X_test, y_test)
5. Stacking集成学习
Stacking是一种将多个估计器组合起来以最小化其偏差并产生准确预测的技术。每个估计器的预测结果被组合并输入到通过交叉验证训练的最终预测元模型中;Stacking可以应用于分类和回归问题。
Stacking的步骤如下:
- 将数据分为训练集和验证集
- 将训练集分为K个折叠
- 在K-1个折叠上训练基模型,并对第K个折叠进行预测
- 重复上述步骤,直到对每个折叠都有一个预测结果
- 在整个训练集上拟合基模型
- 使用模型对测试集进行预测
- 重复步骤3-6,对其他基模型进行操作
- 使用测试集的预测结果作为新模型(元模型)的特征
- 使用元模型对测试集进行最终预测
在下面的示例中,我们首先创建两个基分类器(RandomForestClassifier和GradientBoostingClassifier)和一个元分类器(LogisticRegression),然后使用K折交叉验证将这些分类器在训练数据(iris数据集)上的预测作为输入特征传递给我们的元分类器(LogisticRegression)。
在使用K折交叉验证将基分类器在测试数据集上的预测作为输入特征传递给我们的元分类器后,使用这两个集合在测试集上的预测结果,并将其与堆叠集成的对应结果进行准确性评估。
# 加载数据集
data = load_iris()
X, y = data.data, data.target
# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定义基分类器
base_classifiers = [
RandomForestClassifier(n_estimators=100, random_state=42),
GradientBoostingClassifier(n_estimators=100, random_state=42)
]
# 定义元分类器
meta_classifier = LogisticRegression()
# 创建一个数组来保存基分类器的预测结果
base_classifier_predictions = np.zeros((len(X_train), len(base_classifiers)))
# 使用K折交叉验证进行堆叠
kf = KFold(n_splits=5, shuffle=True, random_state=42)
for train_index, val_index in kf.split(X_train):
train_fold, val_fold = X_train[train_index], X_train[val_index]
train_target, val_target = y_train[train_index], y_train[val_index]
for i, clf in enumerate(base_classifiers):
cloned_clf = clone(clf)
cloned_clf.fit(train_fold, train_target)
base_classifier_predictions[val_index, i] = cloned_clf.predict(val_fold)
# 在基分类器的预测结果上训练元分类器
meta_classifier.fit(base_classifier_predictions, y_train)
# 使用堆叠集成进行预测
stacked_predictions = np.zeros((len(X_test), len(base_classifiers)))
for i, clf in enumerate(base_classifiers):
stacked_predictions[:, i] = clf.predict(X_test)
# 使用元分类器进行最终预测
final_predictions = meta_classifier.predict(stacked_predictions)
# 评价堆叠集成的性能
accuracy = accuracy_score(y_test, final_predictions)
print(f"堆叠集成准确率: {accuracy:.2f}")
6. 提升集成学习
提升是一种机器学习集成技术,通过将弱学习器转化为强学习器来减小偏差和方差。这些弱学习器按顺序应用于数据集;首先创建一个初始模型并将其拟合到训练集上。一旦确定了第一个模型的错误,就会设计另一个模型来纠正这些错误。
有一些流行的算法和实现用于提升集成学习技术。让我们来探索最著名的几个。
6.1. AdaBoost
AdaBoost是一种有效的集成学习技术,它按顺序使用弱学习器进行训练。每个迭代优先考虑错误预测,同时减少对正确预测实例的权重分配;对具有挑战性的观察重点的策略使得AdaBoost随着时间的推移变得越来越准确,其最终预测由其弱学习器的多数投票或加权和决定。
AdaBoost是一种适用于回归和分类任务的多功能算法,但在这里我们专注于使用Scikit-learn解决分类问题的应用。让我们看看下面的示例中如何使用它进行分类任务:
from sklearn.ensemble import AdaBoostClassifier
model = AdaBoostClassifier(n_estimators=100)
model.fit(X_train, y_train)
model.score(X_test,y_test)
在这个例子中,我们使用了scikit learn中的AdaBoostClassifier,并将n_estimators设置为100。默认的学习器是决策树,你可以进行更改。除此之外,决策树的参数也可以进行调整。
2. 极限梯度提升(XGBoost)
极限梯度提升,更为人所熟知的是XGBoost,是最好的提升集成学习算法之一,因为它具有并行计算的特性,非常适合在单台计算机上运行。XGBoost可以通过机器学习社区开发的xgboost软件包来使用。
import xgboost as xgb
params = {"objective":"binary:logistic",'colsample_bytree': 0.3,'learning_rate': 0.1,
'max_depth': 5, 'alpha': 10}
model = xgb.XGBClassifier(**params)
model.fit(X_train, y_train)
model.fit(X_train, y_train)
model.score(X_test,y_test)
3. LightGBM
LightGBM是另一种基于树学习的梯度提升算法。然而,它与其他基于树的算法不同,因为它使用叶子节点优先的树生长方式,使得它收敛更快。
在下面的示例中,我们将LightGBM应用于一个二分类问题:
import lightgbm as lgb
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)
params = {'boosting_type': 'gbdt',
'objective': 'binary',
'num_leaves': 40,
'learning_rate': 0.1,
'feature_fraction': 0.9
}
gbm = lgb.train(params,
lgb_train,
num_boost_round=200,
valid_sets=[lgb_train, lgb_eval],
valid_names=['train','valid'],
)
集成学习和随机森林是强大的机器学习模型,机器学习从业者和数据科学家经常使用它们。在本文中,我们介绍了它们的基本概念,以及何时使用它们,最后,我们介绍了最流行的算法以及如何在Python中使用它们。
参考文献
- 集成学习算法简介
- 集成学习的全面指南:你需要了解什么
- 集成学习的全面指南(附带Python代码)
Youssef Rafaat 是一位计算机视觉研究员和数据科学家。他的研究重点是开发用于医疗应用的实时计算机视觉算法。他还在市场营销、金融和医疗领域担任数据科学家超过3年。