首页 > 编程语言 >24/8/11算法笔记AdaBoost多分类原理展示

24/8/11算法笔记AdaBoost多分类原理展示

时间:2024-08-12 22:22:49浏览次数:6  
标签:24 11 gini proba print train AdaBoost ada np

import numpy as np
from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import tree
import graphviz
加载数据
X,y = datasets.load_iris(return_X_y=True)

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state=1024)
建模
ada = AdaBoostClassifier(n_estimators=3,algorithm='SAMME',learning_rate=1.0)

ada.fit(X_train,y_train)#建模,学习

y_ = ada.predict(X_test)

proba_ = ada.predict_proba(X_test)
print('分类准确率',ada.score(X_test,y_test))
display(y_,proba_)

构建第一棵树

dot_data = tree.export_graphviz(ada[0],filled=True,rounded=True)
graphviz.Source(dot_data)

gini系数
w1 = np.full(shape = 120,fill_value = 1/120)#每个样本的类别

gini = 1

for i in range(3):#三类,0,1,2
    #计算每个类别的概率
    cond = y_train == i #判断类别
    
    p = w1[cond].sum()#这一类样本的权重
    
    gini-=p**2
print(gini)
0.6662499999999998
拆分条件
best_split = {}#放最佳裂分条件
lower_gini = 1 #判断最小的gini系数

#如何划分,分成两部分
for col in range(X_train.shape[1]):#4个特征,选哪个特征进行裂分
    for i in range(len(X_train)-1):#具体特征,选哪个裂分点
        
        X=X_train[:,col].copy()#取出某个特征
        X.sort()#排序,裂分点
        
        #切片,求平均值,裂分点
        split = X[i:i+2].mean()
        
        cond = (X_train[:,col]<=split).ravel()#条件判断
        
        
        left = y_train[cond]
        right = y_train[~cond]
        
        #左右两边的gini系数,分别计算
        gini_left = 0
        gini_right = 0
        
        for target in range(3):
            p1 = (left==target).sum()/left.size #左边类别的概率
            gini_left += p1*(1-p1)
        
            if right.size!=0:
                p2 = (right==target).sum()/right.size
                gini_right +=p2*(1-p2)
        left_p = w1[cond].sum()
        right_p = 1-left_p
        
        gini = left_p*gini_left +right_p*gini_right
        if gini<lower_gini:#根据某个裂分条件,计算的gini是不是最小
            lower_gini = gini
            best_split.clear()
            best_split['X[%d]'%(col)] = split
        elif gini ==lower_gini:
            best_split['X[%d]'%(col)] = split
print(best_split)        

计算误差率
y1_ = ada[0].predict(X_train)#预测结果

print(y1_)
e1 = ((y_train !=y1_)).mean()#误差
print('第一棵树误差率',e1)
print('算法的误差率',ada.estimator_errors_)

计算弱学习器权重

learning_rate = 1.0
num = 3#三分类

a1 = learning_rate * (np.log((1-e1)/e1)+np.log(num-1))

print('手动计算算法权重是',a1)

print('算法返回的分类器权重是',ada.estimator_weights_)

更新权重
w2 = w1*np.exp(a1 * (y_train!=y1_))
w2/= w2.sum()#归一化
w2

构建第二棵树
dot_data = tree.export_graphviz(ada[1],filled=True,rounded=True)
graphviz.Source(dot_data)

for i in range(3):
    cond = y_train ==i
    value = w2[cond].sum()
    print(np.round(value,3))

gini 系数
gini = 1

for i in range(3):#三类,0,1,2
    #计算每个类别的概率
    cond = y_train == i #判断类别
    
    p = w2[cond].sum()#这一类样本的权重
    
    gini-=p**2
print(np.round(gini,3))
0.5
best_split = {}#放最佳裂分条件
lower_gini = 1 #判断最小的gini系数

#如何划分,分成两部分
for col in range(X_train.shape[1]):#4个特征,选哪个特征进行裂分
    for i in range(len(X_train)-1):#具体特征,选哪个裂分点
        
        X=X_train[:,col].copy()#取出某个特征
        X.sort()#排序,裂分点
        
        #切片,求平均值,裂分点
        split = X[i:i+2].mean()
        
        cond = (X_train[:,col]<=split).ravel()#条件判断
        
        #左右两部分
        left = y_train[cond]
        left_w = w2[cond]/w2[cond].sum()#左侧内部权重分布
        
        right = y_train[~cond]
        right_w = w2[~cond]/w2[~cond].sum()#右侧内部权重分布
        
        #左右两边的gini系数,分别计算
        gini_left = 0
        
        gini_right = 0
        
        for target in range(3):
            cond1 = left ==target#类别判定条件
            p1 = left_w[cond1].sum()
            gini_left += p1*(1-p1)
            
            cond2 =right ==target
            p2 = right_w[cond2].sum()
            gini_right +=p2*(1-p2)
            
            
        left_p = w2[cond].sum()
        right_p = 1-left_p
        
        #整合左右两边的gini系数
        gini = left_p*gini_left +right_p*gini_right
        
        #标志判断最小的gini系数
        if gini<lower_gini:#根据某个裂分条件,计算的gini是不是最小
            lower_gini = gini
            best_split.clear()
            best_split['X[%d]'%(col)] = split
        elif gini ==lower_gini:
            best_split['X[%d]'%(col)] = split
