簡體   English   中英

通過e1071中R的概率,SVM預測中的“隨機”或非確定性因子是什么?

[英]what is the “random” or non-deterministic factor inside SVM prediction by probabilities in e1071 in R?

我是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為:

        setosa versicolor virginica
150 0.01006306  0.1749947 0.8149423

結果每一輪都在變化。

在這里,我使用前149行作為訓練集,最后一行作為測試。 result1result2中每個類的概率並不完全相同。 我猜測預測期間有一些“隨機”的過程。 這是怎么回事?

我知道如果我在每次調用之前使用相同的數字set.seed() ,則可以修復預測的概率。 我不是“瞄准”固定的預測結果,而只是好奇為什么會發生這種情況以及生成概率預測所需的步驟。

微小的差異並不會對虹膜數據產生很大影響,因為最后一個樣本仍然會被預測為“virginica”。 但是當我的數據(有兩個A類和B類)不是那么“好”時,預測一個未知樣本的概率為0.489和0.521兩次是A類,那將是令人困惑的。

謝謝!

SVM使用交叉驗證步驟來開發概率估計。 步驟源代碼以:

// 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]);
    }

您可以通過在調用之前設置隨機種子來創建“可預測性”:

> 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

但我想起艾默生的警句:“愚蠢的一致性是小腦袋的大人物。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM