Как выполнить ограниченную оптимизацию по модели масштабированной регрессии? - PullRequest
6 голосов
/ 15 марта 2020

Предположим, что я применяю регрессию гауссовского процесса к своим данным. Прежде чем приступить к подгонке модели, я выполню какую-то особенность. После подбора модели моя цель теперь - применить минимизацию, которую я намерен ограничить для некоторых значений, по кривой, чтобы найти оптимальный X. Однако здесь возникает вопрос, применяю ли я какую-то особенность При проектировании моих данных и подгонке модели к этому конкретному набору данных, когда я применяю ограниченную оптимизацию, как мне узнать, для каких значений я хочу ограничить ее, так как я изменил свои входные данные. Если это звучит странно, может помочь следующее объяснение с некоторым кодом:

Предположим, у меня есть данные:

# X (theta, alpha1, alpha2)
array([[ 9.07660169,  0.61485493,  1.70396493],
       [ 9.51498486, -5.49212002, -0.68659511],
       [10.45737558, -2.2739529 , -2.03918961],
       [10.46857663, -0.4587848 ,  0.54434441],
       [ 9.10133699,  8.38066374,  0.66538822],
       [ 9.17279647,  0.36327109, -0.30558115],
       [10.36532505,  0.87099676, -7.73775872],
       [10.13681026, -1.64084098, -0.09169159],
       [10.38549264,  1.80633583,  1.3453195 ],
       [ 9.72533357,  0.55861224,  0.74180309])

# y
array([4.93483686, 5.66226844, 7.51133372, 7.54435854, 4.92758927,
       5.0955348 , 7.26606153, 6.86027353, 7.36488184, 6.06864003])

Затем я применяю какую-то конструкцию функций, в этом случае простое MinMaxScaler:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)           
scaler = MinMaxScaler()           
scaler.fit(X_train)            
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)

Затем я подгоняю модель к своим данным:

kernel = C(1.0, (1e-4, 1e4))*RBF(10,(1e-3,1e3))
model = GaussianProcessRegressor(kernel = kernel, n_restarts_optimizer = 5,optimizer='fmin_l_bfgs_b')           
model.fit(X_train,y_train)

Теперь я выполняю ограниченную минимизацию модели подгонки. Обратите внимание, что я ограничиваю theta для постоянного значения, равного девяти. Поэтому мотивация этого поста, так как я устанавливаю theta, ограниченную значением, основанным на образце, прежде чем подгонять кривую до процесса проектирования элементов.

bnds = np.array([(theta_bin,theta_bin),(data_alpha1_bin.min(),data_alpha1_bin.max()),
                 (data_alpha2_bin.min(), data_alpha2_bin.max())])        
x0 = [theta_bin,0,0]
residual_plant = minimize(lambda x: -model.predict(np.array([x])), x0, method='SLSQP',bounds=bnds)

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

1 Ответ

2 голосов
/ 31 марта 2020

Как только вы установите scaler, просто продолжайте его использовать. Поскольку ваше преобразование только масштабируется без вращения, преобразованная координата theta останется постоянной.

residual_plant = minimize(lambda x: -model.predict(scaler.transform(x)), scaler.transform(x0), method='SLSQP',bounds=bnds)

Кстати, вы намеревались написать:

model.fit(X_train_scaled,y_train)

верно? В противном случае вы тренируетесь по оригинальным координатам без масштабирования. Который также кажется le git в этом случае. Я не вижу реальной необходимости в масштабировании. Но я полагаю, что вам нужно добавить normalize_y=True к георадару, так как он предполагает нулевое среднее значение наблюдаемых целевых значений, и это не относится к предоставленной вами выборке данных.

...