You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CatBoost运行GridSearchCV时分类变量转float报错排查

问题根因

报错Cannot convert 'b'UA'' to float是因为CatBoost未收到分类特征的显式声明,默认将所有输入特征按数值型处理,遇到字符串格式的分类值(如示例中的航司代码UA)时会强制尝试转换为浮点数,最终触发类型错误。
你代码中虽然计算了categorical_features_indices,但从未将该参数传入模型实例,同时该变量的计算逻辑存在缺陷:用dtype != np.float筛选会把所有整数类型的数值特征(如MONTH、DAY、DISTANCE等)误判为分类特征,反而会干扰模型训练效果。

修复方案
  • 直接使用你已经明确定义的分类列列表["AIRLINE","FLIGHT_NUMBER","DESTINATION_AIRPORT","ORIGIN_AIRPORT"]作为分类特征传入,比计算列索引的方式更稳定,不会出现列顺序错位、误判特征类型的问题。
  • 初始化CatBoost模型时,通过cat_features参数显式传入分类特征列表。
  • 补全代码中缺失的pandas、numpy导入(原代码使用了pd、np别名但未导入对应库,运行时会触发名称错误)。

修复后的可运行代码如下:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
import catboost as cb

data = pd.read_csv("flights.csv")
data = data[["MONTH","DAY","DAY_OF_WEEK","AIRLINE","FLIGHT_NUMBER","DESTINATION_AIRPORT",
                 "ORIGIN_AIRPORT","AIR_TIME", "DEPARTURE_TIME","DISTANCE", "DEPARTURE_DELAY","ARRIVAL_DELAY"]]
data.dropna(inplace=True)

# 明确定义分类特征列
cat_cols = ["AIRLINE","FLIGHT_NUMBER","DESTINATION_AIRPORT","ORIGIN_AIRPORT"]
 
train, test, y_train, y_test = train_test_split(
    data.drop(["ARRIVAL_DELAY"], axis=1), 
    data["ARRIVAL_DELAY"],
    random_state=10, 
    test_size=0.25
)
# 初始化模型时传入分类特征配置,verbose=0用于关闭训练过程的冗余日志
model = cb.CatBoostRegressor(loss_function='RMSE', cat_features=cat_cols, verbose=0)

param_dist = {
    "max_depth": [10,15],
    "n_estimators": [50, 60],
    "learning_rate": [0.1, 0.15],
}
search = GridSearchCV(estimator=model, param_grid=param_dist, cv=3).fit(train, y_train)
print("\n The best parameters across ALL searched params:\n",search.best_params_)

补充说明:如果偏好使用列索引传入分类特征,必须在训练集、测试集切分完成后,基于训练集的列结构计算索引,避免切分前后列顺序变化导致索引错位。

内容的提问来源于stack exchange,提问作者stats_geek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:48:19