为何GridSearchCV得到的MLP回归器结果精度低于RandomizedSearchCV?
MLP调参:RandomizedSearchCV与GridSearchCV结果差异原因分析
问题背景
使用MLP Regressor分别通过RandomizedSearchCV和GridSearchCV进行参数调优时,出现了以下结果:
- RandomizedSearchCV给出的最优参数(隐藏层为
(18,18,18))对应R²值为0.90 - GridSearchCV给出的最优参数(隐藏层为
(17,17,17))对应R²值为0.89
核心原因解析
出现这种差异主要源于以下几点:
- 搜索空间范围不同:
RandomizedSearchCV的参数搜索空间中,隐藏层仅包含(18,)、(18,18)、(18,18,18)三种配置,完全未涉及(17,17,17)。因此它找到的最优解只是自身限定范围内的最优,而GridSearchCV的搜索空间扩展到了(17,17,17)、(18,18,18)、(19,19,19),能在更宽的范围内筛选参数。 - 交叉验证的随机性影响:
RandomizedSearchCV设置了random_state=42固定交叉验证的划分逻辑,而GridSearchCV未指定该参数,导致两者的CV数据集划分方式不同。不同的划分会直接影响模型在验证集上的R²评估结果,进而干扰最优参数的选择。 - MLP训练的细微差异:
即使固定了random_state,不同隐藏层规模的MLP在训练时,参数初始化和收敛过程仍会存在细微差异。(17,17,17)和(18,18,18)的模型复杂度接近,但训练后的模型在验证集上的表现可能因这些差异产生波动。 - 搜索策略的评估次数差异:
RandomizedSearchCV设置了n_iter=100,但它的参数空间总组合数仅为36种(3种激活函数×2种优化器×3种学习率策略×2种正则化系数),因此会对同一参数组合进行多次重复评估,最终取平均性能最优的结果;而GridSearchCV对每个参数组合仅评估一次,单次CV的结果可能存在偶然性。
相关代码实现
RandomizedSearchCV调参代码
from sklearn.neural_network import MLPRegressor from sklearn.model_selection import RandomizedSearchCV mlp = MLPRegressor(random_state=42) param_grid_random = {'hidden_layer_sizes': [(18,), (18,18,), (18,18,18,)], 'activation': ['tanh','relu','logistic'], 'solver': ['sgd', 'adam'], 'learning_rate': ['constant','adaptive','invscaling'], 'alpha': [0.0001, 0.05], 'max_iter': [10000000000], 'early_stopping': [False], 'warm_start': [False]} GS_random = RandomizedSearchCV(mlp, param_distributions=param_grid_random,n_jobs= 1,cv=5, scoring='r2', n_iter=100,random_state=42) GS_random.fit(X_train, y_train) print(GS_random.best_params_)
输出结果:
{'warm_start': False, 'solver': 'adam', 'max_iter': 10000000000, 'learning_rate': 'constant', 'hidden_layer_sizes': (18, 18, 18), 'early_stopping': False, 'alpha': 0.05, 'activation': 'relu'}
GridSearchCV调参代码
from sklearn.neural_network import MLPRegressor from sklearn.model_selection import GridSearchCV mlp = MLPRegressor(random_state=42) param_grid = {'hidden_layer_sizes': [(17,17,17), (18,18,18), (19,19,19)], 'activation': ['tanh','relu','logistic'], 'solver': ['sgd', 'adam'], 'learning_rate': ['constant','adaptive','invscaling'], 'alpha': [0.0001, 0.05], 'max_iter': [10000000000], 'early_stopping': [False], 'warm_start': [False]} GS = GridSearchCV(mlp, param_grid=param_grid,n_jobs= -1,cv=5, scoring='r2') GS.fit(X_train, y_train) print(GS.best_params_)
输出结果:
{'activation': 'relu', 'alpha': 0.05, 'early_stopping': False, 'hidden_layer_sizes': (17, 17, 17), 'learning_rate': 'constant', 'max_iter': 10000000000, 'solver': 'adam', 'warm_start': False}
模型测试代码
mlp_new = MLPRegressor(hidden_layer_sizes=(17, 17,17), max_iter = 10000000000,activation = 'relu', solver = 'adam', learning_rate='constant', alpha=0.05,validation_fraction=0.2,random_state=0,early_stopping=False) mlp_new.fit(X_train, y_train) mlp_new_y_predict = mlp_new.predict((X_test)) mlp_new_y_predict from sklearn import metrics MLP_r_square = metrics.r2_score(y_test,mlp_new_y_predict) print('R-Square for the MLP Regressor is:', MLP_r_square)
内容的提问来源于stack exchange,提问作者JZ0
相关产品推荐
相关产品推荐

