集成模型:多个模型相结合实现更好的预测(附代码)

1.导读

机器学习是人工智能的一个分支,使计算机能够从数据中学习并做出预测或决策。如今机器学习无处不在,它为我们日常使用的许多应用程序提供支持。

但机器学习模型是如何运作的呢?我们如何才能使它们更加准确和可靠?

回答这些问题的一种方法是研究集成模型,这是一种使用多个模型比单独使用任何单个模型做出更好预测的技术。集成模型广泛应用于机器学习和数据科学,尤其是分类和回归等任务。

本文将展示如何使用 Python 和 Scikit-learn 构建您自己的集成模型。

更多完整内容   关注   公众号【小Z的科研日常】查看。

2.什么是集成模型?

集成模型背后的想法很简单:为什么不使用多个模型并结合它们的预测,而不是依赖一个模型?这样,我们就可以利用不同模型的多样性和互补性,获得更稳健、更准确的预测。

例如,假设我们想要根据客户的年龄、性别、收入和浏览历史来预测客户是否会购买产品。我们可以使用单一模型,例如逻辑回归或决策树,但它可能只能捕获数据中的一些细微差别和模式。或者,我们可以使用多种模型,例如逻辑回归、决策树、k 最近邻和支持向量机,并使用某种规则或算法组合它们的预测。这是集成模型的示例。

创建和组合多个模型的方法有多种。根据集成模型的实现方式,我们可以将集成模型分为五种主要类型:投票、平均、堆叠、装袋、提升。

看看每种类型的含义及其工作原理。

2.1  投票

装袋的一个特殊情况是将模型用于分类而不是回归。例如,如果你有三个模型用于预测巴黎是否会下雨,可以进行多数投票,得到“是”作为最终预测结果。这也被称为多数投票集成或多数派集成。

多数投票的优点在于它降低了预测的错误率,意味着它们更有可能是正确的。缺点是它不考虑每个预测的置信度或概率,这意味着它可能忽略了一些有用的信息。

要在Python中使用scikit-learn实现多数投票集成,可以使用VotingClassifier类,将其voting参数设置为'hard'。这个类允许我们指定一个模型列表和一个投票方法(如'hard'或'soft')来组合它们的预测。

以下是如何使用多数投票进行分类的示例:

from sklearn.ensemble import VotingClassifier 
from sklearn.linear_model import LogisticRegression 
from sklearn.tree import DecisionTreeClassifier 
from sklearn.svm import SVC 
from sklearn.datasets import make_classification 
from sklearn.model_selection import train_test_split 

# 生成分类的随机数据集
X, y = make_classification(n_samples = 1000 , random_state= 42 ) 

# 将数据集分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 ) 

# 定义三个不同的模型
model1 = LogisticRegression(random_state= 42 ) 
model2 = DecisionTreeClassifier(random_state= 42 ) 
model3 = SVC(random_state= 42 ,probability= True ) 

# 使用多数投票集成组合模型
= VotingClassifier(estimators=[( 'lr' , model1), ( 'dt' , model2) , ( 'svc' , model3)], Voting= 'hard' ) 

# 在训练数据上拟合集成 ensemble.fit
 (X_train, y_train) 

# 在测试数据上评估集成的性能
print ( f"整体精准度:{ensemble.score(X_test, y_test)* 100 } %" )

2.2  平均

将多个模型的预测结果取平均值是组合多个模型的最简单方式。例如,如果你有三个模型分别预测巴黎的温度为15°C、18°C和20°C,你可以将它们的平均值计算出来,得到最终的预测值为17.67°C。这也被称为均值集成。

取平均的优点在于它降低了预测的方差,意味着它们不太可能偏离真实值太远。缺点在于它也降低了预测的偏差,意味着它们不太可能接近真实值。换句话说,取平均值使得预测更加一致,但也更加保守。

要在Python中使用scikit-learn实现平均集成,对于回归问题,我们可以使用VotingRegressor类,对于分类问题,我们可以使用VotingClassifier类。这些类允许我们指定一组模型和一个投票方法(如'hard'或'soft')来组合它们的预测。

以下是如何在回归问题中使用平均集成的示例:

