【Python机器学习实战】----基于AdaBoost分类树模型、梯度提升分类树模型、Bagging分类树模型以及随机森林分类模型对空气质量等级进行预测

news2024/11/26 2:49:58

37c7722f15134fd49f71bcf341b1ba47.gif

🎩 欢迎来到技术探索的奇幻世界👨‍💻

📜 个人主页:@一伦明悦-CSDN博客

✍🏻 作者简介: C++软件开发、Python机器学习爱好者

🗣️ 互动与支持💬评论      👍🏻点赞      📂收藏     👀关注+

如果文章有所帮助,欢迎留下您宝贵的评论,

点赞加收藏支持我,点击关注,一起进步!

前言

       AdaBoost分类树模型、梯度提升分类树模型、Bagging分类树模型以及随机森林分类模型是常见且有效的机器学习算法。以下是它们的详细介绍:

  1. AdaBoost分类树模型

    • 基本原理:AdaBoost(Adaptive Boosting)是一种集成学习方法,通过串行训练一系列弱分类器(通常是决策树),每个分类器都试图修正前一个分类器的错误,从而提升整体性能。
    • 工作流程:首先给每个样本赋予相等的权重,训练第一个分类器并根据分类结果调整样本权重,使得错误分类的样本在下一个分类器训练中获得更高的权重。迭代过程中,每个分类器的权重由其准确性决定。
    • 优点:对于复杂问题表现良好,能够处理高维度数据和大量样本。
    • 缺点:对噪声和异常值敏感,可能导致过拟合。
  2. 梯度提升分类树模型

    • 基本原理:梯度提升(Gradient Boosting)也是一种集成学习技术,但它是通过构建多个决策树(弱学习器)的集合来提升模型性能。每个新树的构建都是为了减少前一棵树在训练集上的残差(预测错误)。
    • 工作流程:从第一个简单模型(通常是决策树)开始,每个后续模型都专注于修正前面所有模型的预测误差。
    • 优点:效果较好且健壮,不易受到噪声干扰。
    • 缺点:相较于AdaBoost,更容易过拟合,训练时间较长。
  3. Bagging分类树模型

    • 基本原理:Bagging(Bootstrap Aggregating)通过构建多个相互独立的分类器(决策树),并在平均预测结果以减少方差和提升泛化能力。
    • 工作流程:通过随机选择样本(有放回抽样)和特征进行训练,每个分类器权重相等且相互独立。
    • 优点:降低了过拟合风险,适合高方差的模型。
    • 缺点:可能增加模型解释性的难度,不利于模型结果的可解释性。
  4. 随机森林分类模型

    • 基本原理:随机森林是一种集成学习技术,构建多个决策树并将它们集成为一个强大的模型。每个决策树都是在不同的随机样本和随机特征集上训练。
    • 工作流程:通过投票或取平均值来提高预测准确率,每个树都在随机样本子集上训练。
    • 优点:高度并行化处理,适用于高维度数据和大型数据集,对异常值和噪声具有较好的鲁棒性。
    • 缺点:对于高度相关的特征可能表现不佳,需要较多内存和计算资源。

正文

01-线性模型和回归树的方差对比

这段代码主要是对线性模型和回归树模型的方差进行比较,并通过箱线图展示。下面是对代码的详细解释和代码作用:

  1. 导入模块:导入所需的Python库和模块,包括numpy、pandas、warnings(用于警告处理)、matplotlib.pyplot(用于绘图)、sklearn中的相关模块(用于机器学习)、xgboost(用于梯度提升)、以及读取数据的excel文件。

  2. 数据预处理:读取数据,并进行一系列数据清洗操作,包括将0替换为NaN(缺失值),删除包含NaN的行,筛选满足条件的数据,并将特征(‘SO2’和’CO’)赋值给X,目标变量(‘PM2.5’)赋值给Y。

  3. 模型选择:定义了两个模型,一个是决策树回归模型(modelDTC),另一个是线性回归模型(modelLR),并设置了模型参数(决策树最大深度为3,随机种子为123)。

  4. 交叉验证:使用KFold进行10折交叉验证,将数据集分为训练集和测试集,循环训练模型并预测。

  5. 箱线图绘制:利用matplotlib.pyplot绘制箱线图,比较了线性模型和回归树模型的方差情况。在箱线图中,红色圆点代表中位数,红色线段表示上下四分位数,箱体内的蓝色盒子表示数据分布的中间50%区域,盒子外的蓝色线段表示数据的范围,其中数据点是异常值(如果有的话)。

  6. 保存图像:通过plt.savefig将绘制的箱线图保存为PNG格式的图片文件。

这段代码的主要作用是比较线性模型和回归树模型在预测PM2.5浓度时的方差情况,并以可视化的方式展示结果,有助于分析模型的性能和稳定性。

#本章需导入的模块
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings(action = 'ignore')
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False
from sklearn.model_selection import train_test_split,KFold,cross_val_score
from sklearn import tree
import sklearn.linear_model as LM
from sklearn import ensemble
from sklearn.datasets import make_classification,make_circles,make_regression
from sklearn.metrics import zero_one_loss,r2_score,mean_squared_error
import xgboost as xgb

