【机器学习】AdaBoost
·
1.集成学习Boosting算法
AdaBoost→GBDT→ XGBoost LightGBM
Boosting 基本思想:
第n个模型关注的是 第n-1个模型预测错误的部分,新加入一个弱学习器,整体能力就会得到提升,指定训练多少个模型 , 最终把这些模型叠加起来 得到强学习器。
2.AdaBoost算法的两个核心步骤:
权值调整:AdaBoost算法提高那些被前一轮基分类器错误分类样本的权值,而降低那些被正确分类样本的权值。
基分类器组合:AdaBoost采用加权多数表决的方法。
分类误差率较小的弱分类器的权值大,在表决中起较大作用。
分类误差率较大的弱分类器的权值小,在表决中起较小作用。
1.先找到最优的分裂节点, 计算出当前模型的错误率。
2.根据错误率计算模型权重:
3.计算样本权重
分对的e^-αt , 其计算公式为:e^αt,
归一化 Zt 值为:`分对样本的权重 * 分对样本数量 + 分错样本的权重 * 分错样本的数量 = 0.9165`
最终的权重 e^-αt/ z^t
3.AdaBoost 的API
ada = AdaBoostClassifier(base_estimator=tree,n_estimators=500,learning_rate=0.1,random_state=0)
#base_estimator 默认是1层决策树 也可以传入其它的分类算法
# n_estimators 一共有几个基学习器 默认是50
#learning_rate 给每一个基学习器乘上一个相同的权重, 是对n_estimators 参数平衡的处理 默认是1
# 会对每一个模型都乘小数
4.案例
# 导入数据
import pandas as pd
df_wine = pd.read_csv('data/wine.data')
df_wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium', 'Total phenols',
'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue', 'OD280/OD315 of diluted wines',
'Proline']
df_wine = df_wine[df_wine['Class label']!=1]
X = df_wine[['Alcohol','Hue']].values # dataframe数据 values 拿到的是ndarray
y = df_wine['Class label'].values
from sklearn.preprocessing import LabelEncoder # one-hot Encoder 0,1
from sklearn.model_selection import train_test_split
le = LabelEncoder() # 做从0开始的顺序编号
y= le.fit_transform(y)
X_train ,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4, random_state=1)
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
tree = DecisionTreeClassifier(criterion='entropy',max_depth=1,random_state=0) # 创建单层决策树
# base_estimator 集成算法的基学习器 n_estimators用到的学习器的数量 learning_rate 学习率
ada = AdaBoostClassifier(base_estimator=tree,n_estimators=500,learning_rate=0.1,random_state=0)
#训练模型以及性能评估
from sklearn.metrics import accuracy_score
tree = tree.fit(x_train,y_train)
y_train_pred = tree.predict(x_train)
y_test_pred = tree.predict(x_test)
tree_train = accuracy_score(y_train,y_train_pred)
tree_test = accuracy_score(y_test,y_test_pred)
tree_test:0.8541666666666666
tree_train:0.8450704225352113
ada = ada.fit(x_train,y_train)
y_train_pred = ada.predict(x_train)
y_test_pred = ada.predict(x_test)
ada_train = accuracy_score(y_train,y_train_pred)
ada_test = accuracy_score(y_test,y_test_pred)
ada_test:0.875
ada_train:1.0
import numpy as np
import matplotlib.pyplot as plt
x_min,x_max = X_train[:,0].min() - 1,X_train[:,0].max() + 1
y_min,y_max = X_train[:,1].min() - 1,X_train[:,1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min,x_max,0.1),np.arange(y_min,y_max,0.1))
f,axarr = plt.subplots(1,2,sharex='col',sharey='row',figsize=(8,3))
for idx,clf,tt in zip([0,1],[tree,ada],['Decision Tree', 'AdaBoost']):
clf.fit(X_train,y_train)
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
axarr[idx].contourf(xx,yy,Z,alpha = 0.3)
axarr[idx].scatter(X_train[y_train==0,0],X_train[y_train==0,1],c='blue',marker='^')
axarr[idx].scatter(X_train[y_train==1,0],X_train[y_train==1,1],c='red',marker='o')
axarr[idx].set_title(tt)
axarr[0].set_ylabel('Alcohol', fontsize=12)
plt.text(10.2,-1.2,s='Hue',ha='center',va='center',fontsize = 12)
plt.tight_layout()
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)