
Keras Tuner 的 SklearnTuner 不支持 validation_split 参数,它依赖预设的交叉验证(如 StratifiedKFold)完成超参评估,无需手动指定训练/验证比例。
keras tuner 的 `sklearntuner` 不支持 `validation_split` 参数,它依赖预设的交叉验证(如 `stratifiedkfold`)完成超参评估,无需手动指定训练/验证比例。
在使用 keras-tuner 调优 scikit-learn 模型(如 RandomForestClassifier)时,一个常见误区是试图沿用 Keras 原生模型调优中的 validation_split 语义。实际上,SklearnTuner 的设计范式完全不同:它原生基于 scikit-learn 的交叉验证协议,而非单次留出(hold-out)验证。
✅ 正确做法:依靠 cv 参数驱动评估
你已在初始化 SklearnTuner 时传入 cv=model_selection.StratifiedKFold(5) —— 这意味着每次超参数组合的性能评估,都会自动执行 5 折分层交叉验证:每折中 4/5 数据用于训练、1/5 用于验证,并最终取 5 次验证得分的平均值作为该超参的“score”。因此:
-
validation_split=0.3是无效且不被接受的参数(直接报TypeError); - 所有数据划分逻辑均由
cv对象内部管理,无需额外干预; -
X_train和y_train将被完整传递给 CV 过程,无须预先切分。
✅ 修改后的正确代码示例:
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics, model_selection
import keras_tuner
def build_model(hp):
return RandomForestClassifier(
n_estimators=hp.Choice("n_estimators", [50, 100, 150]),
random_state=42,
min_samples_split=hp.Choice("min_samples_split", [2, 5]),
min_samples_leaf=hp.Choice("min_samples_leaf", [2, 5])
)
tuner = keras_tuner.tuners.SklearnTuner(
oracle=keras_tuner.oracles.BayesianOptimizationOracle(
objective=keras_tuner.Objective('score', 'max'),
max_trials=10
),
hypermodel=build_model,
scoring=metrics.make_scorer(metrics.accuracy_score),
cv=model_selection.StratifiedKFold(n_splits=5, shuffle=True, random_state=42), # 显式指定 shuffle & random_state 更佳
directory='.',
project_name='random_forest_search'
)
# ✅ 移除 validation_split —— 直接传入完整训练集
tuner.search(X_train, y_train)⚠️ 注意事项:
-
不要预先划分验证集:
SklearnTuner期望接收原始训练数据(X_train,y_train),自行按 CV 策略拆分; -
scoring必须兼容 CV:确保传入的scorer(如make_scorer(accuracy_score))符合 sklearn 接口规范,能被cross_val_score正确调用; - 若需最终在独立测试集上评估最优模型,请在
tuner.get_best_models(num_models=1)[0].fit(X_train, y_train)后,单独调用predict或score于X_test/y_test; -
BayesianOptimizationOracle会基于 CV 得分最大化目标('score'),自动探索超参空间,无需人工干预验证逻辑。
简言之:SklearnTuner 的“验证”即交叉验证,cv 是唯一权威配置项;删掉 validation_split,你的调优流程就完全合规了。

