print(best_split)        
{'X[2]': 4.75}
计算误差率
y2_ = ada[1].predict(X_train)#预测结果

print(y2_)
#e2 = ((y_train !=y2_)).mean()#误差

cond = y_train!=y2_
e2 = w2[cond].sum()

print('第一棵树误差率',e2)
print('算法的误差率',ada.estimator_errors_)

计算弱学习器权重
learning_rate = 1.0
num = 3#三分类

a2 = learning_rate * (np.log((1-e2)/e2)+np.log(num-1))

print('手动计算算法权重是',a2)

print('算法返回的分类器权重是',ada.estimator_weights_)
dot_data = tree.export_graphviz(ada[2],filled=True,rounded=True)
graphviz.Source(dot_data)

更新权重

w3 = w2*np.exp(a2 * (y_train!=y2_))
w3/=w3.sum()#归一化
w3

构建第三棵树

gini系数计算
gini = 1

for i in range(3):#三类,0,1,2
    #计算每个类别的概率
    
    cond = y_train== i #判断类别
    
    p = w3[cond].sum()#这一类样本的权重
    
    gini-=p**2
print(np.round(gini,3))
0.52
拆分条件
best_split = {}#放最佳裂分条件
lower_gini = 1 #判断最小的gini系数

#如何划分,分成两部分
for col in range(X_train.shape[1]):#4个特征,选哪个特征进行裂分
    for i in range(len(X_train)-1):#具体特征,选哪个裂分点
        
        X=X_train[:,col].copy()#取出某个特征
        X.sort()#排序,裂分点
        
        #切片,求平均值,裂分点
        split = X[i:i+2].mean()
        
        cond = (X_train[:,col]<=split).ravel()#条件判断
        
        #左右两部分
        left = y_train[cond]
        left_w = w3[cond]/w3[cond].sum()#左侧内部权重分布
        
        right = y_train[~cond]
        right_w = w3[~cond]/w3[~cond].sum()#右侧内部权重分布
        
        #左右两边的gini系数,分别计算
        gini_left = 0
        gini_right = 0
        
        for target in range(3):
            cond1 = left ==target#类别判定条件
            p1 = left_w[cond1].sum()
            gini_left += p1*(1-p1)
            
            cond2 =right ==target
            p2 = right_w[cond2].sum()
            gini_right +=p2*(1-p2)
            
            
        left_p = w3[cond].sum()
        right_p = 1-left_p
        
        #整合左右两边的gini系数
        gini = left_p*gini_left +right_p*gini_right
        
        #标志判断最小的gini系数
        if gini<lower_gini:#根据某个裂分条件,计算的gini是不是最小
            lower_gini = gini
            best_split.clear()
            best_split['X[%d]'%(col)] = split
        elif gini ==lower_gini:
            best_split['X[%d]'%(col)] = split
print(best_split)        

{'X[3]': 1.65}

y3_ = ada[2].predict(X_train)#预测结果

print(y3_)
#e2 = ((y_train !=y3_)).mean()#误差

cond = y_train!=y3_
e3 = w3[cond].sum()

print('第一棵树误差率',e3)
print('算法的误差率',ada.estimator_errors_)

计算弱学习器权重
learning_rate = 1.0
num = 3#三分类

a3 = learning_rate * (np.log((1-e3)/e3)+np.log(num-1))

print('手动计算算法权重是',a3)

print('算法返回的分类器权重是',ada.estimator_weights_)

概率计算
算法返回的概率
proba_= ada.predict_proba(X_test)[:5]

proba_
proba3 = (ada[2].predict(X_test) ==np.array([[0],[1],[2]])).T.astype(np.int8)
proba3

自己计算的概率
proba1= (ada[0].predict(X_test) ==np.array([[0],[1],[2]])).T.astype(np.int8)
proba1
proba2 = (ada[1].predict(X_test) ==np.array([[0],[1],[2]])).T.astype(np.int8)
proba2
proba3 = (ada[2].predict(X_test) ==np.array([[0],[1],[2]])).T.astype(np.int8)
proba3
proba = proba1 * a1 + proba2 * a2 + proba3 * a3
proba

