使用 MLPRegressor 与 KerasRegressor 获得的结果明显不同

如何解决使用 MLPRegressor 与 KerasRegressor 获得的结果明显不同

当使用相同的回归数据集时,我看到 MLPRegressor 与 KerasRegressor 之间获得的结果截然不同。当然,这可能是我对库的理解,因此我将不胜感激任何可以提供的见解。

以下导入对于这两个示例就足够了:

from sklearn.datasets import make_classification,make_regression
from sklearn.model_selection import train_test_split
from sklearn.utils.multiclass import type_of_target
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import KFold
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV,RandomizedSearchCV
from keras.wrappers.scikit_learn import KerasClassifier,KerasRegressor

数据集创建:

X,y = make_regression(n_samples=590,n_features=180,n_targets=1,n_informative=99,random_state=1)


X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.10,random_state = 99)

# Check target variable(s) type.
print(f'Training target: {type_of_target(y_train)}')
print(f'Test / validation target: {type_of_target(y_test)}')

MLPRegressor:

def create_mlpregressor_nn_model(features=180,classes = 1,activation = 'relu',solver = 'adam'):
    
    # Set number of neurons in hidden layer to (number of attributes + number of classes) / 2 + 1.
    
    num_hl_neurons = int(((features + classes) / 2) + 1)
    hl_neurons = (num_hl_neurons,)
    
    # Create NN model,setting dimensions according to the number of features + classes.
    
    model = MLPRegressor(activation=activation,solver=solver,hidden_layer_sizes=hl_neurons)
    
    return model


model = create_mlpregressor_nn_model(features=180,classes = 1)

# For MLP only
batch_size = [int(len(X_train)*.09),int(len(X_train)*.2),int(len(X_train)*.45),int(len(X_train)*.9)]
solver = ['sgd','adam','lbfgs']
activation = ['identity','logistic','relu','tanh']

# For regression.
kfold = KFold(n_splits = 10)

scale = StandardScaler()
clf = Pipeline([('scaler',scale),('model',model)])

param_grid = dict(model__solver=solver,model__activation=activation,model__batch_size=batch_size)

grid = RandomizedSearchCV(estimator=clf,param_distributions=param_grid,n_jobs=-1,cv=kfold,n_iter = 15,refit = True)

grid_result = grid.fit(X_train,y_train)

print("Best accuracy of : %f with parameters: %s" % (grid_result.best_score_,grid_result.best_params_))
acc_means = grid_result.cv_results_['mean_test_score']
acc_stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean,stdev,param in zip(acc_means,acc_stds,params):
    print("%f (%f) with: %r" % (mean,param))

运行 Jupyter notebook 时,我得到:

Best accuracy of : 1.000000 with parameters: {'model__solver': 'lbfgs','model__batch_size': 238,'model__activation': 'identity'}
nan (nan) with: {'model__solver': 'sgd','model__batch_size': 47,'model__activation': 'relu'}
nan (nan) with: {'model__solver': 'sgd','model__batch_size': 106,'model__activation': 'relu'}
1.000000 (0.000000) with: {'model__solver': 'lbfgs','model__activation': 'identity'}
0.899176 (0.020401) with: {'model__solver': 'sgd','model__activation': 'logistic'}
nan (nan) with: {'model__solver': 'lbfgs','model__activation': 'tanh'}
nan (nan) with: {'model__solver': 'lbfgs','model__activation': 'logistic'}
0.101420 (0.024553) with: {'model__solver': 'adam','model__activation': 'logistic'}
-0.022715 (0.025394) with: {'model__solver': 'adam','model__batch_size': 477,'model__activation': 'logistic'}
0.024706 (0.038960) with: {'model__solver': 'adam','model__activation': 'tanh'}
0.892599 (0.020349) with: {'model__solver': 'sgd','model__activation': 'logistic'}
0.107719 (0.025551) with: {'model__solver': 'adam','model__activation': 'tanh'}
nan (nan) with: {'model__solver': 'sgd','model__activation': 'relu'}
0.213053 (0.025807) with: {'model__solver': 'adam','model__activation': 'logistic'}

