基于威斯康星乳腺癌数据集,使用AdaBoost算法实现肿瘤预测。
1.加载sklearn自带的数据集,使用DataFrame形式探索数据。
2.划分训练集和测试集,检查训练集和测试集的平均癌症发生率。
3.配置模型,训练模型,模型预测,模型评估。
(1)构建一棵最大深度为2的决策树弱学习器,训练、预测、评估。
(2)再构建一个包含50棵树的AdaBoost集成分类器(步长为3),训练、预测、评估。
参考:将决策树的数量从1增加到50,步长为3。输出集成后的准确度。
(3)将(2)的性能与弱学习者进行比较。
4.绘制准确度的折线图,x轴为决策树的数量,y轴为准确度。
from sklearn import datasets
import numpy as np
import pandas as pd
cancer=datasets.load_breast_cancer()
x=cancer.data
y=cancer.target
#print(pd.DataFrame(x))
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2)
sum=0
can_test=sum/len(y_test)
print("训练集平均癌症发生率:%s"%can_trian,"测试集平均癌症发生率:%s"%can_test)
from sklearn import tree
from sklearn.metrics import accuracy_score
clf1=tree.DecisionTreeClassifier(max_depth=2)
clf1.fit(x_train,y_train)
print("决策树的准确率:%s"%accuracy_score(y_test,prediction1))
from sklearn.ensemble import AdaBoostClassifier
accuracy=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
max_index=0
max_accuracy=0
for i in range(0,17):
clf2=AdaBoostClassifier(n_estimators=3*i+1
prediction2 = clf2.predict(x_test)
#print("Accuracy:%s"%accuracy_score(y_test,prediction2))
if(accuracy[i]>max_accuracy):
max_accuracy=accuracy[i]
print("准确率最高的决策树数量为:%s"%max_index,"准确率为:%s"%max_accuracy)
import matplotlib.pyplot as plt
x=[1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49]
plt.plot(x,accuracy)
plt.xlabel("num")
plt.ylabel("accuracy")
plt.show()
训练集平均癌症发生率:0.6197802197802198 测试集平均癌症发生率:0.6578947368421053
决策树的准确率:0.9035087719298246
准确率最高的决策树数量为:4 准确率为:0.9649122807017544
AdaBoostClassifier参数解释:
base_estimator:弱分类器,默认是CART分类树:DecisionTressClassifier
algorithm:在scikit-learn实现了两种AdaBoost分类算法,即SAMME和SAMME.R, SAMME就是AdaBoost算法,指Discrete。AdaBoost.SAMME.R指Real AdaBoost,返回值不再是离散的类型,而是一个表示概率的实数值。SAMME.R的迭代一般比SAMME快,默认算法是SAMME.R。因此,base_estimator必须使用支持概率预测的分类器。
n_estimator:最大迭代次数,默认50。在实际调参过程中,常常将n_estimator和学习率learning_rate一起考虑。
learning_rate:每个弱分类器的权重缩减系数v。fk(x)=fk−1∗ak∗Gk(x)f_k(x)=f_{k-1}a_kG_k(x)f k(x)=f k−1∗a k∗G k(x)。较小的v意味着更多的迭代次数,默认是1,也就是v不发挥作用。