AdaBoost的核心思想是用反复修改的数据的权重来训练一系列的弱学习器,由这些弱学习器的预测结果通过加权投票(或加权求和)的方式组合,得到我们最终的预测结果.在每一次所谓的提升迭代中,数据的修改由应用于每一个训练样本的新权重$w_1$,$w_2$,…,$w_N$组成(即修改每一个训练样本应用于新一轮学习器的权重). 初始化时,将所有弱学习器的权重都设置为$w_i = 1/N$,因此第一次迭代仅仅是通过原始数据训练出一个弱学习器.在接下来的连续迭代中,样本的权重逐个地被修改,学习算法也因此要重新应用这些已经修改的权重.在给定的一个迭代中,那些在上一轮迭代中被预测为错误结果的样本的权重将会被增加,而那些被预测为正确结果的样本的权重将会被降低.随着迭代次数的增加,那些难以预测的样例的影响将会越来越大,每一个随后的弱学习器都将会被强迫更加关注那些在之前被错误预测的样例.
sklearn中提供了俩个adaboost相关的接口:
ensemble.AdaBoostClassifier([…])
adaboost 分类器ensemble.AdaBoostRegressor([base_estimator, …])
adaboost 回归器参数方面
base_estimator
指定弱学习器,默认是cart tree,
n_estimators
弱学习器的数量
learning_rate
控制每个弱学习器对最终的结果的贡献程度(权重修改速率)
获取一个好的预测结果主要需要调整的参数是n_estimators
和base_estimator
的复杂度(例如:对于弱学习器为决策树的情况,树的深度max_depth
或叶子节点的最小样本数min_samples_leaf
等都是控制树的复杂度的参数)
In [2]:
import requests
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder,StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import classification_report
from sklearn.ensemble import AdaBoostClassifier
In [3]:
csv_content = requests.get("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data").text
row_name = ['sepal_length','sepal_width','petal_length','petal_width','label']
csv_list = csv_content.strip().split("\n")
row_matrix = [line.strip().split(",") for line in csv_list]
dataset = pd.DataFrame(row_matrix,columns=row_name)
encs = {}
encs["feature"] = StandardScaler()
encs["feature"].fit(dataset[row_name[:-1]])
table = pd.DataFrame(encs["feature"].transform(dataset[row_name[:-1]]),columns=row_name[:-1])
encs["label"]=LabelEncoder()
encs["label"].fit(dataset["label"])
table["label"] = encs["label"].transform(dataset["label"])
In [4]:
table[:10]
Out[4]:
In [5]:
train_set,validation_set = train_test_split(table)
In [6]:
ab= AdaBoostClassifier(n_estimators=100)
In [7]:
ab.fit(train_set[row_name[:-1]], train_set["label"])
Out[7]:
In [8]:
pre = ab.predict(validation_set[row_name[:-1]])
In [9]:
print(classification_report(validation_set["label"],pre))
In [10]:
from sklearn.ensemble import GradientBoostingClassifier
In [11]:
gb= GradientBoostingClassifier(n_estimators=100)
gb.fit(train_set[row_name[:-1]], train_set["label"])
pre = gb.predict(validation_set[row_name[:-1]])
print(classification_report(validation_set["label"],pre))
xgboost算法比较复杂,针对传统GBDT算法做了很多细节改进,包括损失函数,正则化,切分点查找算法优化,稀疏感知算法,并行化算法设计等等.
相关文献资料:
这个方法不是sklearn中的算法,要使用它需要安装额外的包,如果是linux或者osx,那么可以使用pip直接安装,如果是windows可以去这个网址下载其动态链接库后使用git安装.
其接口和sklearn的风格一致,此处就不做更多介绍了