ML12 My_RSM_Of_Linear

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

  • 使用了sklearn自带的波士顿房价数据集
  • 由于自身电脑条件不足,虽然RSM是并行的,但是在实验中采用了依次训练各个基学习器的方法,因此运行时间较长

代码实现

RSM类
import numpy as np
from Linear_class import LinearRegression
import sys

np.set_printoptions(suppress=True)

class RSM:
    def __init__(self,x,y,T=5):
        '''
        :param x:训练集
        :param y:数据标签
        :param T:基学习器数量
        :param Base:基学习器列表
        :param sub_D:每个基学习器的特征子空间
        :param d:原始数据集的特征数
        '''
        self.x=x
        self.y=y
        self.d=len(x[0])
        self.Base = []
        self.sub_D = []
        self.T=T

    def random_subspace(self,sub_d):
        #随机选取sub_d个子属性
        index=np.random.choice(self.d, sub_d, replace=False)
        index=np.sort(index)
        return index

    def Base_init(self,sub_d):
        #基学习器初始化
        for i in range(self.T):
            index=self.random_subspace(sub_d)
            self.sub_D.append(index)
            self.Base.append(LinearRegression(self.x[:,index],self.y))

    def fit(self,sub_d=6,alpha=0.3,iter_count=500):
        #基学习器的参数拟合
        if sub_d>=len(self.x[0]):
            print('子空间特征过多,无法学习!')
            sys.exit(0)
        self.Base_init(sub_d)
        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[:,self.sub_D[i]])
        return y_predict/self.T
主函数
from RSM_class import RSM
import numpy as np
import sys
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_california_housing
import time

np.set_printoptions(suppress=True)

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

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

#构建RSM训练模型
rsm=RSM(x_train,y_train,5)
rsm.fit(100,0.9,4000)
y_predict=rsm.predict(x_test)
  
#画图,可视化输出
plt.figure(figsize=(20, 8), dpi=80)
plt.plot(X, y_test,label='real', color='yellow')
plt.scatter(X, y_test, color='blue')
plt.plot(X,y_predict,label='predict',color='green')
plt.scatter(X,y_predict,color='blue')
plt.legend(loc=[1, 0])
plt.savefig('E:\python\ml\ml by myself\Ensemble_Learning\RSM\RSM_Of_Linear.png')

sys.exit(0)

结果

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

ML12 My_RSM_Of_Linear

单一学习器和Bagging对比
  • RSM学习器

ML12 My_RSM_Of_Linear

  • 基学习器

ML12 My_RSM_Of_Linear

由于RSM的输出使用的是简单平均法,误差反而比基学习器更大,后续会优化基学习器结果的集成策略

上一篇:Mysql 官网下载二进制包_图解步骤


下一篇:.net:设计一个web应用