
文章插图
3.1第一轮3.1.2gini系数的计算此处计算的X[i]的值也就是v的值
w1=np.full(shape=10,fill_value=https://www.huyubaike.com/biancheng/0.1)#初始的样本权重cond=y ==1 #类别1条件p1 = w1[cond].sum()p2= 1-p1display(p1,p2)gini=p1*(1-p1)+p2*(1-p2)
上图可知第一棵树的X[0]=2.5的由来方式如下代码如实现gini_result=[]best_split={}#最佳分裂条件,X[0]<=2.5lower_gini = 1#比较for i in range(len(X)-1):#数组下标从0到9,10个数据一共要切九刀split=X[i:i+2].mean()#裂开条件,就是假如一开始要将0和1裂开并取出cond=(X<=split).ravel()#变成一维的,左边数据left=y[cond]right=y[~cond]#取反#左右两边的gini系数gini_left=0gini_right=0for j in np.unique(y):#y表示类别p_left=(left==j).sum()/left.size#计算左边某个类别的概率gini_left=p_left*(1-p_left)p_right=(right==j).sum()/right.size#计算右边某个类别的概率gini_right=p_right*(1-p_right)#左右两边的gini系数合并left_p=cond.sum()/cond.sizeright_p=1-left_pcgini=gini_left*left_p + gini_right*right_pgini_result.append(gini)if gini <lower_gini:lower_gini=ginibest_split.clear()best_split['X[0]<=']=splitprint(gini_result)print(best_split)
3.1.3求误差y1_=model[0].predict(X)#由v得到的预测结果小于v为1,大于v为-1error1=(y!=y1_).mean()#求出预测值与实际值不相等元素的个数,并求平均

文章插图
3.1.4计算第一个若学习器的权重

文章插图
alpha_1=1/2*np.log((1-error1)/error1)

文章插图
3.1.5 跟新样本权重
#上一次权重的基础上进行跟新#y表示真是的目标值#ht(X)表示当前若学习器预测的结果w2= w1*np.exp(-y*y1_*alpha_1)w2=w2/w2.sum()#权重的归一化操作,和正好是1display(w1,w2)display(y,y1_)
由下方运行结果可知当预测结果与原数据不相同时,该样本对应的权值也会随之增大;反之若预测正确则权值会减小
文章插图
3.2第二轮的计算也即第二课数的计算
cond=y==-1np.round(w2[cond].sum(),3)#找到类别为-1的所有权值的和 , 四舍五入保留3位小数

文章插图
cond2=y==1np.round(w2[cond2].sum(),3)

文章插图
3.2.1 gini系数的计算
cond=y ==1 #类别1条件p1 = w2[cond].sum()#使用新的样本权重分布p2= 1-p1display(p1,p2)gini=p1*(1-p1)+p2*(1-p2)

文章插图
3.2.2拆分的条件
gini_result=[]best_split={}#最佳分裂条件,X[0]<=8.5lower_gini = 1#比较for i in range(len(X)-1):#数组下标从0到9,10个数据一共要切九刀split=X[i:i+2].mean()#裂开条件,就是假如一开始要将0和1裂开并取出cond=(X<=split).ravel()#变成一维的,左边数据left=y[cond]right=y[~cond]#取反#left_p=cond.sum()/cond.size#这种方式计算概率适用于每个样本的权重一样left_p = w2[cond]/w2[cond].sum()#归一化,左侧每个样本在自己组内的概率right_p=w2[~cond]/w2[~cond].sum()#归一化 , 右侧每个样本在自己组内概率#左右两边的gini系数gini_left=0gini_right=0for j in np.unique(y):#y表示类别cond_left=left==j#左侧某个类别p_left=left_p[cond_left].sum()#计算左边某个类别的概率gini_left += p_left*(1-p_left)cond_right=right==j#右侧某个类别p_right=right_p[cond_right].sum()#计算右边某个类别的概率gini_right += p_right*(1-p_right)#左右两边的gini系数合并p1=cond.sum()/cond.size#左侧划分数据所占的比例p2=1-p1#右侧划分数据所占的比例gini=gini_left*p1 +gini_right*p2gini_result.append(gini)if gini <lower_gini:lower_gini=ginibest_split.clear()best_split['X[0]<=']=splitprint(gini_result)print(best_split)

文章插图
3.2.3计算误差
y2_ = model[1].predict(X)#根据求出来的v得到预测的结果error2=((y != y2_)*w2).sum()error2

文章插图
3.2.4计算第二个弱学习器权重
alpha_2=1/2*np.log((1-error2)/error2)alpha_2
推荐阅读
- Pytorch模型量化
- 三 【单片机入门】应用层软件开发的单片机学习之路-----UART串口通讯和c#交互
- 二 【SSM】学习笔记——SpringMVC入门
- 盘它!基于CANN的辅助驾驶AI实战案例,轻松搞定车辆检测和车距计算!
- 四十六 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-环境搭建
- Briefings in Bioinformatics-2021 知识图谱-生物信息学-医学顶刊论文:生物信息学中的图表示学习:趋势、方法和应用
- Ansible 批处理实战
- ansible应用之安装elk框架
- 4 .NET 6学习笔记——如何在.NET 6的Desktop App中使用Windows Runtime API
- 学习ASP.NET Core Blazor编程系列八——数据校验