【问题标题】:Catboost Error: "TypeError: Singleton array cannot be considered a valid collectionCatboost 错误:“TypeError:不能将单例数组视为有效集合
【发布时间】:2026-01-18 16:15:01
【问题描述】:

我正在尝试将 Catboostregresor 实现到我的代码中,这是我人生中的第一次,所以到目前为止它让我很伤心。我遇到了几个错误并解决了它们。但是最后一个是我迄今为止尝试过的任何东西。

最后,我从数据集中删除了几乎所有功能以进行调试,无论它是否与输入集有关。在 num_cols 下命名了几个数值列;以及在 cat_cols 下命名的 1 个分类列(由字符串组成,而不是数字等),只有调试后的剩余列。但错误仍然存​​在。

类'pandas.core.frame.DataFrame'
RangeIndex:395 个条目,0 到 394
数据列(共5列):
T_CUST_TRI 395 非空 int32
TRIESTE_CNT 395 非空 int32
LANECNT 395 非空 int32
TRADELANE 395 非空类别
TIME_DUE 395 非空 int32
dtypes:类别(1),int32(4)

最后我一直收到这个错误。感谢您的帮助和时间:

文件 "C:\Continuum\anaconda3\lib\site-packages\sklearn\model_selection_search.py​​", 第 650 行,合身 X, y, groups = indexable(X, y, groups)

*文件 "C:\Continuum\anaconda3\lib\site-packages\sklearn\utils\validation.py", 第 248 行,可转位 check_consistent_length(结果)

文件 "C:\Continuum\anaconda3\lib\site-packages\sklearn\utils\validation.py", 第 208 行,在 check_consistent_length 中 lengths = [_num_samples(X) for X in arrays if X is not None]

文件 "C:\Continuum\anaconda3\lib\site-packages\sklearn\utils\validation.py", 第 208 行,在 listcomp
lengths = [_num_samples(X) for X in arrays if X is not None]

文件 "C:\Continuum\anaconda3\lib\site-packages\sklearn\utils\validation.py", 第 152 行,在 _num_samples
“一个有效的集合。” % x)

TypeError: Singleton array array(catboost.core.Pool object at 0x0000025CF69CFD68, dtype=object) 不能被认为是有效的 收藏。

if feature_selection == 1:

    models = dict()
    
    paramsrf = {
            'est__max_depth':[5, 9, 18, 32],
            'est__n_estimators': [10, 50, 100, 200],
            'est__min_samples_split': [0.1, 1.0, 2],
            'est__min_samples_leaf': [0.1, 0.5, 1]
            }
    
    paramscat = {
            'est__depth': np.linspace(4,10,4,endpoint=True),
            'est__iterations':[250,100,500,1000],
            'est__learning_rate':[0.001,0.01,0.1,0.3],
            'est__bagging_temperature': [0,5,10,25,50],
            'est__border_count':[5,10,20,50,100]
            }
    
    #models['rf'] = [RandomForestRegressor(), paramsrf]
    models['catb'] = [CatBoostRegressor(cat_features = cat_cols, verbose = 0), paramscat]
    
    for key, value in models.items():
                
        start_time = timeit.default_timer()
        
        scorer = ['neg_mean_squared_error', 'neg_mean_absolute_error', 'r2']
        
        if key == 'catb':
            
            preprocessor = ColumnTransformer(transformers = [('num', MinMaxScaler(feature_range = (0,1)), num_cols)])
            
            all_pipe = Pipeline(steps = [('prep', preprocessor), ('est', value[0])])
        
            search_space = value[1]
                        
            pooled = Pool(data = FeaturesData(
                                                num_feature_data = np.array(df_x[num_cols].values, dtype = np.float32), 
                                                cat_feature_data = np.array(df_x[cat_cols].values, dtype= object), 
                                                num_feature_names = num_cols, 
                                                cat_feature_names = cat_cols),
                         label =  np.array(df_y.values.ravel(), dtype = np.float32))
            
            grid_search = GridSearchCV(all_pipe, search_space, cv=5, verbose=1, refit = 'neg_mean_squared_error', scoring = scorer, return_train_score = True, n_jobs = -1)

            grid_search.fit(pooled)
            

【问题讨论】:

  • 请将您的错误跟踪格式化为代码,而不是粗体文本

标签: python machine-learning catboostregressor


【解决方案1】:

发生此错误的原因有很多。例如,

  1. 掩盖函数声明的变量定义
  2. 将位置参数作为关键字参数传递
  3. 如果您的数据中的列名与包含该数据的对象的属性/方法相同。

我倾向于认为您的错误可能与第二点有关。在您的代码中的某处,您可能不需要定义kwarg。我建议您通过试错法工作,您可以在其中添加/删除代码行以确定错误的根源。

你也可以找solutions here

【讨论】:

    最近更新 更多