[英]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行作为训练集,最后一行作为测试。 result1
和result2
中每个类的概率并不完全相同。 我猜测预测期间有一些“随机”的过程。 这是怎么回事?
我知道如果我在每次调用之前使用相同的数字set.seed()
,则可以修复预测的概率。 我不是“瞄准”固定的预测结果,而只是好奇为什么会发生这种情况以及生成概率预测所需的步骤。
微小的差异并不会对虹膜数据产生很大影响,因为最后一个样本仍然会被预测为“virginica”。 但是当我的数据(有两个A类和B类)不是那么“好”时,预测一个未知样本的概率为0.489和0.521两次是A类,那将是令人困惑的。
谢谢!
// 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.