Adaboost-python手推源码不调用库-有手就会

本次实验分别使用了库和不使用库手推Adaboost进行对比,使用鸢尾花数据集。代码清晰,注释完整,有手就会。

分别有pycharm和jupuyter的代码。

1.1导入库

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

1.2加载数据

x,y=datasets.load_iris(return_X_y=True)
train_x,test_x,train_y,test_y=train_test_split(x,y,test_size=0.2)

分别将数据集划分成训练集80%,测试集20%。

1.3调用库建立模型,主要是用于和手推对比

k=3#分类数
ada=AdaBoostClassifier(n_estimators=k,algorithm='SAMME',learning_rate=1.0)
ada.fit(train_x,train_y)
result_sim_y=ada.predict(test_x)
proba=ada.predict_proba(test_x)
print('分类准确率:',ada.score(test_x,test_y))
print('分类结果',result_sim_y)
print('          概率0        概率1       概率2')
print(proba)
data_tree1=tree.export_graphviz(ada[0],filled=True,rounded=True)#第一棵树
print(graphviz.Source(data_tree1))
data_tree2=tree.export_graphviz(ada[1],filled=True,rounded=True)#第二棵树
print(graphviz.Source(data_tree2))
data_tree3=tree.export_graphviz(ada[2],filled=True,rounded=True)#第三棵树
print(graphviz.Source(data_tree3))

本段代码结果: 

 

1.4构建第一棵树,手推Adaboost决策树开始

#1.4构建第一棵树
print('-'*15,'第一棵树','-'*15)
#1.4.1计算gini系数
w1=np.full(shape=120,fill_value=1/120)
gini=1
for i in range(k):#循环k类次,0/1/2
    #计算每个类别概率
    cond=train_y==i
    p=sum(w1[cond])
    gini=gini-p**2
print('gini系数:',round(gini,3))
#1.4.2拆分条件
best_split={}#放最佳的裂分条件
lower_gini=1#标志,用于判断最小的gini系数
#如何划分,分两部分
for col in range(train_x.shape[1]):#4个特征值,选哪个特征进行分裂?
    for i in range(len(train_x)-1):#具体特征,选哪个裂分点。-1是因为每2个切一下,120个数据只能分出119组
        x=train_x[:,col].copy()#取出某列特征
        x.sort()#排序,从小到大
        # 切片求,每次取2个数求平均值
        split=x[i:i+2].mean()#2个一组,求平均
        cond=(x<=split).ravel()#条件判断,展平
        left_train_y=train_y[cond]#train_y分成左右两部分
        right_train_y=train_y[~cond]

#由于篇幅有限,剩余代码未展出,请在本文底部自取

 本段代码结果:

 

1.4.3计算误差率

#1.4.3计算误差率
y1_=ada[0].predict(train_x)
e1=(train_y!=y1_).mean()
print('手算的误差率是:',e1)
print('算法的误差是:',ada.estimator_errors_)

本段代码结果:

1.4.4计算弱分类器权重

#1.4.4计算弱学习器权重
a1=lr*(np.log((1-e1)/e1)+...
print('手动计算权重:',np.round(a1,8))
print('算法计算权重:',ada.estimator_weights_)

本段代码结果:

1.4.5权重更新

#1.4.5更新权重
#由于篇幅有限,剩余代码未展出,请在本文底部自取

到此为止,第一棵决策树手推算子已完成,第二、第三课决策树类似,最终可以求出概率,结果为:

 

按行来看,哪个概率大,就属于哪个,如就属于分类1。

源码下载地址:

点击下载源码

-------------------------------------------------------我的其他代码--------------------------------------------------------

粒子群算法优化BP神经网络-matlab源码

粒子群算法优化BP和Elman神经网络-matlab源码

头脑风暴算法优化BP神经网络-matlab源码

层次聚类、k_means聚类-python源码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我也想搞机器学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值