归一化
proba /=ada.estimator_weights_.sum()
proba

proba /=(num-1)
proba

softmax概率
(np.exp(proba)/(np.exp(proba).sum(axis =1)).reshape(-1,1))[:5]

proba_[:20]

标签:24,11,gini,proba,print,train,AdaBoost,ada,np
From: https://blog.csdn.net/yyyy2711/article/details/141108123

相关文章

  • 2024.8.12
    ###2024.8.12【梦最让我费解的地方在于,明明你看不清梦里人们的脸,却清晰地知道他们是谁。】###Monday七月初九---##序理论###最小链覆盖&最长反链长度我们设定一个二元关系符R和一个集合A我们设定<a,r>这样一个类群,那么对于任意$a_i\inA,a_j\inA$,二元关系式$a......
  • 2024暑假集训测试23
    前言比赛链接。T2部分分给得特别足,\(60pts\),而且他不可能剩下的数据全放菊花,所以得到了\(76pts\),但赛时想了很长时间正解,没有想出来,给后面题剩的时间不多,就都胡暴力了,\(T4\)甚至忘了剪枝,剪完之后\(20pts\to60pts\)没绷住。说到这儿要吐槽一下T4数据水的离谱,什么高级......
  • 高级java每日一道面试题-2024年8月12日-设计模式篇-请列举出在JDK中几个常用的设计模
    如果有遗漏,评论区告诉我进行补充面试官:请列举出在JDK中几个常用的设计模式?我回答:在JavaDevelopmentKit(JDK)中,许多设计模式被广泛使用,以帮助实现软件的结构、行为和复用。下面是一些在JDK中常见的设计模式及其简要说明:工厂模式(FactoryPattern)JDK中的java......
  • 2024年新SCI顶刊算法红嘴蓝鹊优化器RBMO优化Transformer模型的多变量时间序列预测
    matlabR2024a以上一、数据集二、2024年新SCI顶刊算法红嘴蓝鹊优化器RBMO红嘴蓝鹊优化算法(Red-billedbluemagpieoptimizer,RBMO)是一种新型的元启发式算法(智能优化算法),灵感来源于红嘴蓝鹊的合作、高效的捕食行为。该成果由ShengweiFu等人于2024年5月发表在SCI顶......
  • 【闲话】08.12.24
    0812闲话头图:今日推歌:《苦若吞沙feat.诗岸》Zeno来吧bababalala旋转着眩晕着拥抱着过去的那一切全都bababalala只剩下空气还哭泣着来吧bababalala奔跑着跌倒了泥泞的用力的把一切全都bababalala只剩下我还在等什么太符合心境了有点不知......
  • 2024年“研究生科研素养提升”系列公益讲座在线测评答案
    2024年研究生科研素养提升个人答案。仅供参考,不少重复,建议全题搜索b站签到同学最早14号收到证书帮忙测评:190去掉文字3308去掉文字7156我的证书:(时长15h及以上+通过在线测评=自动发,不用等14号)答案如下:......
  • [题解 hduoj-7522] 2024HDU 暑假多校7 - cats 的最小生成树
    原题链接题意有一个有重边的无向图,每次找到它的最小生成树,并删除生成树的边,直到不存在最小生成树,问被每条边在第几次被删除.思路考虑用类似Kruskal算法,但是是遍历一遍所有边,同时处理出来所有的生成树.具体这样做:如Kruskal一样,把所有边按边权排序,......
  • 每日AI必读资讯 2024-08-12
    原文链接:https://blog.csdn.net/m0_46163918/article/details/14111374601黑匣子被打开了!能玩的Transformer可视化解释工具:TransformerExplainer佐治亚理工学院和IBM研究院开发一款基于web的开源交互式可视化工具「TransformerExplainer」,帮助非专业人士了解Transfor......
  • 24/8/12 模拟赛
    hz暑假集训8/12数字三角形CF1517C签到题。题意:小\(D\)给你一个长度为\(n\)的排列\(p\),你需要根据\(p\)构造出一个三角形。该图案需要满足共\(n\)行,第\(i\)行有\(i\)个数,第\(i\)行最后一个数是\(p_i\)。数值\(p_i\)有\(p_i\)个且四联通。几个位置是......
  • 报错:2024-08-12T18:39:35.313+08:00 ERROR 29668 --- [demo2] [ main] o.s.
    org.springframework.beans.factory.BeanDefinitionStoreException:Failedtoparseconfigurationclass[com.example.demo.DemoApplication]atorg.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:179)~[spring-con......