ML11 My_Bagging_Of_Logistic

ML实战:手动实现Bagging集成学习

  • 使用了sklearn自带的乳腺癌数据集
  • 由于自身电脑条件不足,虽然Bagging是并行的,但是在实验中采用了依次训练各个基学习器的方法

代码实现

Bagging类
from Logistic_class import LogisticRegression
import numpy as np

np.set_printoptions(suppress=True)

class Bagging:
    def __init__(self,x=None,y=None,T=5):
        '''
        :param x: 数据集
        :param y: 数据标签
        :param T: 基学习器个数
        :param Base: 基学习器列表
        :param m: 数据集大小
        :param D: 每个基学习器的训练数据
        '''
        self.x=x
        self.y=y
        self.Base=[]
        self.D=[]
        self.m=len(self.x)
        self.T=T

    def bootstrap(self):
        #自助采样
        index=np.random.choice(self.m,size=self.m)
        return index

    def Random_Sampling(self):
        #用自主采样的数据训练基学习器
        for i in range(self.T):
            index=self.bootstrap()
            self.D.append(index)
            self.Base.append(LogisticRegression(self.x[index],self.y[index]))

    def fit(self,alpha=0.3,iter_count=500):
        #参数拟合
        self.Random_Sampling()
        for i in range(self.T):
            self.Base[i].fit(alpha,iter_count)

    def predict(self,x):
        #预测函数,简单投票法
        y_predict=np.zeros((len(x),1))
        for i in range(self.T):
           y_predict+=self.Base[i].predict(x)
        for i in range(len(x)):
            if y_predict[i]>0:
                y_predict[i]=1
            elif y_predict[i]<0:
                y_predict[i]=0
            else:
                y_predict[i]=np.random.choice([0, 1])

        return y_predict
主函数
from Bagging_class import Bagging
import numpy as np
import sys
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets

np.set_printoptions(suppress=True)

#获取数据集
x=datasets.load_breast_cancer().data
y=datasets.load_breast_cancer().target

#分割数据集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.1,random_state=np.random.randint(0,30))
X = np.arange(1, len(y_test) + 1)

#构建Bagging模型并训练
bagging=Bagging(x_train,y_train,5)
bagging.fit(10,3000)
y_predict=bagging.predict(x_test)

#画图,可视化输出
plt.figure(figsize=(15,4),dpi=80)
plt.scatter(X,y_test,label='real',marker='s',color='blue')
plt.scatter(X,y_predict,label='predict',marker='x',color='red')
plt.legend(loc=[1,0])
plt.grid(True,linestyle='--',alpha=0.5)
plt.yticks(y_test[::1])
plt.xticks(X[::1])
plt.xlabel('index of tests')
plt.ylabel('target')
plt.savefig('E:\python\ml\ml by myself\Ensemble_Learning\Bagging\Bagging_Of_Logistic.png')

sys.exit(0)

结果

预测结果与真实标签的对比

单一学习器和Bagging对比

在100次训练中,集成学习平均错误个数为3.26,而逻辑回归平均错误个数为4.18

posted @ 2021-10-22 19:09  MrDaddy  阅读(169)  评论(0)    收藏  举报