# 导入库
from sklearn.linear_model import LinearRegression 
from sklearn.tree import DecisionTreeRegressor 
from sklearn.neighbors import KNeighborsRegressor 
from sklearn.ensemble import VotingRegressor 
from sklearn.datasets import fetch_california_housing 
from sklearn.metrics importmean_squared_error #

加载数据
california = fetch_california_housing (as_frame=真) 
X = california.data 
y = california.target 

# 定义模型
lr = LinearRegression() 
dt = DecisionTreeRegressor() 
knn = KNeighborsRegressor() 

# 创建平均集成
avg = VotingRegressor(estimators=[( 'lr' , lr), ( 'dt ' , dt), ( 'knn' , knn)]) 

# 对数据进行集成
avg.fit(X, y) 

# 进行预测
y_pred = avg.predict(X) 

# 评估性能
mse = Mean_squared_error(y, y_pred) 
print ( f'MSE: {mse: .2 f} ' )

2.3  堆叠

另一种组合多个模型的方法是将它们用作另一个模型的输入。例如,如果你有三个模型分别预测巴黎的温度为15°C、18°C和20°C,你可以使用它们的预测作为第四个模型的特征,该模型学习如何加权它们并进行最终的预测。这也被称为元学习器或二级学习器。

堆叠的优点在于它可以从每个模型的优点和缺点中学习,从而做出更准确的预测。缺点在于它可能更加复杂,并容易过拟合,意味着它可能在训练数据上表现良好,但在新数据上表现不佳。

要在Python中使用scikit-learn实现堆叠集成,对于回归问题,我们可以使用StackingRegressor类,对于分类问题,我们可以使用StackingClassifier类。这些类允许我们指定一组模型作为基本估算器,以及另一个模型作为最终估算器。

以下是如何在分类问题中使用堆叠集成的示例:

# 导入库
from sklearn.linear_model import LogisticRegression 
from sklearn.tree import DecisionTreeClassifier 
from sklearn.neighbors import KNeighborsClassifier 
from sklearn.ensemble import StackingClassifier 
from sklearn.datasets import load_iris 
from sklearn.metrics import precision_score 

# 加载数据
X, y = load_iris(return_X_y= True ) 

# 定义模型
lr = LogisticRegression() 
dt = DecisionTreeClassifier() 
knn = KNeighborsClassifier() 

# 创建堆叠集成
stack = StackingClassifier(estimators=[( 'lr' , lr), ( 'dt' , dt), ( ' knn' , knn)], Final_estimator=LogisticRegression()) 

# 对数据进行集成
stack.fit(X, y) 

# 进行预测
y_pred = stack.predict(X) 

# 评估性能
acc = precision_score(y, y_pred) 
acc = acc* 100 
print ( f'准确度: {acc: .2 f} %' )

2.4  装袋

第四种组合多个模型的方法是使用数据的不同子集来训练它们。例如,如果你有一个包含1000个观测值的数据集,你可以随机采样500个观测值(可以有重复的观测值),然后使用它们来训练一个模型。你可以多次重复这个过程,从而得到在数据不同子集上训练的不同模型。这也被称为自助聚合或自助法。

自助法的优点在于它降低了预测的方差,意味着它们不太可能偏离真实值太远。缺点在于它不降低预测的偏差,意味着它们仍然有可能接近真实值。换句话说,自助法使预测更加一致但不一定更准确。

要在Python中使用scikit-learn实现自助法集成,对于回归问题,我们可以使用BaggingRegressor类,对于分类问题,我们可以使用BaggingClassifier类。这些类允许我们指定一个基本估算器和创建的自助样本数量。

以下是如何在回归问题中使用bagging ensemble的示例:

# 导入库
from sklearn.tree import DecisionTreeClassifier 
from sklearn.ensemble import BaggingClassifier 
from sklearn.datasets import load_iris 
from sklearn.metrics import precision_score 

# 加载数据
X, y = load_iris(return_X_y= True ) 

# 定义基础模型
dt = DecisionTreeClassifier() 

#创建装袋集成
bag = BaggingClassifier(base_estimator=dt, n_estimators= 10 ) 

