我正在尝试使用 scikit-optimize 来调整 scikit-learn 多层感知回归器 (MLPRegressor) 的超参数。但是,问题是 scikit-optimize 似乎将分类变量列表转换为 numpy 数组,这会导致问题,因为隐藏层数和其中的点数表示为元组,而 numpy 不允许存储元组在数组中(没有将它们声明为对象,在这种情况下我不知道该怎么做)。
我的代码是:
from sklearn.neural_network import MLPRegressor
import skopt.space
from skopt import BayesSearchCV
model= MLPRegressor(max_iter=5000)
param_space = {
'hidden_layer_sizes': skopt.space.Categorical([(100,),(50,100,50),(75,50,20)]),
'activation': skopt.space.Categorical(['tanh','relu']),
'solver': skopt.space.Categorical(['adam','lbfgs']),
'alpha': skopt.space.Real(0.0001,1,prior='log-uniform'),
'batch_size': skopt.space.Categorical([64,128,200]), ###
'learning_rate': skopt.space.Categorical(['constant','adaptive'])
}
opt = BayesSearchCV(model, param_space, n_jobs=16, cv=3, verbose=1, scoring='neg_mean_absolute_error')
input_data = get_fingerprint('MACCS',data)
opt.fit(input_data,regr_target)
然后我得到这个错误:
E:\UserPrograms\miniconda3\envs\main\lib\site-packages\skopt\space\transformers.py:169: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequence (这是一个列表或元组的列表或-不推荐使用具有不同长度或形状的元组或 ndarrays)。如果您打算这样做,则必须在创建 ndarray 时指定“dtype=object”。X = np.asarray(X)
完整截图如下:
显然,skopt
正在尝试将分类变量搜索空间中给出的列表转换为 numpy 数组。我曾尝试设置transform='identity'
声明分类空间,但这无济于事。
我该如何解决这个问题?scikit-optimize 的 github 页面似乎在很长一段时间内都处于非活动状态,并且他们没有回应这些问题,所以我认为这是提出这个问题的最佳场所。
(如果您知道 scikit-optimize 的任何其他替代方案可以做到这一点,我也很乐意使用它!)