高斯过程回归器为所有数据点返回几乎相同的 std

数据挖掘 scikit-学习 高斯过程 主动学习
2022-02-13 22:29:20

我使用高斯过程回归器作为主动学习的回归器,我使用它的标准差来选择下一个训练实例(选择具有最高标准的那个)。但是,回归器返回的 std 值几乎相同,如下所示,这似乎不正确,特别是考虑到算法的性能在学习了 20 个新实例后并没有提高。我使用这个数据集。我这样做的方法是将数据分为训练集、池和测试集,然后使用池数据集绘制下一个信息量最大的实例。池数据集包含大约 40,000 个数据实例,这使得为什么它们都返回几乎相同的标准变得更加奇怪。以下是用于确定要查询哪个实例的函数:

def GP_regression_std(regressor, X_pool):
    _, std = regressor.predict(X_pool, return_std=True)
    query_idx = np.argmax(std)
    print(max(std))
    print(min(std))
    print(query_idx)
    return query_idx, X_pool[query_idx]

以下是调用上述函数的代码

# In this section a Gausian process regressor is used with the ActiveLearner
kernel = RBF(length_scale=1.0, length_scale_bounds=(1e-2, 1e3)) \
         + WhiteKernel(noise_level=1, noise_level_bounds=(1e-10, 1e+1))

regressor = ActiveLearner(
    estimator=GaussianProcessRegressor(kernel=kernel),
    query_strategy=GP_regression_std,
    X_training=X_train, y_training=y_train
)

y_pred = regressor.predict(X_test)
print(mean_squared_error(y_test, y_pred))

n_queries = 10
for idx in range(n_queries):
    query_idx, query_instance = regressor.query(X_pool)
    query_instance = query_instance.reshape(1,-1)
    query_label = y_pool[query_idx].reshape(1,-1)
    regressor.teach(query_instance, query_label)
    X_pool = np.delete(X_pool, query_idx, 0)

y_pred_final = regressor.predict(X_test)
print(mean_squared_error(y_test, y_pred_final))

以下是输出:

39.80552437273547
3.1885401799262976
3.188521246966187
2807
3.1881109991791265
3.1880928244904516
21227
3.1876946235906867
3.1876781696380587
16901
3.18729221237594
3.187276617863699
15687
3.1869024420386807
3.186887562308426
17904
3.186524013419068
3.186510422046729
2204
3.186157844820368
3.1861446681566896
22230
3.1858019593432925
3.185789801369966
17653
3.1854569923377287
3.1854453279443624
37200
3.185121554225284
3.185110784757463
27299
39.89055846241666
0个回答
没有发现任何回复~