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
相关产品推荐
相关产品推荐

