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

使用RandomizedSearchCV调参RandomForest时因回归器返回浮点数致F1评分报错

问题分析与解决方案

这问题我碰到过好多次,核心原因其实特别直白——你用回归模型去处理二分类任务了!

为什么会报错?

你选的RandomForestRegressor是用来预测连续数值的模型,它输出的是0到1之间的浮点数;而你指定的评分指标f1是分类任务专属指标,它要求模型输出的是离散的类别标签(你的目标变量state是True/False的二值类别)。两者不匹配,就会抛出Classification metrics can't handle a mix of binary and continuous targets这个错误。

正确的解决步骤

直接把回归模型换成分类模型就行,具体修改如下:

  1. 替换模型类:把RandomForestRegressor换成RandomForestClassifier
  2. 保持参数搜索配置不变:你定义的random_grid里的参数对分类器同样适用,不需要修改
  3. 重新运行随机搜索

修改后的完整代码:

import numpy as np
from sklearn.ensemble import RandomForestClassifier  # 这里替换了模型类
from sklearn.model_selection import RandomizedSearchCV

# 你的参数网格完全不用改
n_estimators = [int(x) for x in np.linspace(start = 200, stop = 2000, num = 10)]
max_features = ['auto', 'sqrt']
max_depth = [int(x) for x in np.linspace(10, 110, num = 11)]
max_depth.append(None)
min_samples_split = [2, 5, 10]
min_samples_leaf = [1, 2, 4]
bootstrap = [True, False]
random_grid = {'n_estimators': n_estimators, 
               'max_features': max_features, 
               'max_depth': max_depth, 
               'min_samples_split': min_samples_split, 
               'min_samples_leaf': min_samples_leaf, 
               'bootstrap': bootstrap}

# 初始化分类器
rf = RandomForestClassifier(random_state = 42)
# 随机搜索配置不变,scoring='f1'完美适配分类任务
rf_random = RandomizedSearchCV(estimator = rf, 
                               param_distributions = random_grid, 
                               scoring = 'f1', 
                               n_iter = 100, 
                               cv = 5, 
                               verbose=2, 
                               random_state=42, 
                               n_jobs = -1)

# 拟合模型,这次就不会报错了
rf_random.fit(X_train, y_train)

额外说明(不推荐的替代方案)

如果你非要用回归模型(完全没必要,分类器更适配),可以自定义一个评分函数,先把回归输出的浮点数通过阈值(比如0.5)转为二值标签,再计算f1:

from sklearn.metrics import f1_score, make_scorer

def regressor_f1_score(y_true, y_pred):
    # 把回归输出转为二值标签
    y_pred_binary = y_pred >= 0.5
    return f1_score(y_true, y_pred_binary)

# 用自定义评分函数替换默认的scoring参数
custom_scorer = make_scorer(regressor_f1_score)
rf_random = RandomizedSearchCV(estimator = RandomForestRegressor(random_state=42),
                               param_distributions = random_grid,
                               scoring = custom_scorer,
                               n_iter = 100, 
                               cv = 5, 
                               verbose=2, 
                               random_state=42, 
                               n_jobs = -1)

但还是那句话,直接用RandomForestClassifier才是最合理的选择,它会自动输出类别标签,完美适配f1评分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:52:46