如何使用高斯过程进行二进制分类?

时间:2014-01-09 21:13:57

标签: machine-learning classification scikit-learn gaussian

我知道高斯过程模型最适合回归而不是分类。但是,我仍然希望将高斯过程应用于分类任务,但我不确定将模型生成的预测结​​合起来的最佳方法是什么。我已经回顾了scikit-learn网站上提供的高斯过程分类示例:

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-lean网站上给出的分类示例非常不同(这里重复了网址):

http://scikit-learn.org/stable/auto_examples/gaussian_process/plot_gp_probabilistic_classification_after_regression.html

所以我想知道我在这里是否遗漏了什么。所以,如果有人能够,我将不胜感激:

  1. 关于scikit-learn网站上给出的分类示例:

    1.1解释在这个例子中生成的概率是什么概率?它们是查询实例属于类> 0的概率吗?

    1.2为什么该例子使用累积密度函数而不是概率密度函数?

    1.3为什么该例子在将模型做出的预测输入累积密度函数之前,将均方误差的平方根除以?

  2. 关于我在此列出的基本代码示例,澄清是否对高斯过程模型生成的预测应用简单决策边界是否是进行二进制分类的适当方法?

    < / LI>

    很抱歉这么长的问题,谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

在GP分类器中,功能的标准GP分布被“压扁”,通常使用标准普通CDF(也称为probit function),将其映射到二进制类别的分布。

这个过程的另一种解释是通过一个层次模型(这个paper有推导),从高斯过程中得到一个隐藏变量。

在sklearn的gp库中,看起来y_pred, MSE=gp.predict(xx, eval_MSE=True)的输出是(近似)后验均值(y_pred)和后验差异(MSE)在{{1在任何挤压之前

要获得测试集中某个点属于正类的概率,可以通过应用Normal CDF将xx上的正态分布转换为二进制分布(详见[本文]) )。

概率压缩函数的层次模型由y_pred决策边界定义(标准正态分布围绕0对称,意味着0)。所以你应该设置PHI(0)=.5