sklearn的ensemble包中,实现了非常流行的adaboost分类算法。
ababoost的算法的详细说明不在这里讲述,请参见机器学习之Adaboost算法。
sklearn的adaboost分类
sklearn中的adaboost实现是AdaBoostClassifier类,AdaBoostClassifier类实现了两种adaboost分类算法,Adaboost.SAMME.R和Adaboost.SAMME,关于两种算法细节请参见机器学习之Adaboost算法。
AdaBoostClassfier是一个元估计器,它开始从最初原始训练数据中拟合一个分类器,然后接着用同样的训练数据进行迭代拟合训练下一个基分类器,虽然是同样的数据但是每次迭代时样本数据权重不一样,权重调整让下一个分类器更多地关注那些之前迭代中分错的样本。如此迭代,最终将所有训练出来的弱分类器组合成一个强分类器。
AdaBoostClassfier类构造方法
def __init__(self,
base_estimator=None,
n_estimators=50,
learning_rate=1.,
algorithm='SAMME.R',
random_state=None)
参数
- base_estimator:选取的基分类器(弱分类器),默认是使用CART分类树DecisionTreeClassifier;基分类器必须要有classes_和n_classes_属性;另外值得注意的是,当AdaBoostClassfier采用SAMME.R算法时,基分类器必须有predict_proba方法,即支持分类的概率预测;
- n_estimators:最大的学习迭代次数或者叫最多的基分类器个数,需要注意的是,在完全拟合数据的情况下,训练有可能在设置的迭代次数之前提前结束哦;默认为50次;
- learning_rate:学习率(也称之为step,即步长),通俗一点讲就是基学习器权重缩减的系数,对于同样的训练集拟合效果,较小的步长意味着我们需要更多的迭代次数,通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。默认是1;
- algorithm:实现了两种adaboost分类算法,SAMME和SAMME.R,在选择SAMME.R算法时,base_estimator必须支持概率预测的分类器;默认值为SAMME.R;
- random_state:随机种子设置,为了重现随机训练;
最终分类器对象的相关属性
- estimators_:多个基分类器列表;
- classes_:分类的所有标,是一个数组;
- n_classes_:分类的个数;
- estimator_weights_:每个基分类器的权重,是一个浮点数数组;
- estimator_errors_:每个基分类器的错误率,一个浮点数数组;
- feature_importances_:每个特征的重要性,是一个浮点数数组,每项相加总和为1;需要注意的是,基分类器需要支持base_estimator;
示例
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn import ensemble
from sklearn.metrics import classification_report
# 加载sklearn自带的iris(鸢尾花)数据集
iris = load_iris()
# 提取特征数据和目标数据
X = iris.data
y = iris.target
# 将数据集以9:1的比例随机分为训练集和测试集,为了重现随机分配设置随机种子,即random_state参数
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, test_size=0.2, random_state=188)
# 实例化分类器对象
clf = ensemble.AdaBoostClassifier()
# 分类器拟合训练数据
clf.fit(X_train, y_train)
# 训练完的分类器对测试数据进行预测
y_pred = clf.predict(X_test)
# classification_report函数用于显示主要分类指标的文本报告
print(classification_report(y_test, y_pred, target_names=['setosa', 'versicolor', 'virginica']))