1
$\begingroup$

When I was tried to finish the exercise of 9.R SVMs in R of ISLR course(https://lagunita.stanford.edu/courses/HumanitiesSciences/StatLearning/Winter2016/). I found that my result is not in accordance with the answer.

The problem is: In this problem, you will use simulation to evaluate (by Monte Carlo) the expected misclassification error rate given a particular generating model. Let y i be equally divided between classes 0 and 1, and let x i ∈ R 10 be normally distributed.

Given yi=0 , x i ∼ N 10 ( 0 , I 10 ) . Given yi=1, xi ∼ N 10 ( μ , I 10 ) with μ= ( 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 ) .

Now, we would like to know the expected test error rate if we fit an SVM to a sample of 50 random training points from class 1 and 50 more from class 0. We can calculate this to high precision by 1) generating a random training sample to train on, 2) evaluating the number of mistakes we make on a large test set, and then 3) repeating (1-2) many times and averaging the error rate for each trial.

Use svm in the e1071 package with the default settings (the default kernel is a radial kernel). What is the expected test error rate of this method (to within 10%)?

And this is my R code:

set.seed(1001)
counts = 100
errate = rep(0, counts)
for(i in 1:counts){
  x = matrix(rnorm(100 * 10), ncol = 10)
  y = c(rep(0, 50), rep(1, 50))
  x[y == 1, 1:5] = x[y == 1, 1:5] + 1
  dat = data.frame(x = x, y = as.factor(y))
  svm.fit = svm(y ~ ., data = dat, kernel = "linear", cost = 1)

  xtest = matrix(rnorm(100 * 10), ncol = 10)
  ytest = sample(c(0, 1), 100, rep = TRUE)
  xtest[ytest == 1, 1:5] = x[ytest == 1, 1:5] + 1
  testdat = data.frame(x = xtest, y = as.factor(ytest))

  ypred = predict(svm.fit, testdat)
  result = table(predict = ypred, truth = testdat$y)
  errate[i] = 1 - (result[1] + result[4]) / 100
}
mean(errate)

The result is 0.1196 but the right answer is 0.16350. Which part of my code is wrong?

$\endgroup$
1
$\begingroup$

Your code seems to be correct. But, instead of adding +1 to stimulated test set you are adding it to the training set by mistake. Replace x with xtest and you will get the answer. Moreover adding +1 for the first five columns to differentiate class 0 from class 1 is not really required. Instead, we can do it in a single line for all the columns. xtest[ytest == 1,] = xtest[ytest == 1,] + 1.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.