1、Bagging
集成学习是一种机器学习范式,通过构建并组合多个学习器来提高预测性能。Bagging(Bootstrap Aggregating)是集成学习中的一种常见技术,它通过组合多个模型减少方差,提高稳定性和准确性。弱学习器通常是在原始数据集的不同子集上训练得到的,子集是通过有放回随机抽样(即自助采样法)从原始数据集中生成的。可以使用scikit-learn库中的BaggingRegressor
或BaggingClassifier
来实现Bagging方法。
1)BaggingRegressor
BaggingRegressor 是 scikit-learn 中的一个集成学习算法,用于提高回归模型的稳定性和准确性。Bagging(Bootstrap Aggregating)通过在原始数据集上构建多个独立的预测器,然后将它们的预测结果进行平均或多数投票来提高模型的性能。对于回归问题,通常是取预测值的平均作为最终预测结果。常用参数如下,
参数 | 描述 |
estimator | 默认为 如果为 可以设置为任何支持样本加权的回归器。 |
n_estimators | 默认为 增加数量通常会提高模型的稳定性和性能, 但也会增加计算成本。 |
max_samples | 默认为 可以是小于1的浮点数表示比例, 或直接设置为整数表示具体数量。 |
max_features | 默认为 可以是小于1的浮点数表示比例, 或直接设置为整数表示具体数量。 |
bootstrap | 默认为 设置为 |
bootstrap_features | 默认为 |
oob_score | 默认为 是否使用袋外样本来评估模型的性能。 仅当 |
n_jobs | 默认为 设置为 |
random_state | 默认为 它确保了每次运行代码时基估计器的随机样本抽取是一致的。 |
verbose | 默认为 控制构建基估计器时的详细程度,
|
使用代码,
# 导入必要的库
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingRegressor
from sklearn.datasets import load_diabetes
from sklearn.metrics import mean_squared_error, r2_score
# 加载数据
diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建BaggingRegressor模型
bagging_regressor = BaggingRegressor(n_estimators=100, random_state=42)
# 训练模型
bagging_regressor.fit(X_train, y_train)
# 预测测试集
y_pred = bagging_regressor.predict(X_test)
# 计算并打印评估指标
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("Mean Squared Error:", mse)
print("R^2 Score:", r2)
2)BaggingClassifier
BaggingClassifier
是scikit-learn中一个强大的集成学习算法,用于提高分类算法的稳定性和准确性,通过将多个模型组合在一起减少方差,避免过拟合。Bagging(Bootstrap Aggregating)通过对原始数据集进行多次重采样来创建多个训练集,然后对每个训练集训练一个基模型。最终的预测是通过对所有基模型的预测结果进行聚合(例如,通过投票或平均)来完成的。常用参数,
参数 | 描述 |
estimator | 默认 指定基础分类器的类型。 任何适合于样本权重的分类器 都可以作为基础分类器。 |
n_estimators | 默认 即集成中包含的分类器个数。 |
max_samples | 默认 控制用于训练每个基础分类器的数据集的大小。
|
max_features | 默认 控制用于训练每个基础分类器时使用的特征数量。
|
bootstrap | 默认 表示是否使用样本的自助采样来构建 每个基础分类器使用的数据集。 |
bootstrap_features | 默认 |
oob_score | 默认 则在训练结束后自动使用袋外样本 来估计泛化准确度。 |
random_state |
对于重现结果很重要。 |
n_jobs | 默认 如果设置为 |
warm_start | 默认 则可以在已有的模型上继续训练新的模型, 而不是从头开始。 |
使用代码,
# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建基础分类器的实例
base_estimator = DecisionTreeClassifier()
# 初始化BaggingClassifier
bagging_clf = BaggingClassifier(
estimator=base_estimator, # 基础分类器
n_estimators=100, # 分类器数量
max_samples=0.8, # 训练每个分类器使用的样本比例
max_features=0.8, # 训练每个分类器使用的特征比例
bootstrap=True, # 使用样本的自助采样
bootstrap_features=False, # 不对特征进行自助采样
oob_score=True, # 计算袋外分数来评估模型的泛化误差
random_state=42, # 随机种子
n_jobs=-1 # 使用所有可用的CPU核心
)
# 训练模型
bagging_clf.fit(X_train, y_train)
# 预测测试集
y_pred = bagging_clf.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy*100:.2f}%")
# 如果计算了袋外分数,可以这样获取
if bagging_clf.oob_score:
print(f"袋外分数(OOB score): {bagging_clf.oob_score_:.2f}")
2、Boosting
Python的机器学习领域,集成学习是一种常用的策略,旨在通过结合多个学习器的预测结果来提高整体模型的性能。Boosting是集成学习的一种方法,其核心思想是按顺序训练一系列的弱学习器(即,比随机猜测略好的模型),每一个后续的学习器都尝试纠正前一个学习器的错误。Boosting的目标是将这些弱学习器组合成一个强学习器。
1)AdaBoost (Adaptive Boosting)
AdaBoost是Boosting方法中的一种,它通过增加之前被错误分类观测的权重,使新的分类器更加关注那些难以分类的观测。使用scikit-learn中的AdaBoostRegressor
或AdaBoostClassifier
可以很容易地实现AdaBoost算法。
AdaBoostClassifier:
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# 生成模拟数据
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建AdaBoost模型
ada_clf = AdaBoostClassifier(n_estimators=100, random_state=42)
# 训练模型
ada_clf.fit(X_train, y_train)
# 预测测试集
y_pred = ada_clf.predict(X_test)
# 评估模型
accuracy = ada_clf.score(X_test, y_test)
print(f'Accuracy: {accuracy}')
AdaBoostRegressor:
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostRegressor
from sklearn.metrics import mean_squared_error
# 生成模拟数据集
X, y = make_regression(n_samples=1000, n_features=20, n_informative=2, noise=0.1, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 初始化AdaBoost回归器
ada_reg = AdaBoostRegressor(n_estimators=100, learning_rate=1.0, loss='linear', random_state=42)
# 训练模型
ada_reg.fit(X_train, y_train)
# 预测测试集
y_pred = ada_reg.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
2)Gradient Boosting
Gradient Boosting是另一种Boosting方法,它通过连续地添加新的模型,专注于减少前一个模型的残差(即,真实值与预测值之间的差异),来提高模型的性能。scikit-learn提供了GradientBoostingClassifier
和GradientBoostingRegressor
来实现Gradient Boosting算法。
GradientBoostingClassifier:
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# 生成模拟数据
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建Gradient Boosting模型
gb_clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=42)
# 训练模型
gb_clf.fit(X_train, y_train)
# 预测测试集
y_pred = gb_clf.predict(X_test)
# 评估模型
accuracy = gb_clf.score(X_test, y_test)
print(f'Accuracy: {accuracy}')
GradientBoostingRegressor:
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error
# 生成模拟数据
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 初始化Gradient Boosting回归器
gbr = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
# 训练模型
gbr.fit(X_train, y_train)
# 预测测试集
y_pred = gbr.predict(X_test)
# 评估性能
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")