data=pd.read_excel('北京市空气质量数据.xlsx')
data=data.replace(0,np.NaN)
data=data.dropna()
data=data.loc[(data['PM2.5']<=200) & (data['SO2']<=20)]
X=data[['SO2','CO']]
Y=data['PM2.5']
X0=np.array(X.mean()).reshape(1,-1)

modelDTC = tree.DecisionTreeRegressor(max_depth=3,random_state=123)
modelLR=LM.LinearRegression()
model1,model2=[],[]    
kf = KFold(n_splits=10,shuffle=True,random_state=123)
for train_index, test_index in kf.split(X):  
    Ntrain=len(train_index)
    XKtrain=X.iloc[train_index]
    YKtrain=Y.iloc[train_index]      
    modelLR.fit(XKtrain,YKtrain)
    modelDTC.fit(XKtrain,YKtrain)
    model1.append(float(modelLR.predict(X0)))
    model2.append(float(modelDTC.predict(X0)))

plt.boxplot(x=model1,sym='rd',patch_artist=True,boxprops={'color':'blue','facecolor':'pink'},
            labels ={"线性模型\n方差=%.3f"%np.var(model1)},showfliers=False) 
plt.boxplot(x=model2,sym='rd',positions=[2],patch_artist=True,boxprops={'color':'blue','facecolor':'pink'},
            labels ={"回归树\n方差=%.3f"%np.var(model2)},showfliers=False) 
plt.title("线性模型和回归树的方差对比")
plt.savefig("../4.png", dpi=500)

运行结果如下图所示 

69f71491550d4051b048bfa4f3bca594.png

02-对比单棵决策树、弱模型以及提升策略的预测效果

这段代码主要是用于比较单棵决策树、单个弱分类模型以及使用AdaBoost集成的分类器在测试集上的误差表现,并通过可视化结果展示比较。

  1. 导入模块:首先导入需要使用的Python库和模块,包括numpy、pandas、warnings(用于警告处理)、matplotlib.pyplot(用于绘图)、sklearn中的相关模块(用于机器学习)、xgboost(用于梯度提升)。

  2. 生成数据集:使用make_classification生成一个虚拟的分类数据集,包括12000个样本和10个特征,其中具有信息性的特征有2个,设置了随机种子和类别间的簇数。

  3. 数据集划分:使用train_test_split将数据集划分为训练集和测试集,其中训练集占70%。

  4. 定义单棵决策树模型:创建了两个不同深度的决策树分类器(dt_stumpdt),并计算它们在测试集上的分类误差。

  5. AdaBoost集成模型

    • 离散AdaBoost:使用ensemble.AdaBoostClassifier构建基于dt_stump的AdaBoost分类器,设置了400个估计器(基分类器),使用SAMME算法。
    • 连续AdaBoost:同样基于dt_stump构建AdaBoost分类器,但使用了SAMME.R算法。
  6. 误差计算

    • 对离散AdaBoost和连续AdaBoost模型分别使用staged_predict方法来逐步预测测试集,然后计算每次迭代的分类误差(zero_one_loss),并将结果存储在ada_discrete_errada_real_err数组中。
  7. 绘制图形

    • 创建一个新的图形(fig),添加子图(axes)。
    • 使用axhline绘制水平线,表示单个弱分类模型(dt_stump_err)和深度为9的单棵树模型(dt_err)的分类误差。
    • 使用plot绘制离散AdaBoost和连续AdaBoost的分类误差随迭代次数变化的曲线。
    • 设置图的标题、x轴和y轴标签,添加图例用于说明每条曲线的含义。
  8. 保存和显示图像

    • 使用plt.savefig将绘制的图形保存为PNG格式的图片文件,保存路径为"…/4.png",设置分辨率为500dpi。
    • 使用plt.show()显示绘制的图形在屏幕上。

这段代码的主要作用是通过实验和可视化分析,比较不同模型在分类任务中的表现,特别是单棵树、单个弱分类模型与使用AdaBoost集成的模型之间的性能差异。

#本章需导入的模块
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings(action = 'ignore')
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False
from sklearn.model_selection import train_test_split,KFold,cross_val_score
from sklearn import tree
import sklearn.linear_model as LM
from sklearn import ensemble
from sklearn.datasets import make_classification,make_circles,make_regression
from sklearn.metrics import zero_one_loss,r2_score,mean_squared_error,accuracy_score
import xgboost as xgb

X,Y=make_classification(n_samples=12000,n_features=10,n_redundant=0,n_informative=2,random_state=123,n_clusters_per_class=1)
X_train, X_test, Y_train, Y_test = train_test_split(X,Y,train_size=0.70, random_state=123)
dt_stump = tree.DecisionTreeClassifier(max_depth=1, min_samples_leaf=1)
dt_stump.fit(X_train, Y_train)
dt_stump_err = 1.0 - dt_stump.score(X_test, Y_test)
dt = tree.DecisionTreeClassifier(max_depth=9, min_samples_leaf=1)
dt.fit(X_train, Y_train)
dt_err = 1.0 - dt.score(X_test, Y_test)

