Оптимизация гиппараметров регрессии гауссовского процесса с использованием поиска по сетке Python

Я начал изучать гауссову регрессию с помощью библиотеки Sklearn, используя свои собственные точки данных, как указано ниже. хотя я получил результат, он неточный, потому что я не выполнял оптимизацию гиперпараметров. Я сделал несколько поисков в Google и написалgridsearchкод. Но код работает не так, как ожидалось. Я не знаю, где я сделал ошибку, пожалуйста, помогите заранее и спасибо.

Пример входных и выходных данных представлен следующим образом

X_tr= [10.8204  7.67418 7.83013 8.30996 8.1567  6.94831 14.8673 7.69338 7.67702 12.7542 11.847] 
y_tr= [1965.21  854.386 909.126 1094.06 1012.6  607.299 2294.55 866.316 822.948 2255.32 2124.67]
X_te= [7.62022  13.1943 7.76752 8.36949 7.86459 7.16032 12.7035 8.99822 6.32853 9.22345 11.4751]

X_tr, y_tr а также X_te являются точками обучающих данных и являются значениями изменения формы и имеют тип "Массив float64"

Вот мой код поиска по сетке

from sklearn.model_selection import GridSearchCV

                tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],   
                     'C': [1, 10, 100, 1000]},
                    {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]

scores = ['precision', 'recall']

for score in scores:
    print("# Tuning hyper-parameters for %s" % score)
    print()

    clf = GridSearchCV(
        gp(), tuned_parameters, scoring='%s_macro' % score
    )
    clf.fit(X_tr, y_tr)

Вот пример моего кода без оптимизации гиперпараметров:

import sklearn.gaussian_process as gp
kernel = gp.kernels.ConstantKernel(1.0, (1e-1, 1e3)) * gp.kernels.RBF(10.0, (1e-3, 1e3))
model = gp.GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10, alpha=0.1, normalize_y=True)

X_tr=np.array([X_tr])
X_te=np.array([X_te])
y_tr=np.array([y_tr])

model.fit(X_tr, y_tr)
params = model.kernel_.get_params()
X_te = X_te.reshape(-1,1)
y_pred, std = model.predict(X_te, return_std=True)

1 ответ

В предоставленном вами фрагменте кода было несколько проблем, приведенный ниже является рабочим примером:

from  sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.gaussian_process.kernels import RBF,DotProduct
import numpy as np

X_tr= np.array([10.8204 ,7.67418, 7.83013, 8.30996, 8.1567 , 6.94831 ,14.8673, 7.69338, 7.67702 ,12.7542, 11.847])
y_tr= np.array([1965.21 , 854.386, 909.126 ,1094.06, 1012.6 , 607.299, 2294.55 ,866.316 ,822.948 ,2255.32 ,2124.67])
X_te= np.array([7.62022 , 13.1943, 7.76752, 8.36949, 7.86459, 7.16032 ,12.7035 ,8.99822 ,6.32853 ,9.22345 ,11.4751])


param_grid = [{"alpha": [1e-2, 1e-3],
              "kernel": [RBF(l) for l in np.logspace(-1, 1, 2)]},
              {"alpha": [1e-2, 1e-3],
               "kernel":[DotProduct(sigma_0) for sigma_0 in np.logspace(-1, 1, 2)]}
              ]

# scores for regression
scores = ['explained_variance', 'r2']

gp = GaussianProcessRegressor()
for score in scores:
    print("# Tuning hyper-parameters for %s" % score)
    print()

    clf = GridSearchCV(estimator=gp, param_grid=param_grid,cv=4,
                       scoring='%s' % score)
    clf.fit(X_tr.reshape(-1, 1), y_tr)
    print(clf.best_params_)

Теперь я хотел бы разбить его, чтобы дать некоторые пояснения. Первая часть - это данные. Вам понадобится больше данных (предположительно, вы привели здесь только образец), но вам также необходимо будет масштабировать их, чтобы гауссовский процесс работал эффективно.

Вторая часть - это param_grid. Сетка параметров может быть словарем или списком словарей. Я использовал список словарей, поскольку похоже, что вы заинтересованы в тестировании производительности различных ядер. Детализация сетки параметров очень низкая, когда вы добавляете больше данных, я бы рекомендовал увеличить детализацию, добавив больше тестовых переменных дляalpha и увеличение np.logpspace шаги, а также границы.

Третья часть - это результаты тестирования. В приведенном выше фрагменте у вас были баллы для алгоритмов классификации. Я использовал баллы для регрессии, поскольку вас интересует регрессия.

Четвертая часть запускает модель. Он должен напечатать лучшие параметры для каждой оценки. Я не мог получить никаких надежных результатов, потому что набор данных был действительно ограничен. Обратите внимание на изменение формыX_tr ввод как одномерный.

Другие вопросы по тегам