机器学习实战-AdaBoost( 三 )


机器学习实战-AdaBoost

文章插图
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)
机器学习实战-AdaBoost

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

文章插图
3.2.4计算第二个弱学习器权重alpha_2=1/2*np.log((1-error2)/error2)alpha_2
机器学习实战-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

文章插图

经验总结扩展阅读