B=400
ada_discrete = ensemble.AdaBoostClassifier(base_estimator=dt_stump,n_estimators=B,algorithm="SAMME")
ada_discrete.fit(X_train, Y_train)
ada_real = ensemble.AdaBoostClassifier(base_estimator=dt_stump,n_estimators=B,algorithm="SAMME.R")
ada_real.fit(X_train, Y_train)

ada_discrete_err = np.zeros((B,))
for i,Y_pred in enumerate(ada_discrete.staged_predict(X_test)):
    ada_discrete_err[i] = zero_one_loss(Y_pred, Y_test)
ada_real_err = np.zeros((B,))
for i, Y_pred in enumerate(ada_real.staged_predict(X_test)):
    ada_real_err[i] = zero_one_loss(Y_pred, Y_test)
    
fig = plt.figure()
axes = fig.add_subplot(111)
axes.axhline(y=dt_stump_err,c='red',linewidth=0.8,label='单个弱模型')
axes.axhline(y=dt_err,c='blue',linewidth=0.8,label='单棵树深度=9的分类树')
axes.plot(np.arange(B), ada_discrete_err,linestyle='--',label='离散AdaBoost')
axes.plot(np.arange(B), ada_real_err,linestyle='-.',label='连续AdaBoost')
axes.set_xlabel('迭代次数B')
axes.set_ylabel('测试误差')
axes.set_title('单棵树、弱模型和adaBoost集成树')
axes.legend()
#leg = axes.legend(loc='upper right', fancybox=True)
#leg.get_frame().set_alpha(0.7)
plt.savefig("../4.png", dpi=500)
plt.show()

运行结果如下图所示

9a2ebf4f98a24002958fc11d5003db1f.png

03-基于模拟数据直观观察提升策略下高权重样本观测随迭代次数的变化情况

这段代码是用来实现 AdaBoost 算法在分类问题上的可视化和分析。

  1. 模块导入和数据生成

    • 导入所需的库和模块,生成了一个圆环形状的数据集 (make_circles),用于二分类任务。
  2. 数据可视化

    • 使用 matplotlib 在一个图形中展示了生成的样本数据分布情况,其中不同类别的样本用不同颜色和形状的点表示。
  3. AdaBoost 分类器初始化和训练

    • 初始化了一个基础决策树分类器 (DecisionTreeClassifier) 作为 AdaBoost 的基学习器 (dt_stump)。
    • 使用 ensemble.AdaBoostClassifier 初始化 AdaBoost 分类器,并进行训练 (adaBoost.fit(X, Y))。
  4. 训练误差的迭代可视化

    • 创建了一个子图展示了随着迭代次数增加,AdaBoost 在训练集上的误差变化 (adaBoostErr)。
  5. 样本权重调整

    • 创建了一个大图 (fig),在多个子图中展示了在不同迭代次数下,权重高的样本点的分布情况。
    • 对于每个迭代步骤,根据 AdaBoost 的表现调整样本的权重,将权重高的样本以更大的大小和特定的颜色表示,以突出它们对分类器的重要性。
  6. 代码作用

    • 生成二维非线性分类数据集。
    • 使用 AdaBoost 算法进行训练,并监控训练误差随着迭代次数的变化。
    • 可视化不同迭代步骤下样本的分布情况,突出对分类器贡献大的样本。
  7. 保存结果

    • 最终将生成的图形保存为 4.png 文件,以便进一步分析和展示。

这段代码通过可视化展示了 AdaBoost 算法如何通过迭代,调整样本权重并提高分类器性能,适用于理解和教学机器学习中的集成学习方法。

#本章需导入的模块
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings(action = 'ignore')
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False
from sklearn.model_selection import train_test_split,KFold,cross_val_score
from sklearn import tree
import sklearn.linear_model as LM
from sklearn import ensemble
from sklearn.datasets import make_classification,make_circles,make_regression
from sklearn.metrics import zero_one_loss,r2_score,mean_squared_error,accuracy_score
import xgboost as xgb

N=800
X,Y=make_circles(n_samples=N,noise=0.2,factor=0.5,random_state=123)
unique_lables=set(Y)
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(15,6))
colors=plt.cm.Spectral(np.linspace(0,1,len(unique_lables)))
markers=['o','*']
for k,col,m in zip(unique_lables,colors,markers):
    x_k=X[Y==k]
    #plt.plot(x_k[:,0],x_k[:,1],'o',markerfacecolor=col,markeredgecolor="k",markersize=8)
    axes[0].scatter(x_k[:,0],x_k[:,1],color=col,s=30,marker=m)