# 在数据上拟合
集成 bag.fit(X, y) 

# 进行预测
y_pred = bag.predict(X) 

# 评估性能
acc = precision_score(y, y_pred ) 
acc = acc * 100 
print ( f'准确度: {acc: .2 f} %' )

2.5  提升

组合多个模型的最后一种方法是以顺序和迭代的方式使用它们。例如,如果你有一个模型预测巴黎的温度为15°C,你可以使用其误差或残差作为另一个模型的输入,该模型试图纠正这些误差并做出更好的预测。你可以多次重复这个过程,得到相互从彼此错误中学习的不同模型。这也被称为自适应提升或AdaBoost。

提升的优点在于它降低了预测的方差和偏差,意味着它们更有可能接近并准确地反映真实值。缺点在于它可能对异常值和噪声更为敏感,意味着它可能对数据过拟合或欠拟合。

要在Python中使用scikit-learn实现提升集成,对于回归问题,我们可以使用AdaBoostRegressor类,对于分类问题,我们可以使用AdaBoostClassifier类。这些类允许我们指定一个基本估算器和提升迭代的次数。

以下是如何在回归问题中使用提升集成的示例:

# 导入库
from sklearn.tree import DecisionTreeRegressor 
from sklearn.ensemble import AdaBoostRegressor 
from sklearn.datasets import load_iris 
from sklearn.metrics importmean_squared_error #

加载数据
X, y = load_iris(return_X_y= True ) 

# 定义基础模型
dt = DecisionTreeRegressor() 

#创建增强集成
boost = AdaBoostRegressor(base_estimator=dt, n_estimators= 10 ) 

# 根据数据拟合集成
boost.fit(X, y) 

# 进行预测
y_pred = boost.predict(X) 

# 评估性能
mse = Mean_squared_error(y, y_pred)
打印(f'MSE:{mse:.2 f} ')

3.结语

总之,集成模型是提高机器学习模型准确性和可靠性的强大技术。通过组合多个模型,我们可以利用它们的优势并弥补它们的弱点,从而产生更稳健和一致的预测。

在本文中,我解释了一些最常见的集成模型类型以及如何使用 Scikit-learn 在 Python 中实现它们。无论您是想预测客户行为还是对图像进行分类,集成模型都可以帮助您获得更好的结果。

将多模型融合和增量学习相结合,可以通过增量学习的方式来更新各个子模型的参数,从而实现模型融合的效果。具体来说,我们可以采用集成学习中的“Bagging”策略,使用多个基分类器进行预测,并对预测结果进行平均或投票等多数表决来得到最终的预测结果。在新数据到来时,我们可以使用增量学习来更新每个子模型的参数,从而更新模型的融合结果。 下面给出一个具体的实例。假设我们有一个二分类问题的数据集,并使用两个基分类器进行预测,分别是逻辑回归和决策树。 ``` from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import VotingClassifier import numpy as np # 加载数据集 X = np.array([[1, 2], [3, 4], [5, 6]]) y = np.array([0, 1, 0]) # 初始化子模型 clf1 = LogisticRegression() clf2 = DecisionTreeClassifier() # 初始化投票模型 ensemble = VotingClassifier(estimators=[('lr', clf1), ('dt', clf2)], voting='soft') # 使用fit方法进行初始化训练 ensemble.fit(X, y) # 加载新的数据集 X_new = np.array([[7, 8], [9, 10]]) y_new = np.array([0, 1]) # 使用partial_fit方法进行增量学习 clf1.partial_fit(X_new, y_new) clf2.partial_fit(X_new, y_new) # 输出预测结果 print(ensemble.predict([[11, 12], [13, 14]])) ``` 在这个示例中,我们首先使用VotingClassifier类初始化了一个投票模型,并通过fit方法对初始数据集进行了训练。然后,我们使用partial_fit方法对每个子模型进行了增量学习。最后,我们输出了模型对新数据的预测结果。 需要注意的是,在实际应用中,我们可能需要使用更多的基分类器,并对每个子模型进行更复杂的增量学习,以达到更好的融合效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小Z的科研日常

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值