微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的调优模型的得分明显不是最优的负?

如何解决为什么我的调优模型的得分明显不是最优的负?

我正在尝试调整一个堆叠回归器,其中包括一个构成决策树的层、一个随机森林和一个深度网络,以及一个作为搅拌器的 xgbregressor。

我的调优程序如下

import os
import random
import numpy as np
import tensorflow as tf
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import StackingRegressor
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeRegressor
from scikeras.wrappers import KerasRegressor
import xgboost

########## Reproducibility
seed_value= 0
os.environ['PYTHONHASHSEED']=str(seed_value)
random.seed(seed_value)
np.random.seed(seed_value)
tf.random.set_seed(seed_value)

########## Data pre-processing
housing = fetch_california_housing()

X_train,X_test,y_train,y_test = train_test_split(housing.data,housing.target,train_size=0.8,test_size=0.2)

scaler = StandardScaler()

X_train = scaler.fit_transform(X_train)
X_test = scaler.fit_transform(X_test)

########## Models synthesis
def build_model():
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.InputLayer(input_shape=X_train.shape[1:]))
    model.add(tf.keras.layers.Batchnormalization(momentum=0.999))
    model.add(tf.keras.layers.Dense(48,tf.keras.activations.selu,kernel_initializer="lecun_normal"))
    model.add(tf.keras.layers.Batchnormalization(momentum=0.999))
    model.add(tf.keras.layers.Dense(48,kernel_initializer="lecun_normal"))
    model.add(tf.keras.layers.Batchnormalization(momentum=0.999))
    model.add(tf.keras.layers.Dense(1,kernel_initializer="lecun_normal"))
    optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
    model.compile(loss="mae",optimizer=optimizer,metrics=["mse"])
    return model

dnn_reg = KerasRegressor(model=build_model())

rnd_reg = DecisionTreeRegressor(max_depth=5,min_samples_leaf=1,max_leaf_nodes=9)

rf_reg = RandomForestRegressor(n_estimators=500,max_leaf_nodes=16)

stack_reg = StackingRegressor(estimators=[("rnd",rnd_reg),("rf",rf_reg),("dnn",dnn_reg)],final_estimator=xgboost.XGBRegressor())

param_spec = {
    "final_estimator__max_depth": np.arange(1,7).tolist(),"final_estimator__learning_rate": np.arange(3e-4,7e-2).tolist(),}

stack_search_cv = RandomizedSearchCV(stack_reg,param_spec,n_jobs=-1,n_iter=10,cv=5,verbose=True)

stack_search_cv.fit(X_train,y_train)

print(stack_search_cv.best_params_)
print(stack_search_cv.best_score_)

报告所需超参数的以下值

max_depth: 5,learning_rate: 0.0003

但是模型的分数是负的。这很奇怪,因为原始模型(包括所有认值的超参数)的分数是正的。有人可以解释我在这里做错了什么吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。