axes[0].set_title('%d个样本观测点的分布情况'%N)
axes[0].set_xlabel('X1')
axes[0].set_ylabel('X2')
dt_stump = tree.DecisionTreeClassifier(max_depth=1, min_samples_leaf=1)
B=500
adaBoost = ensemble.AdaBoostClassifier(base_estimator=dt_stump,n_estimators=B,algorithm="SAMME",random_state=123)
adaBoost.fit(X,Y)
adaBoostErr = np.zeros((B,))
for b,Y_pred in enumerate(adaBoost.staged_predict(X)):
    adaBoostErr[b] = zero_one_loss(Y,Y_pred)
axes[1].plot(np.arange(B),adaBoostErr,linestyle='-')
axes[1].set_title('迭代次数与训练误差')
axes[1].set_xlabel('迭代次数')
axes[1].set_ylabel('训练误差')

fig = plt.figure(figsize=(15,12))
data=np.hstack((X.reshape(N,2),Y.reshape(N,1)))
data=pd.DataFrame(data)
data.columns=['X1','X2','Y']
data['Weight']=[1/N]*N
for b,Y_pred in enumerate(adaBoost.staged_predict(X)):
    data['Y_pred']=Y_pred    
    data.loc[data['Y']!=data['Y_pred'],'Weight'] *= (1.0-adaBoost.estimator_errors_[b])/adaBoost.estimator_errors_[b]
    if b in [5,10,20,450]:        
        axes = fig.add_subplot(2,2,[5,10,20,450].index(b)+1) 
        for k,col,m in zip(unique_lables,colors,markers):
            tmp=data.loc[data['Y']==k,:]
            tmp['Weight']=10+tmp['Weight']/(tmp['Weight'].max()-tmp['Weight'].min())*100
            axes.scatter(tmp['X1'],tmp['X2'],color=col,s=tmp['Weight'],marker=m) 
            axes.set_xlabel('X1')
            axes.set_ylabel('X2')
            axes.set_title("高权重的样本观测点(迭代次数=%d)"%b)

plt.savefig("../4.png", dpi=500)            

运行结果如下图所示: 

 6dee3dd5f9c44f1d832ac13ef9b04b7f.png7d47d52586db49658859a54d21ce67b4.png

04-AdaBoost回归树在不同损失函数下的误差变化

这部分代码是在Python环境下使用Scikit-Learn进行AdaBoost回归树模型的实验和结果可视化。让我来逐步解释:

  1. 导入模块

    • 导入了常用的数据处理(NumPy、Pandas)、警告管理、绘图(Matplotlib)、机器学习模型相关的库(Scikit-Learn)、XGBoost等模块。
  2. 生成数据

    • 使用make_regression生成了1000个样本,每个样本包含10个特征,并将数据分为训练集(70%)和测试集(30%)。
  3. 定义AdaBoost模型参数

    • B=300:设定弱学习器的数量为300。
    • dt_stump:定义了一个决策树回归模型作为基础估计器,限定了最大深度为1,叶子节点最小样本数为1。
  4. 损失函数设置

    • 定义了三种损失函数的名称(中文)和对应的英文名,以及绘图时使用的线型。
  5. 循环绘制学习曲线

    • 对每种损失函数,循环进行如下操作:
      • 创建一个AdaBoost回归器(ensemble.AdaBoostRegressor),使用前面定义的决策树回归器作为基础模型,设定300个弱学习器,指定损失函数。
      • 在训练集上拟合AdaBoost模型,并使用staged_predict方法获取每个阶段(每个弱学习器)的预测结果。
      • 计算每个阶段的训练误差(1 - R^2分数)和测试误差,并保存在TrainErrAdaBTestErrAdaB数组中。
      • 绘制训练误差曲线和测试误差曲线,使用不同的线型区分不同损失函数。
  6. 绘图设置

    • 设置图形的标题、横轴标签、纵轴标签,添加图例,并保存为PNG格式的文件(4.png)。

这段代码的目的是比较不同损失函数在AdaBoost回归树中的表现,通过绘制训练误差和测试误差随弱模型数量变化的曲线,来评估不同损失函数对模型性能的影响。

#本章需导入的模块
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings(action = 'ignore')
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False
from sklearn.model_selection import train_test_split,KFold,cross_val_score
from sklearn import tree
import sklearn.linear_model as LM
from sklearn import ensemble
from sklearn.datasets import make_classification,make_circles,make_regression
from sklearn.metrics import zero_one_loss,r2_score,mean_squared_error,accuracy_score
import xgboost as xgb

N=1000
X,Y=make_regression(n_samples=N,n_features=10,random_state=123)
X_train, X_test, Y_train, Y_test = train_test_split(X,Y,train_size=0.70, random_state=123)

