什么是"随机"通过e1071中R的概率预测SVM中的非确定性因子?

时间:2016-05-21 17:52:23

标签: r svm probability

我是SVM和e1071的新手。我发现每次运行完全相同的代码时结果都不同。

例如:

data(iris)
library(e1071)

model <- svm(Species ~ ., data = iris[-150,], probability = TRUE)
pred <- predict(model, iris[150,-5], probability = TRUE)
result1 <- as.data.frame(attr(pred, "probabilities"))

model <- svm(Species ~ ., data = iris[-150,], probability = TRUE)
pred <- predict(model, iris[150,-5], probability = TRUE)
result2 <- as.data.frame(attr(pred, "probabilities"))

然后我得到了result1

         setosa versicolor virginica
150 0.009704854  0.1903696 0.7999255

result2 as:

        setosa versicolor virginica
150 0.01006306  0.1749947 0.8149423

并且结果每一轮都会发生变化。

这里我使用前149行作为训练集,最后一行作为测试。 result1result2中每个类的概率并不完全相同。我猜测在预测期间有一些过程是&#34;随机&#34;。这是怎么回事?

我知道如果我set.seed()在每次调用之前具有相同的数字,则可以修复预测的概率。我不是&#34;瞄准&#34;对于固定的预测结果,但只是好奇为什么会发生这种情况以及生成概率预测需要采取的步骤。

微小的差异并不会对虹膜数据产生很大影响,因为最后一个样本仍然会被预测为&#34; virginica&#34;。但是当我的数据(有两个A类和B类)不是那个&#34;好&#34;,并且预测一个未知样本的概率为0.489和0.521两次为A类时,它将会令人困惑。

谢谢!

1 个答案:

答案 0 :(得分:2)

SVM在开发概率估计时使用交叉验证步骤。 source code for that step以:

开头
// Cross-validation decision values for probability estimates
static void svm_binary_svc_probability(
    const svm_problem *prob, const svm_parameter *param,
    double Cp, double Cn, double& probA, double& probB)
{
    int i;
    int nr_fold = 5;
    int *perm = Malloc(int,prob->l);
    double *dec_values = Malloc(double,prob->l);

    // random shuffle
    GetRNGstate();
    for(i=0;i<prob->l;i++) perm[i]=i;
    for(i=0;i<prob->l;i++)
    {
        int j = i+((int) (unif_rand() * (prob->l-i))) % (prob->l-i);
        swap(perm[i],perm[j]);
    }

您可以创建&#34;可预测性&#34;通过在呼叫之前设置随机种子:

> data(iris)
> library(e1071)
> set.seed(123)
> model <- svm(Species ~ ., data = iris[-150,], probability = TRUE)
> pred <- predict(model, iris[150,-5], probability = TRUE)
> result1 <- as.data.frame(attr(pred, "probabilities"))
> set.seed(123)
> model <- svm(Species ~ ., data = iris[-150,], probability = TRUE)
> pred <- predict(model, iris[150,-5], probability = TRUE)
> result2 <- as.data.frame(attr(pred, "probabilities"))
> result1
         setosa versicolor virginica
150 0.009114718  0.1734126 0.8174727
> result2
         setosa versicolor virginica
150 0.009114718  0.1734126 0.8174727

但我想起艾默生的警句:&#34;愚蠢的一致性是小脑袋的大人物。&#34;