我的 ML 課程中有一個關于例外/新奇檢測的專案,并決定研究本文中描述的一類 SVM 演算法:http : //research.microsoft.com/pubs/69731/tr-99-87.pdf . 在e1071R的包中,有一個svm函式似乎支持一類分類。然而,當我嘗試使用它時,預測器總是回傳 false(即使在訓練集上,這是最奇怪的事情)。這是我的代碼:
library(e1071) # for svm classifier
library(IMIFA) # for USPS dataset
library(caret) # for confusion matrices
data(USPSdigits)
digits.train <- USPSdigits$train
digits.train <- digits.train[order(digits.train$V1), ]
digits.train$is.zero[digits.train$V1 == 0] <- "TRUE"
digits.train$is.zero[digits.train$V1 != 0] <- "FALSE"
digits.test <- USPSdigits$test
digits.test <- digits.test[order(digits.test$V1), ]
digits.test$is.zero[digits.test$V1 == 0] <- "TRUE"
digits.test$is.zero[digits.test$V1 != 0] <- "FALSE"
digits.train.features <- digits.train[digits.train$V1 == 0, -c(1, 258)]
digits.train.labels <- digits.train[digits.train$V1 == 0, 258]
digits.train.nu <- 0.5
digits.train.bandwith <- 0.5*256
digits.train.model <- svm(x = digits.train.features, type = 'one-classification', kernel = 'radial', nu = digits.train.nu, gamma = digits.train.bandwith)
digits.train.fitted <- predict(digits.train.model, digits.train.features)
digits.train.confusionMatrix <- table(Predicted = digits.train.fitted, Reference = digits.train.labels)
print(digits.train.confusionMatrix)
digits.test.features <- subset(digits.test, select = -c(is.zero, V1))
digits.test.labels <- digits.test$is.zero
digits.test.fitted <- predict(digits.train.model, digits.test.features)
digits.test.confusionMatrix <- table(Predicted = digits.test.fitted, Reference = digits.test.labels)
print(digits.test.confusionMatrix)
我的輸出是:
> print(digits.train.confusionMatrix)
Reference
Predicted TRUE
FALSE 1194
> print(digits.test.confusionMatrix)
Reference
Predicted FALSE TRUE
FALSE 1648 359
我究竟做錯了什么?
uj5u.com熱心網友回復:
我創建了一個作業示例。調整您自己的命名約定。我使用了一個非常有表現力的命名約定來準確地展示我所做的。
僅對 1 個數字進行訓練會產生許多具有相同值的列。這些作為錯誤回傳svm并且應該被洗掉。該功能nearZeroVar從插入符號是這是一個理想的功能。如果您曾經使用過 recipes 包,它就會被稱為step_nzv.
library(e1071)
# library(caret) # caret used for nearZeroVar function.
# data steps like OP's
digits.train <- USPSdigits$train
digits.test <- USPSdigits$test
digits.train$is.zero[digits.train$V1 == 0] <- "TRUE"
digits.train$is.zero[digits.train$V1 != 0] <- "FALSE"
digits.test$is.zero[digits.test$V1 == 0] <- "TRUE"
digits.test$is.zero[digits.test$V1 != 0] <- "FALSE"
train_the_positives <- subset(digits.train, is.zero == "TRUE")
# get the columns with 99% of the same values
cols_to_remove <- caret::nearZeroVar(train_the_positives, freqCut = 99/1)
svm.model <- svm(train_the_positives[, -cols_to_remove],
type = 'one-classification',
nu = 0.10,
kernel = "radial")
# predictions on train_the_positives set
svm_predictions_on_train_the_positives <- predict(svm.model, train_the_positives[, -cols_to_remove])
table(Predicted = svm_predictions_on_train_the_positives,
Reference = train_the_positives$is.zero)
Reference
Predicted TRUE
FALSE 121
TRUE 1073
# predictions on full train set
svm_prediction_on_full_train_set <- predict(svm.model, digits.train[, -cols_to_remove])
table(Predicted = svm_prediction_on_full_train_set,
Reference = digits.train$is.zero)
Reference
Predicted FALSE TRUE
FALSE 6069 121
TRUE 28 1073
# predictions on test set
svm_prediction_on_test_set <- predict(svm.model, digits.test[, -cols_to_remove])
table(Predicted = svm_prediction_on_test_set,
Reference = digits.test$is.zero)
Reference
Predicted FALSE TRUE
FALSE 1638 68
TRUE 10 291
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368531.html