B=300
dt_stump = tree.DecisionTreeRegressor(max_depth=1, min_samples_leaf=1)
Loss=['linear', 'square', 'exponential']
LossName=['线性损失','平方损失','指数损失']
Lines=['-','-.','--']
plt.figure(figsize=(9,6))
for lossname,loss,lines in zip(LossName,Loss,Lines):
    TrainErrAdaB=np.zeros((B,))
    TestErrAdaB=np.zeros((B,))
    adaBoost = ensemble.AdaBoostRegressor(base_estimator=dt_stump,n_estimators=B,loss=loss,random_state=123)
    adaBoost.fit(X_train,Y_train)
    for b,Y_pred in enumerate(adaBoost.staged_predict(X_train)):
        TrainErrAdaB[b]=1-r2_score(Y_train,Y_pred) 
    for b,Y_pred in enumerate(adaBoost.staged_predict(X_test)):
        TestErrAdaB[b]=1-r2_score(Y_test,Y_pred)
    plt.plot(np.arange(B),TrainErrAdaB,linestyle=lines,label="%s(训练)"%lossname,linewidth=0.8)
    plt.plot(np.arange(B),TestErrAdaB,linestyle=lines,label="%s(测试)"%lossname,linewidth=2)
plt.title("AdaBoost回归树在不同损失函数下的误差变化",fontsize=15)
plt.xlabel("弱模型个数",fontsize=12)
plt.ylabel("误差",fontsize=12)
plt.legend()
plt.savefig("../4.png", dpi=500)  

 运行结果如下图所示:

92c8e85570054740bc31636105ea873c.png

05-基于模拟数据对比梯度提升算法和提升策略回归树的预测性能

这部分代码是在Python环境下使用Scikit-Learn进行梯度提升回归树(Gradient Boosting Regression Trees)和AdaBoost回归树的实验和结果可视化。让我来逐步解释:

  1. 导入模块

    • 导入了常用的数据处理(NumPy、Pandas)、警告管理、绘图(Matplotlib)、机器学习模型相关的库(Scikit-Learn)、XGBoost等模块。
  2. 生成数据

    • 使用make_regression生成了1000个样本,每个样本包含10个特征,并将数据分为训练集(70%)和测试集(30%)。
  3. 定义AdaBoost回归树参数

    • B=300:设定弱学习器的数量为300。
    • dt_stump:定义了一个决策树回归模型作为基础估计器,限定了最大深度为1,叶子节点最小样本数为1。
  4. 拟合和评估AdaBoost回归树

    • 创建一个AdaBoost回归器(ensemble.AdaBoostRegressor),使用前面定义的决策树回归器作为基础模型,设定300个弱学习器,指定损失函数为平方损失。
    • 在训练集上拟合AdaBoost模型,并使用staged_predict方法获取每个阶段(每个弱学习器)的预测结果。
    • 计算每个阶段的训练误差(1 - R^2分数)和测试误差,并保存在TrainErrAdaBTestErrAdaB数组中。
  5. 拟合和评估梯度提升回归树

    • 创建两个梯度提升回归器:一个使用最大深度为1,另一个使用最大深度为3。
    • 使用与AdaBoost回归树相同的步骤,在训练集和测试集上拟合和评估模型。
  6. 绘图

    • 使用plt.plot函数绘制三条曲线,分别代表AdaBoost回归树的训练误差、测试误差,以及两个梯度提升回归树的训练误差和测试误差。
    • 使用不同的线型区分不同的模型。
#本章需导入的模块
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings(action = 'ignore')
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False
from sklearn.model_selection import train_test_split,KFold,cross_val_score
from sklearn import tree
import sklearn.linear_model as LM
from sklearn import ensemble
from sklearn.datasets import make_classification,make_circles,make_regression
from sklearn.metrics import zero_one_loss,r2_score,mean_squared_error,accuracy_score
import xgboost as xgb
pd.set_option('display.max_columns', None)    # 显示所有列
pd.set_option('display.max_rows', None)      # 显示所有行
pd.set_option('display.max_colwidth',1000)

N=1000
X,Y=make_regression(n_samples=N,n_features=10,random_state=123)
X_train, X_test, Y_train, Y_test = train_test_split(X,Y,train_size=0.70, random_state=123)

B=300
dt_stump = tree.DecisionTreeRegressor(max_depth=1, min_samples_leaf=1)
TrainErrAdaB=np.zeros((B,))
TestErrAdaB=np.zeros((B,))
adaBoost = ensemble.AdaBoostRegressor(base_estimator=dt_stump,n_estimators=B,loss= 'square',random_state=123)
adaBoost.fit(X_train,Y_train)
for b,Y_pred in enumerate(adaBoost.staged_predict(X_train)):
    TrainErrAdaB[b]=1-r2_score(Y_train,Y_pred) 
for b,Y_pred in enumerate(adaBoost.staged_predict(X_test)):
    TestErrAdaB[b]=1-r2_score(Y_test,Y_pred) 

GBRT=ensemble.GradientBoostingRegressor(loss='ls',n_estimators=B,max_depth=1,min_samples_leaf=1,random_state=123)
GBRT.fit(X_train,Y_train)
TrainErrGBRT=np.zeros((B,))
TestErrGBRT=np.zeros((B,))
for b,Y_pred in enumerate(GBRT.staged_predict(X_train)):
    TrainErrGBRT[b]=1-r2_score(Y_train,Y_pred)
