本次实验分别使用了库和不使用库手推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。
源码下载地址:
-------------------------------------------------------我的其他代码--------------------------------------------------------