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)
结果
预测结果与真实标签的对比
单一学习器和Bagging对比
- RSM学习器
- 基学习器
由于RSM的输出使用的是简单平均法,误差反而比基学习器更大,后续会优化基学习器结果的集成策略