我知道高斯过程模型最适合回归而不是分类。然而,我仍然想将高斯过程应用于分类任务,但我不确定什么是对模型生成的预测进行分类的最佳方法。我已经查看了scikit学习网站上的高斯过程分类示例:
http://scikit-learn.org/stable/auto_examples/gaussian_process/plot_gp_probabilistic_classification_after_regression.html
但我发现这个例子令人困惑(我在问题末尾列出了我对这个例子感到困惑的地方)。为了更好地理解,我使用scikit-learn创建了一个非常基本的python代码示例,该示例通过将决策边界应用于高斯过程的预测来生成分类:
#A minimum example illustrating how to use a
#Gaussian Processes for binary classification
import numpy as np
from sklearn import metrics
from sklearn.metrics import confusion_matrix
from sklearn.gaussian_process import GaussianProcess
if __name__ == "__main__":
#defines some basic training and test data
#If the descriptive features have large values
#(i.e., 8s and 9s) the target is 1
#If the descriptive features have small values
#(i.e., 2s and 3s) the target is 0
TRAININPUTS = np.array([[8, 9, 9, 9, 9],
[9, 8, 9, 9, 9],
[9, 9, 8, 9, 9],
[9, 9, 9, 8, 9],
[9, 9, 9, 9, 8],
[2, 3, 3, 3, 3],
[3, 2, 3, 3, 3],
[3, 3, 2, 3, 3],
[3, 3, 3, 2, 3],
[3, 3, 3, 3, 2]])
TRAINTARGETS = np.array([1, 1, 1, 1, 1, 0, 0, 0, 0, 0])
TESTINPUTS = np.array([[8, 8, 9, 9, 9],
[9, 9, 8, 8, 9],
[3, 3, 3, 3, 3],
[3, 2, 3, 2, 3],
[3, 2, 2, 3, 2],
[2, 2, 2, 2, 2]])
TESTTARGETS = np.array([1, 1, 0, 0, 0, 0])
DECISIONBOUNDARY = 0.5
#Fit a gaussian process model to the data
gp = GaussianProcess(theta0=10e-1, random_start=100)
gp.fit(TRAININPUTS, TRAINTARGETS)
#Generate a set of predictions for the test data
y_pred = gp.predict(TESTINPUTS)
print "Predicted Values:"
print y_pred
print "----------------"
#Convert the continuous predictions into the classes
#by splitting on a decision boundary of 0.5
predictions = []
for y in y_pred:
if y > DECISIONBOUNDARY:
predictions.append(1)
else:
predictions.append(0)
print "Binned Predictions (decision boundary = 0.5):"
print predictions
print "----------------"
#print out the confusion matrix specifiy 1 as the positive class
cm = confusion_matrix(TESTTARGETS, predictions, [1, 0])
print "Confusion Matrix (1 as positive class):"
print cm
print "----------------"
print "Classification Report:"
print metrics.classification_report(TESTTARGETS, predictions)
当我运行此代码时,我得到以下输出:
Predicted Values:
[ 0.96914832 0.96914832 -0.03172673 0.03085167 0.06066993 0.11677634]
----------------
Binned Predictions (decision boundary = 0.5):
[1, 1, 0, 0, 0, 0]
----------------
Confusion Matrix (1 as positive class):
[[2 0]
[0 4]]
----------------
Classification Report:
precision recall f1-score support
0 1.00 1.00 1.00 4
1 1.00 1.00 1.00 2
avg / total 1.00 1.00 1.00 6
这个基本示例中使用的方法似乎可以很好地处理这个简单的数据集。但这种方法与我上面提到的scikit精益网站上给出的分类示例非常不同(此处重复url):
http://scikit-learn.org/stable/auto_examples/gaussian_process/plot_gp_probabilistic_classification_after_regression.html
所以我想知道我是不是错过了什么。所以,如果有人能:,我将不胜感激
关于scikit学习网站上给出的分类示例:
1.1解释本例中产生的概率是什么?它们是查询实例属于类>0的概率吗?
1.2为什么该示例使用累积密度函数而不是概率密度函数?
1.3为什么该示例在将模型的预测输入累积密度函数之前,将其除以均方误差的平方根?
关于我在这里列出的基本代码示例,请澄清将简单的决策边界应用于高斯过程模型生成的预测是否是进行二进制分类的合适方法?
很抱歉问了这么长的问题,感谢您的帮助。
在GP分类器中,函数上的标准GP分布被"压扁",通常使用标准正态CDF(也称为probit函数)将其映射到二进制类别上的分布。
对这个过程的另一种解释是通过层次模型(本文有推导),其中隐藏变量来自高斯过程。
在sklearn的gp库中,y_pred, MSE=gp.predict(xx, eval_MSE=True)
的输出似乎是在发生任何挤压之前在xx
中的点处评估的(近似)后验均值(y_pred
)和后验方差(MSE
)。
为了获得测试集中的一个点属于正类的概率,可以通过应用正态CDF将y_pred
上的正态分布转换为二进制分布(详见[本文])。
probit挤压函数的层次模型由0
决策边界定义(标准正态分布围绕0
对称,意思是PHI(0)=.5
)。所以你应该设置DECISIONBOUNDARY=0
。