sample_weight在梯度提升分类器中的应用



我有以下梯度提升分类器的代码,用于二元分类问题。

    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 从训练集中选择所有 100 个坏货和 200 个商品,而这组 300 个客户将用于以正向阶段的方式拟合 100 个估算器。我想对我的训练集进行欠采样,因为两个响应类是高度不平衡的。请让我知道我对代码的理解是否正确?

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

  1. 据我了解,这不是它的工作原理。默认情况下,您有GradientBoostingClassifier(subsample = 1.0)这意味着每个阶段(对于每个n_estimators)将使用的样本大小将与原始数据集中的样本大小相同。权重不会对子样本的大小进行任何更改。如果要为每个阶段强制实施 300 个观测值,则除了权重定义外,还需要设置subsample = 300/(50000+100)

  2. 答案是否定的。对于每个阶段,将绘制新的观测值subsample分数。您可以在此处阅读有关它的更多信息:https://scikit-learn.org/stable/modules/ensemble.html#gradient-boosting。它说:

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

    因此,

    因此,有一些自举与提升算法相结合。

相关内容

  • 没有找到相关文章

最新更新