假设我正在对我的数据应用高斯过程回归。在拟合模型之前,我将进行一些特征工程。模型拟合后,我的目标是现在进行最小化,我打算对某些值进行约束,以在曲线上找到最优的X。然而,这里引出了一个问题,如果我对数据进行了一些特征工程,并且将模型拟合到那特定的一组数据上,当我应用约束优化时,我应该如何找出我要约束的那些值,因为我已经改变了输入数据。如果这听起来很 confusing,以下带有一些代码的解释可能会有所帮助:
假设我有以下数据:
# 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])# yarray([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
)设置了一个给定的常数值的约束,那么,当曲线拟合到缩放的特征上,而我根据缩放前的值设置的约束,我该如何处理?
回答:
一旦你有了拟合好的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)
对吗?否则你是在没有缩放的原始坐标上进行训练。这在这种情况下似乎也是合法的。我看不出真正需要缩放的理由。但我认为你需要在GPR中添加normalize_y=True
,因为它假设观测目标值的均值为零,而根据你提供的数据样本并非如此。