for b,Y_pred in enumerate(GBRT.staged_predict(X_test)):
    TestErrGBRT[b]=1-r2_score(Y_test,Y_pred) 

GBRT0=ensemble.GradientBoostingRegressor(loss='ls',n_estimators=B,max_depth=3,min_samples_leaf=1,random_state=123)
GBRT0.fit(X_train,Y_train)
TrainErrGBRT0=np.zeros((B,))
TestErrGBRT0=np.zeros((B,))
for b,Y_pred in enumerate(GBRT0.staged_predict(X_train)):
    TrainErrGBRT0[b]=1-r2_score(Y_train,Y_pred) 
for b,Y_pred in enumerate(GBRT0.staged_predict(X_test)):
    TestErrGBRT0[b]=1-r2_score(Y_test,Y_pred) 

plt.plot(np.arange(B),TrainErrAdaB,linestyle='--',label="AdaBoost回归树(训练)",linewidth=0.8)
plt.plot(np.arange(B),TestErrAdaB,linestyle='--',label="AdaBoost回归树(测试)",linewidth=2)
plt.plot(np.arange(B),TrainErrGBRT,linestyle='-',label="梯度提升回归树(训练)",linewidth=0.8)
plt.plot(np.arange(B),TestErrGBRT,linestyle='-',label="梯度提升回归树(测试)",linewidth=2)
plt.plot(np.arange(B),TrainErrGBRT0,linestyle='-.',label="复杂梯度提升回归树(训练)",linewidth=0.8)
plt.plot(np.arange(B),TestErrGBRT0,linestyle='-.',label="复杂梯度提升回归树(测试)",linewidth=2)
plt.title("梯度提升回归树和AdaBoost回归树")
plt.xlabel("弱模型个数")
plt.ylabel("误差")
plt.legend()
plt.savefig("../4.png", dpi=500)

 运行结果如下图所示: 

4567ba1fd30b47a090d95aea385f90f7.png

06-基于空气质量监测数据,采用集成学习的不同策略预测空气质量等级

这段代码是一个机器学习模型比较与可视化的示例,主要用于空气质量等级的预测和模型评估。

  1. 导入模块和数据加载

    • 首先导入了必要的Python库和模块,包括数据处理、模型建立和评估需要的工具。
    • 加载了名为’北京市空气质量数据.xlsx’的Excel文件,将其转换为DataFrame格式,并进行了预处理:将所有值为0的数据替换为NaN,并删除包含NaN值的行。
  2. 数据准备和划分

    • 从处理后的数据中选择特征变量和目标变量(质量等级)。
    • 使用train_test_split函数将数据集划分为训练集(70%)和测试集(30%),并设置了随机种子以保证结果的可复现性。
  3. AdaBoost分类器

    • 使用AdaBoostClassifier集成方法,基础分类器为DecisionTreeClassifier,迭代次数为B(此处设定为300)。
    • 计算每次迭代后的测试误差(zero_one_loss)并存储在TestErrAdaB数组中。
  4. 梯度提升分类树(GBRT)

    • 使用GradientBoostingClassifier,设定了损失函数(‘deviance’)、迭代次数B、树的最大深度和叶子节点的最小样本数等参数。
    • 同样计算每次迭代后的测试误差并存储在TestErrGBRT数组中。
  5. Bagging和随机森林分类器

    • 使用BaggingClassifierRandomForestClassifier,基础分类器均为DecisionTreeClassifier
    • 分别计算每个集成中不同数量基础分类器(从1到B)后的测试误差,并存储在TestErrBagTestErrRF数组中。
  6. 可视化

    • 利用Matplotlib库绘制四种集成方法在不同迭代次数下的测试误差曲线。
    • 设置图表的标题、坐标轴标签和图例,以及保存生成的图像文件到当前工作目录的上层目录(‘…/4.png’)。

总体来说,这段代码展示了如何使用Python中的sklearn库进行集成学习模型(AdaBoost、梯度提升、Bagging和随机森林)的建模、评估和可视化过程,用于预测北京市空气质量等级,并通过测试误差来比较各模型的表现。

#本章需导入的模块
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings(action = 'ignore')
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False
from sklearn.model_selection import train_test_split,KFold,cross_val_score
from sklearn import tree
import sklearn.linear_model as LM
from sklearn import ensemble
from sklearn.datasets import make_classification,make_circles,make_regression
from sklearn.metrics import zero_one_loss,r2_score,mean_squared_error,accuracy_score
import xgboost as xgb

data=pd.read_excel('北京市空气质量数据.xlsx')
data=data.replace(0,np.NaN)
data=data.dropna()
X=data.iloc[:,3:-1]
Y=data['质量等级']
Y=Y.map({'优':'1','良':'2','轻度污染':'3','中度污染':'4','重度污染':'5','严重污染':'6'})
X_train, X_test, Y_train, Y_test = train_test_split(X,Y,train_size=0.70, random_state=123)

