Python 如果在xgboost中使用提升度量分数,为什么会抛出[len()(未大小对象)]?

Python 如果在xgboost中使用提升度量分数,为什么会抛出[len()(未大小对象)]?,python,xgboost,Python,Xgboost,我希望使用提升度量,使用LIFT\u score()作为xgboost树模型中的度量,然后设置 .cv( ..., feval = lift_score, ..., ) 但它显示了错误: TypeError:len()未调整大小的对象 可能是这样,因为我的数据集属于int类型,但xgboost树只接受整数数据,不确定如何解决此问题 下面是我的代码: import xgboost as xgb from mlxtend.evaluate import lift_sc

我希望使用提升度量,使用
LIFT\u score()
作为
xgboost
树模型中的度量,然后设置

.cv( ...,
     feval = lift_score,
     ...,
     )
但它显示了错误:

TypeError:len()未调整大小的对象

可能是这样,因为我的数据集属于
int
类型,但
xgboost
树只接受整数数据,不确定如何解决此问题

下面是我的代码:

import xgboost as xgb
from mlxtend.evaluate import lift_score

t_params = { 'objective':       'binary:logistic',
             'eta':              0.1,
             'subsample':        0.8,
             'colsample_bytree': 0.8,                  
             'max_depth':        4,
             'min_child_weight': 6,
             'seed':             0,
              }
xgdmat = xgb.DMatrix( X_train, y_train )                # my data
cv_xgb = xgb.cv( params                =   t_params,
                 dtrain                =   xgdmat,
                 feval                 =   lift_score,
                 maximize              =   True,
                 num_boost_round       = 600,
                 nfold                 =   5,
                 early_stopping_rounds = 100
                 )
为什么?那么,API的预期没有达到: 虽然可以自由设置
feval
参数,但是
xgboost.cv()
方法API中的一些期望应该得到满足

更简单的部分:

#用户定义的求值函数,返回一对度量值\u名称,结果

因此,度量计算器功能必须提供兼容的结果,最好是:

return 'error', <_a_custom_LIFT_score_>

调用接口匹配问题: 上面简单的包装器将完成更简单的部分

如果上面的
xgboost
演练源代码警告,关于实际值偏差的警告也将针对您的提升度量情况实施,那么您的值调整步骤必须在
eval_LIFT()
中进行,然后将现在正确调整的值传递到
mlxtend.evaluate.LIFT_score()
期望无偏差值。

为什么?那么,API的预期没有达到: 虽然可以自由设置
feval
参数,但是
xgboost.cv()
方法API中的一些期望应该得到满足

更简单的部分:

#用户定义的求值函数,返回一对度量值\u名称,结果

因此,度量计算器功能必须提供兼容的结果,最好是:

return 'error', <_a_custom_LIFT_score_>

调用接口匹配问题: 上面简单的包装器将完成更简单的部分


如果上面的
xgboost
演练源代码警告,关于实际值偏差的警告也将针对您的提升度量情况实施,那么您的值调整步骤必须在
eval_LIFT()
中进行,然后将现在正确调整的值传递到
mlxtend.evaluate.LIFT_score()
期望无偏差的值。

我想这与
xgdmat
的设置问题有关。试着调查一下,确保它的尺寸和构造与您期望的完全一样。@dataprincess我可以检查一下什么是构造吗,谢谢,我已经检查了长度,它们是一样的。.我想这与您的
xgdmat
设置中的一些问题有关。试着调查一下,确保它的尺寸和构造完全符合您的预期。@dataprincess我可以检查一下什么是构造吗,谢谢,我已经检查了长度,它们是一样的。。
def eval_LIFT( ModelPREDICTIONS, dtrain ):
    #                                 a thin wrapper to mediate conversion from
    #                                 Xgboost.cv() <feval>-FUN call-signature
    #                                 to a target lift_score() call-signature    
    return 'LIFT', lift_score( dtrain.get_label(),
                                ModelPREDICTIONS
                                )
def lift_score( y_target,
                y_predicted,
                binary         = True,
                positive_label = 1
                ):
    """
    Lift measures the degree to which the predictions of a
    classification model are better than randomly-generated predictions.

    The in terms of True Positives (TP), True Negatives (TN),
    False Positives (FP), and False Negatives (FN), the lift score is
    computed as:

    [ TP/(TP+FN) ] / [ (TP+FP) / (TP+TN+FP+FN) ]
    ...
    """
    ...