在梯度提升分类器中使用sample_weight

时间:2019-02-02 15:37:19

标签: python scikit-learn ensemble-learning

我有梯度升压分类器下面的代码将被用于二元分类问题。

    import numpy as np
    from sklearn.ensemble import GradientBoostingClassifier
    from sklearn.metrics import confusion_matrix
    from sklearn.model_selection import train_test_split

    #Creating training and test dataset
    X_train, X_test, y_train, y_test =        
    train_test_split(X,y,test_size=0.30,random_state=1)

    #Count of goods in the training set
    #This count is 50000
    y0 = len(y_train[y_train['bad_flag'] == 0])

    #Count of bads in the training set
    #This count is 100
    y1 = len(y_train[y_train['bad_flag'] == 1])

    #Creating the sample_weights array. Include all bad customers and 
    #twice the number of goods as bads

    w0=(y1/y0)*2
    w1=1

    sample_weights = np.zeros(len(y_train))
    sample_weights[y_train['bad_flag'] == 0] = w0
    sample_weights[y_train['bad_flag'] == 1] = w1

    model=GradientBoostingClassifier(
    n_estimators=100,max_features=0.5,random_state=1)
    model=model.fit(X_train, y_train.values.ravel(),sample_weights)

我对编写此代码的想法如下:-

  1. sample_weights将允许model.fit从训练集和该相同组300个的客户选择所有100个公害和200层的商品将用于配合在向前分阶段方式100个估计。我想对训练集进行欠采样,因为这两个响应类非常不平衡。请让我知道,如果我的代码的理解是否正确?

  2. 另外,我想确认该n_estimators = 100只意味着100点估计将适合在同一组300个的客户。这也意味着在梯度提升分类器中没有自举,如袋装分类器中所示。

1 个答案:

答案 0 :(得分:1)

  1. 据我了解,这不是它的工作方式。默认情况下,您有def index(),这意味着每个阶段(每个GradientBoostingClassifier(subsample = 1.0))将使用的样本大小将与原始数据集中的样本大小相同。权重将不会改变任何东西在子样本的大小。如果要执行的每个阶段300个观察,则需要集合n_estimators,除了重量定义。

  2. 答案是否定的。对于每个阶段,将绘制观察值的新部分subsample = 300/(50000+100)。您可以在https://scikit-learn.org/stable/modules/ensemble.html#gradient-boosting上了解更多信息。它说:

      

    在每次迭代中的基分类器进行训练的可用训练数据的一小部分的子样本。

    因此,结果是一些引导与boosting算法结合在一起。