B=300
dt_stump = tree.DecisionTreeClassifier(max_depth=3, min_samples_leaf=1)
TestErrAdaB=np.zeros((B,))
adaBoost = ensemble.AdaBoostClassifier(base_estimator=dt_stump,n_estimators=B,random_state=123)
adaBoost.fit(X_train,Y_train)
for b,Y_pred in enumerate(adaBoost.staged_predict(X_test)):
    TestErrAdaB[b]=zero_one_loss(Y_test,Y_pred) 

TestErrGBRT=np.zeros((B,))
GBRT=ensemble.GradientBoostingClassifier(loss='deviance',n_estimators=B,max_depth=3,min_samples_leaf=1,random_state=123)
GBRT.fit(X_train,Y_train)
for b,Y_pred in enumerate(GBRT.staged_predict(X_test)):
    TestErrGBRT[b]=zero_one_loss(Y_test,Y_pred) 

TestErrBag=np.zeros((B,)) 
TestErrRF=np.zeros((B,))
for b in np.arange(B):
    Bag=ensemble.BaggingClassifier(base_estimator=dt_stump,n_estimators=b+1,oob_score=True,random_state=123,bootstrap=True)
    Bag.fit(X_train,Y_train)
    TestErrBag[b]=1-Bag.score(X_test,Y_test)
    RF=ensemble.RandomForestClassifier(max_depth=3,n_estimators=b+1,oob_score=True,random_state=123,
                                       bootstrap=True,max_features="auto")
    RF.fit(X_train,Y_train)
    TestErrRF[b]=1-RF.score(X_test,Y_test)

    
plt.figure(figsize=(6,4))
plt.plot(np.arange(B),TestErrAdaB,linestyle='--',label="AdaBoost分类树",linewidth=1)
plt.plot(np.arange(B),TestErrGBRT,linestyle='-',label="梯度提升分类树",linewidth=2)
plt.plot(np.arange(B),TestErrBag,linestyle='-.',label="Bagging分类树",linewidth=2)
plt.plot(np.arange(B),TestErrRF,linestyle='-.',label="随机森林分类",linewidth=1)
plt.title("空气质量等级的预测",fontsize=12)
plt.xlabel("迭代次数",fontsize=12)
plt.ylabel("测试误差",fontsize=12)
plt.legend()  
plt.savefig("../4.png", dpi=500)

 运行结果如下图所示:

c0ab510ddaf248c9a5eaa39b58a5dc19.png

总结

总结:这些模型各有特点,选择适当的模型取决于数据特性、问题复杂度以及对预测性能和解释性的需求。在实际应用中,通常需要通过交叉验证等方法来评估和比较它们的性能。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1833836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端学习笔记100篇之002:Webpack简明教程(持续完善中)

文章目录 1. **安装和初始化**2. **创建和配置入口文件**3. **编写和配置Webpack配置文件**4. **打包和运行项目** Webpack是一个静态模块打包工具&#xff0c;适用于前端项目构建和模块化开发。Webpack通过从入口文件构建依赖图&#xff0c;然后打包相关的模块&#xff0c;最终…

什么是小语言模型?

介绍 近年来&#xff0c;人工智能领域取得了重大进展&#xff0c;尤其是在自然语言处理领域。GPT-3 和 PaLM 等大型语言模型因其出色的能力而备受关注&#xff0c;新一波小型语言模型正在兴起&#xff0c;它们在性能和效率之间提供了有希望的平衡。 什么是小语言模型&#xf…

[AIGC] 图论基础入门

图论是数学的一个分支&#xff0c;旨在研究图&#xff08;graph&#xff09;的属性和应用。这是一个跨学科领域&#xff0c;因为图论可以用于描述和解决各种实际问题。如社交网络分析&#xff0c;电脑网络&#xff0c;生物网络等。 文章目录 什么是图&#xff1f;图的基本性质L…

应急便携式气象观测站

TH-BQX5自然灾害&#xff0c;如台风、暴雨、洪涝、干旱等&#xff0c;给人们的生命财产安全带来了巨大威胁。在应对这些灾害时&#xff0c;准确的气象观测数据是制定有效应对策略的基础。近年来&#xff0c;应急便携式气象观测站在自然灾害的监测和预警中发挥了越来越重要的作用…

python GUI开发: tkinter选项卡,移动滑块,颜色选择框,文本对话框,对话输入框,通用消息框模块用法详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Vue57-组件的自定义事件_解绑

给谁绑的自定义事件&#xff0c;就找谁去触发&#xff1b;给谁绑的自定义事件&#xff0c;就找谁去解绑&#xff1b; 一、解绑自定义事件 1-1、解绑一个自定义事件 到student.vue组件中去解绑。 1-2、解绑多个自定义事件 使用数组来解绑多个。 1-3、解绑所有的自定义事件 二、…

Linux-远程访问及控制

一、SSH远程管理 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令。与早期的 Telent&#xff08;远程登录…

计算机毕业设计Python+Vue.js知识图谱音乐推荐系统 音乐爬虫可视化 音乐数据分析 大数据毕设 大数据毕业设计 机器学习 深度学习 人工智能

