机器学习实战-AdaBoost( 三 )

机器学习实战-AdaBoost

文章插图
3.2.5跟新样本权重#上一次权重的基础上进行更新#y表示真是的目标值#ht(X)表示当前若学习器预测的结果w3= w2*np.exp(-y*y2_*alpha_2)w3=w3/w3.sum()#权重的归一化操作,和正好是1display(w2,w3)display(y,y2_)
机器学习实战-AdaBoost

文章插图
3.3第三轮计算3.3.1 gini系数cond=y ==1 #类别1条件p1 = w3[cond].sum()#使用新的样本权重分布p2= 1-p1display(p1,p2)gini=p1*(1-p1)+p2*(1-p2)gini
机器学习实战-AdaBoost

文章插图
3.3.2拆分条件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]#取反#left_p=cond.sum()/cond.size#这种方式计算概率适用于每个样本的权重一样left_p = w3[cond]/w3[cond].sum()#归一化,左侧每个样本在自己组内的概率right_p=w3[~cond]/w3[~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)
机器学习实战-AdaBoost

文章插图
3.3.3计算误差y3_ = model[2].predict(X)#根据求出来的v得到预测的结果error3=((y != y3_)*w3).sum()error3
机器学习实战-AdaBoost

文章插图
3.3.4计算第三个弱学习器权重alpha_3=1/2*np.log((1-error3)/error3)alpha_3
机器学习实战-AdaBoost

文章插图
3.3.5跟新权重#上一次权重的基础上进行更新#y表示真是的目标值#ht(X)表示当前若学习器预测的结果w4= w3*np.exp(-y*y3_*alpha_3)w4=w4/w4.sum()#权重的归一化操作 , 和正好是1display(w3,w4)display(y,y3_)
机器学习实战-AdaBoost

文章插图
3.4弱学习器的聚合print("每一个弱分类器的预测结果:")display(y1_,y2_,y3_)#F 表示聚合各个弱学习器的评分F=alpha_1*y1_ + alpha_2*y2_ + alpha_3*y3_#将多个弱分类器,整合,变成了强分类器F(X)print("强分类器合并结果:\n",F)#根据得到的最终的F,如果i大于0就是1,否则就是-1,就像把最终的结果放进符号函数中print("强分类器最终结果如下:\n",np.array([1 if i > 0 else -1 for i in F]))print("算法预测结果为:\n",model.predict(X))
机器学习实战-AdaBoost

文章插图
【机器学习实战-AdaBoost】

推荐阅读