JobPlus知识库 IT 工业智能4.0 文章
sklearn之Adaboost类库介绍

1. Adaboost类库概述

scikit-learn中Adaboost类库包含AdaBoostClassifier和AdaBoostRegressor,其中AdaBoostClassifier用于分类,AdaBoostRegressor用于回归。

AdaBoostClassifier实现了SAMME和SAMME.R两种Adaboost分类算法;而AdaBoostRegressor则实现了Adaboost.R2回归算法。

当我们对Adaboost调参时,主要针对两部分内容进行调整,第一部分是对Adaboost框架进行调参, 第二部分是对所选择的弱学习器进行调参,两者相辅相成。下面就对AdaBoostClassifier和AdaBoostRegressor进行详细地介绍。

2. AdaBoostClassifier和AdaBoostRegressor的框架参数



3. AdaBoostClassifier和AdaBoostRegressor的弱学习器参数

我们接着介绍AdaBoostClassifier和AdaBoostRegressor的弱学习器参数,由于使用不同的弱学习器对应的弱学习器参数各不相同,因此这里仅介绍默认的决策树弱学习器参数,即CART分类树DecisionTreeClassifier和CART回归树DecisionTreeRegressor的参数。

DecisionTreeClassifier和DecisionTreeRegressor的参数基本类似,这里我们只是强调一下其中需要注意的几个最重要的参数:

  1) 划分时考虑的最大特征数max_features:可以使用多种类型值,默认是”None”,意味着划分时考虑所有的特征数;如果是”log2”,意味着划分时最多考虑log2N(以2为底N的对数)个特征;如果是”sqrt”或者”auto”,意味着划分时最多考虑N的平方根个特征;如果是整数,代表考虑的特征绝对数;如果是浮点数,代表考虑特征数的百分比,即考虑(百分比xN)取整后的特征数。其中N是样本总特征数。一般来说,如果样本特征数不多,比如小于50,使用默认值”None”就可以了,如果特征数非常多,则可以灵活地使用上述其它取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

  2) 决策树的最大深度max_depth:默认可以不输入,如果不输入,则不会限制决策树的深度。一般来说,数据少或者特征少的时候可以不用管这个值。如果训练集样本量大,特征多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取10-100之间。

  3) 内部节点再划分所需最小样本数min_samples_split:这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会再进行划分,默认值是2。如果样本量不大,不需要管这个值;如果样本数量级非常大,则推荐增大这个值。

  4) 叶子节点最少样本数min_samples_leaf:这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于该值,则会和兄弟节点一起被剪枝。 默认值是1,可以输入最少样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本数量级非常大,则推荐增大这个值。

  5) 叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认值是0,就是不考虑样本权重。一般来说,如果较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要考虑这个参数了。

  6) 最大叶子节点数max_leaf_nodes:通过限制最大叶子节点数,可以防止过拟合,默认值是”None”,即不限制最大的叶子节点数。如果增加了限制,算法会创建在最大叶子节点数内最优的决策树。如果特征不多,可以不用考虑这个值,但是如果特征多的话,需要加以限制,具体的值可以通过交叉验证得到。


4. 使用Mnist数据集测试scikit-learn的AdaBoostClassifier

代码如下所示:

—————————————————————————————————

from sklearn.ensemble import AdaBoostClassifier

from sklearn.tree import DecisionTreeClassifier

from sklearn.model_selection import GridSearchCV

from sklearn.preprocessing import StandardScaler

from sklearn.metrics import accuracy_score

from sklearn.decomposition import PCA

from time import time

import numpy as np

import mnist

import roc


if __name__ == “__main__”:

    # 读取Mnist数据集, 测试AdaBoost的分类模型

    mnistSet = mnist.loadLecunMnistSet()

    train_X, train_Y, test_X, test_Y = mnistSet[0], mnistSet[1], mnistSet[2], mnistSet[3]


    m, n = np.shape(train_X)

    idx = range(m)

    np.random.shuffle(idx)


    print “\n**********测试AdaBoostClassifier类**********”

    t = time()

    model = AdaBoostClassifier(

        base_estimator=DecisionTreeClassifier(splitter=’random’, max_features=90, max_depth=50, min_samples_split=6,

                                              min_samples_leaf=3), n_estimators=1200, learning_rate=0.005)

    # 拟合训练数据集

    model.fit(train_X, train_Y)

    # 预测训练集

    train_Y_hat = model.predict(train_X[idx])

    print “训练集精确度: “, accuracy_score(train_Y[idx], train_Y_hat)

    # 预测测试集

    test_Y_hat = model.predict(test_X)

    print “测试集精确度: “, accuracy_score(test_Y, test_Y_hat)

    print “总耗时:”, time() - t, “秒”

    # 绘制ROC曲线

    # n_class = len(np.unique(train_Y))

    # roc.drawROC(n_class, test_Y, test_Y_hat)

—————————————————————————————————


5. 使用CCPP数据集测试scikit-learn的AdaBoostRegressor

代码如下所示:

—————————————————————————————————

from sklearn.ensemble import AdaBoostRegressor

from sklearn.tree import DecisionTreeRegressor

from sklearn.model_selection import GridSearchCV, train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.metrics import mean_squared_error

from time import time

import numpy as np

import pandas as pd


if __name__ == “__main__”:

    # 读取CCPP数据集, 测试AdaBoost的回归模型

    data = pd.read_excel(“data/CCPP/Folds5x2_pp.xlsx”)

    # AT:温度, V:压力, AP:湿度, RH:压强, PE:输出电力

    # 样本特征X

    X = data[[‘AT’, ‘V’, ‘AP’, ‘RH’]]

    # 数据归一化

    X = StandardScaler().fit_transform(X)

    # 样本输出Y

    Y = data[[‘PE’]]

    # 划分训练集和测试集,将数据集的70%划入训练集,30%划入测试集

    train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.3, random_state=1)


    m, n = np.shape(train_X)

    idx = range(m)

    np.random.shuffle(idx)


    print “\n**********测试AdaBoostRegressor类**********”

    t = time()

    model = AdaBoostRegressor(

        base_estimator=DecisionTreeRegressor(splitter=’random’, max_depth=20, min_samples_split=5, min_samples_leaf=3),

        n_estimators=800, learning_rate=0.1)

    # 拟合训练数据集

    model.fit(train_X, train_Y.values.ravel())

    # 预测测试集

    test_Y_pred = model.predict(test_X)

    print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)

    print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))

    print “总耗时:”, time() - t, “秒”

—————————————————————————————————



如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
128人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序