开发技术 协同过滤算法、机器学习、LSTM、vue.js、echarts、django、Python、MySQL 创新点协同过滤推荐算法、爬虫、数据可视化、LSTM情感分析、短信、身份证识别 补充说明 适合大数据毕业设计、数据分析、爬虫类计算机毕业设计 介绍 音乐数据的爬取&#xff1a;爬取歌曲、…

DFS 迷宫

个人感觉DFS没有递归那么烧脑 简单迷宫 如何接受二维数组 先构建A[MAXN][MAXN]&#xff0c;人后二重循环 #include <iostream> #include <vector> #include <cmath> #include <string> #include <cstring> using namespace std; const int N…

Ubuntuwin11双系统

一、准备工作 win11与ubuntu20.4双系统安装案例教程,先查看引导模式参数不服则不要安装否则会报异常 查看BIOS引导模式 查看磁盘分区格式 下载Ubuntu镜像 所有版本下载地址,我的华为云镜像ubuntu20.4这个版本地址

【ComfyUI】Stable Diffusion 3 加Controlnet

基于 instantX-research/diffusers_sd3_control: &#x1f917; Diffusers: State-of-the-art diffusion models for image and audio generation in PyTorch and FLAX. (github.com) 和 ZHO-ZHO-ZHO/ComfyUI-SD3-Medium-CN-Diffusers: ComfyUI SD3-Medium ControlNet&#…

HTTPS原理详解新版

http和https区别 附注&#xff1a; &#xff08;1&#xff09;SSL和TLS其实是一个东西&#xff1b; &#xff08;2&#xff09;完整性通过摘要和原文按照一定算法比对 Https的工作流程 加密算法 数据完整性 Https性能优化

强大的api管理系统Storm Core API_V1.1免授权源码

强大的api管理系统Storm Core API_V1.1免授权源码&#xff0c;带用户key和ip白名单功能 可设置付费操作等 更新日志 此次更新功能比较多 1.完善个人中心页面 2.完善注册登录页面 3.完善key功能 4.增加ip白名单功能 5.以及一些其他小小的美化 6.模板dxx的图片可单个自定…

uniapp 微信小程序更改轮播图指示点

仅微信小程序有效 /* #ifdef MP-WEIXIN */// 默认指示点样式wx-swiper .wx-swiper-dot {position: relative;background-color: #ffffff;width: 28rpx;border-radius: 10rpx;height: 8rpx;opacity: 0.4;}// 当前选中样式wx-swiper .wx-swiper-dot-active {background-color: #f…

Avalonia for VSCode

1、在VSCode中编辑AvaloniaUI界面&#xff0c;在VSCode中搜索Avalonia&#xff0c;并安装。如下图&#xff0c;可以发现Avalonia for VSCode还是预览版。 2、 创建一个Avalonia 项目。 选择项目类型 输入项目名称 选择项目所在文件夹 打开项目 3、项目架构如下图。 4、builde…

记一次线上jVM调优

文章目录 问题描述问题分析尝试优化业务代码优化方案修改后代码补充点 问题描述 部门调整&#xff0c;接手一个新项目&#xff0c;为方便后续描述叫user-web&#xff0c;随后推动IT降本&#xff0c;要求根据实际业务量调整服务器实例数量和配置&#xff0c;调整前服务器配置为…

docker命令docker desktop 安装 xiaomimi8/awvs14-log4j-2022 详细图文教程

docker命令docker desktop 安装 xiaomimi8/awvs14-log4j-2022 详细图文教程 1. 拉取镜像 通过命令拉取 # 拉取镜像 docker pull xiaomimi8/awvs14-log4j-2022 # 查看镜像 docker images通过doker desktop直接查看镜像 2. 启动镜像 通过命令启动 docker run -it -d -p 13…

SpringBoot购物网站

摘要 随着信息技术的高速发展&#xff0c;二十一世纪的网络技术和网络应用正在快速融入人们的生活&#xff0c;并且由于网络服务以及网络应用日渐普及&#xff0c;人们对于现在生活的需求也随之增长&#xff0c;而网上购物的便捷对人们的吸引力越来越大&#xff0c;购物网站可…

阿里云 邮件系统DNS域名解析 搭配 postfix+dovecot 邮件服务器

1 创建邮箱域名A记录(一般邮箱客户端&#xff0c;增加pop,imap,stmp 3条记录) 登录阿里云控制台--云解析DNS 2 MX记录 3 SPF记录

STM32高级控制定时器(STM32F103):PWM输出模式

目录 概述 1 PWM模式介绍 2 PWM类型 2.1 PWM边缘对齐模式 2.2 PWM中心对齐模式 3 使用STM32Cube配置PWM 3.1 STM32Cube配置参数 3.2 生成Project 4 设置PWM占空比 4.1 函数介绍 4.3 函数源码 5 测试代码 5.1 编写测试代码 5.2 函数源码 6 运行代码 概述 本文主…