我在运行这段代码时确实发现可以执行,在 Python 3.7.4 命令行中执行时,我遇到了许多错误和失败:

/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py:536: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details: 
AttributeError: 'str' object has no attribute 'decode'

  FitFailedWarning)


/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/extmath.py:151: RuntimeWarning: overflow encountered in matmul
  ret = a @ b
/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/extmath.py:151: RuntimeWarning: invalid value encountered in matmul
  ret = a @ b
/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/neural_network/_base.py:195: RuntimeWarning: overflow encountered in square
  return ((y_true - y_pred) ** 2).mean() / 2
/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/extmath.py:151: RuntimeWarning: overflow encountered in matmul
  ret = a @ b
/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/extmath.py:151: RuntimeWarning: invalid value encountered in matmul
  ret = a @ b


joblib.externals.loky.process_executor._RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/joblib/externals/loky/process_executor.py",line 431,in _process_worker
    r = call_item()
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/joblib/externals/loky/process_executor.py",line 285,in __call__
    return self.fn(*self.args,**self.kwargs)
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/joblib/_parallel_backends.py",line 595,in __call__
    return self.func(*args,**kwargs)
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/joblib/parallel.py",line 263,in __call__
    for func,args,kwargs in self.items]
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/joblib/parallel.py",in <listcomp>
    for func,kwargs in self.items]
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py",line 544,in _fit_and_score
    test_scores = _score(estimator,y_test,scorer)
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py",line 591,in _score
    scores = scorer(estimator,y_test)
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/metrics/_scorer.py",line 89,in __call__
    score = scorer(estimator,*args,**kwargs)
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/metrics/_scorer.py",line 371,in _passthrough_scorer
    return estimator.score(*args,**kwargs)
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/metaestimators.py",line 116,in <lambda>
    out = lambda *args,**kwargs: self.fn(obj,**kwargs)
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/pipeline.py",line 619,in score
    return self.steps[-1][-1].score(Xt,**score_params)
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/base.py",line 424,in score
    y_type,_,_ = _check_reg_targets(y,y_pred,None)
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/metrics/_regression.py",line 86,in _check_reg_targets
    y_pred = check_array(y_pred,ensure_2d=False,dtype=dtype)
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py",line 578,in check_array
    allow_nan=force_all_finite == 'allow-nan')
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py",line 60,in _assert_all_finite
    msg_dtype if msg_dtype is not None else X.dtype)
ValueError: Input contains NaN,infinity or a value too large for dtype('float64').
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_search.py",line 710,in fit
    self._run_search(evaluate_candidates)
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_search.py",line 1484,in _run_search
    random_state=self.random_state))
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_search.py",line 689,in evaluate_candidates
    cv.split(X,groups)))
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/joblib/parallel.py",line 1054,in __call__
    self.retrieve()
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/joblib/parallel.py",line 933,in retrieve
    self._output.extend(job.get(timeout=self.timeout))
  File "/Users/me/opt/anaconda3/lib/python3.7/site-packages/joblib/_parallel_backends.py",line 542,in wrap_future_result
    return future.result(timeout=timeout)
  File "/Users/me/opt/anaconda3/lib/python3.7/concurrent/futures/_base.py",line 428,in result
    return self.__get_result()
  File "/Users/me/opt/anaconda3/lib/python3.7/concurrent/futures/_base.py",line 384,in __get_result
    raise self._exception
ValueError: Input contains NaN,infinity or a value too large for dtype('float64').

这些已经在 J​​upyter 中被屏蔽了。

KerasRegressor:

