我想使用高斯过程实现一个二元分类模型。根据官方文档,我编写了如下代码。
X有2048个特征,Y要么是0要么是1。在优化模型后,我试图评估其性能。
然而,predict_y
方法产生了一个奇怪的结果;预期的pred
应该具有(n_test_samples, 2)的形状,表示类别0和1的概率。但我得到的结果却是(n_test_samples, n_training_samples)。
哪里出错了?
def model(X,Y): ''' X: (n_training_samples, n_features) , my example is (n, 2048) Y: (n_training_samples,) , binary classification ''' m = gpflow.models.VGP( (X, Y), likelihood=gpflow.likelihoods.Bernoulli(), kernel=gpflow.kernels.SquaredExponential() ) opt = gpflow.optimizers.Scipy() opt.minimize(m.training_loss, variables=m.trainable_variables) return mdef evaluate(model,X,Y,accuracy, MCC, Kappa): ''' X: (n_test_samples, n_features) , my example is (n, 2048) Y: (n_test_samples,) , binary classification ''' pred,_ = model.predict_y(X) print('pred.shape is {}'.format(pred)) # I got wired result (num of test samples <X.shape[0]>, num of training samples) accuracy += [accuracy_score(Y, pred)] MCC += [matthews_corrcoef(Y, pred)] Kappa += [cohen_kappa_score(Y, pred)] return accuracy, MCC, Kappa
回答:
我最终找到了原因。原因是VGP模型的Y应该具有(n_training_samples, 1)的形状,而不是(n_training_samples,)。