# Function to create Keras NN model
def create_nn_model(features=180,problem_type = 'regression',hl_act = 'relu',optimizer = 'SGD'):
    
    if problem_type == 'bin_class':
        ol_act = 'sigmoid'
        loss = 'binary_crossentropy'
        metrics = ['accuracy']
        ol_neurons = 1
    
    if problem_type == 'multi_class':
        ol_act = 'softmax'
        loss = 'categorical_crossentropy'
        metrics = ['accuracy']
        ol_neurons = classes
    
    if problem_type == 'regression':
        ol_act = 'linear'
        loss = 'mean_squared_logarithmic_error'
        # loss = 'mean_absolute_error'
        # https://machinelearningmastery.com/how-to-choose-loss-functions-when-training-deep-learning-neural-networks/
        metrics = ['accuracy']
        ol_neurons = 1
        
    # Set number of neurons in hidden layer to (number of attributes + number of classes) / 2 + 1.
    
    hl_neurons = ((features + classes) / 2) + 1
    
    # Create NN model,setting dimensions according to the number of features.
    model = Sequential()
    model.add(Dense(hl_neurons,input_dim=features,activation=hl_act))
    model.add(Dense(ol_neurons,activation=ol_act))
    # Compile model
    model.compile(loss=loss,optimizer=optimizer,metrics=metrics)
    return model

model = KerasRegressor(build_fn=create_nn_model,epochs=100,verbose=0)

batch_size = [int(len(X_train)*.10),int(len(X_train)*.25),int(len(X_train)*.5),len(X_train)]
optimizer = ['SGD','RMSprop','Adam','Adamax']
hl_act = ['relu','tanh','sigmoid']

# For regression.
kfold = KFold(n_splits = 10)

scale = StandardScaler()
clf = Pipeline([('scaler',model)])

param_grid = dict(model__batch_size=batch_size,model__optimizer=optimizer,model__hl_act=hl_act)

grid = RandomizedSearchCV(estimator=clf,param))

从中我得到了更合理的结果:

Best accuracy of : -4.229532 with parameters: {'model__optimizer': 'RMSprop','model__hl_act': 'sigmoid','model__batch_size': 53}
-7.041340 (0.853295) with: {'model__optimizer': 'RMSprop','model__hl_act': 'tanh','model__batch_size': 265}
-4.229532 (0.371514) with: {'model__optimizer': 'RMSprop','model__batch_size': 53}
-8.552750 (2.028292) with: {'model__optimizer': 'SGD','model__batch_size': 53}
-7.737438 (0.674679) with: {'model__optimizer': 'SGD','model__hl_act': 'relu','model__batch_size': 265}
-4.977238 (0.629483) with: {'model__optimizer': 'Adam','model__batch_size': 53}
-10.943363 (1.486120) with: {'model__optimizer': 'Adamax','model__batch_size': 531}
-7.668005 (0.871349) with: {'model__optimizer': 'Adam','model__batch_size': 265}
-6.301838 (0.568332) with: {'model__optimizer': 'Adam','model__batch_size': 132}
-8.018414 (1.006902) with: {'model__optimizer': 'Adamax','model__batch_size': 53}
-9.676513 (4.129568) with: {'model__optimizer': 'RMSprop','model__batch_size': 531}
-4.614404 (0.351684) with: {'model__optimizer': 'Adam','model__batch_size': 53}
-9.935071 (1.156778) with: {'model__optimizer': 'Adamax','model__batch_size': 265}
-7.074733 (0.820876) with: {'model__optimizer': 'RMSprop','model__batch_size': 531}
-6.467388 (0.719459) with: {'model__optimizer': 'Adam','model__batch_size': 265}
-10.112093 (1.242853) with: {'model__optimizer': 'Adamax','model__batch_size': 53}

我使用 MLPClassifier 和 KerasClassifier 对二进制和多类数据集做了类似的处理,结果都如预期的那样,结果非常相似。

使用相同的数据集,并且仅根据所使用的 docs 使用有效的超参数,我对这个问题感到茫然。

谁能给点建议?

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

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res