R의 Kernlab의 SVM에 predict ()를 사용하는 데 도움이 되십니까?

StackOverflow https://stackoverflow.com/questions/1753299

  •  20-09-2019
  •  | 
  •  

문제

나는 사용하려고한다 kernlab R 패키지 지원 벡터 머신 (SVM). 매우 간단한 예를 들어 두 가지 교육 데이터가 있습니다. A와 B.

(A와 B는 유형입니다 matrix - 그래프의 인접 행렬입니다.)

그래서 A+B를 취하고 커널 매트릭스를 생성하는 함수를 작성했습니다.

> km
         [,1]     [,2]
[1,] 14.33333 18.47368
[2,] 18.47368 38.96053

이제 사용합니다 kernlab'에스 ksvm 내 예측 모델을 생성하는 기능. 지금, 나는 단지 일을하기 위해 대담한 일을하려고 노력하고 있습니다 - 나는 훈련 오류에 대해 걱정하지 않습니다.

그래서, 질문 1: 모델을 올바르게 생성하고 있습니까? 합리적으로?

# y are my classes. In this case, A is in class "1" and B is in class "-1"
> y
[1]  1 -1

> model2 =  ksvm(km, y, type="C-svc", kernel = "matrix");
> model2
Support Vector Machine object of class "ksvm" 

SV type: C-svc  (classification) 
 parameter : cost C = 1 

[1] " Kernel matrix used as input."

Number of Support Vectors : 2 

Objective Function Value : -0.1224 
Training error : 0 

여태까지는 그런대로 잘됐다. 사용자 정의 커널 매트릭스를 만들고 해당 행렬을 사용하여 KSVM 모델을 만들었습니다. 우리는 훈련 데이터가 "1"및 "-1"로 표시되어 있습니다.

이제 예측하려면 :

> A
     [,1] [,2] [,3]
[1,]    0    1    1
[2,]    1    0    1
[3,]    0    0    0

> predict(model2, A)
Error in as.matrix(Z) : object 'Z' not found

어 오. 이것은 괜찮습니다. 정말로 예상됩니다. "예측"은 행렬이 아닌 일종의 벡터를 원합니다.

그래서 몇 가지를 시도해 봅시다.

> predict(model2, c(1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, c(1,1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, c(1,1,1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, c(1,1,1,1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, km)
Error in as.matrix(Z) : object 'Z' not found

위의 테스트 중 일부는 무의미하지만 그것은 내 요점입니다. 내가 무엇을하든, 나는 예측 ()가 내 데이터를보고 예측을 할 수 없습니다. 스칼라는 작동하지 않으며 벡터는 작동하지 않습니다. 2x2 행렬은 작동하지 않으며 3x3 행렬도 작동하지 않습니다.

여기서 내가 뭘 잘못하고 있니?

(일단 KSVM을 알아 내면 원한다, 그런 다음 내 테스트 데이터가 제정신/합리적/수학적으로 건전한 방식으로 해당 형식을 준수 할 수 있는지 확인할 수 있습니다.)

도움이 되었습니까?

해결책

지지 벡터 머신이 커널 매트릭스를 "사용"할 수있는 방법에 대해 생각한다면, 당신이 시도한 방식으로 실제로 이것을 할 수 없다는 것을 알 수 있습니다 (:-).

나는 처음으로 Kernlab + A 커널 매트릭스를 사용할 때 실제로 이것으로 조금 어려움을 겪었습니다. 우연히도, 그것은 또한 그래프 커널을위한 것이 었습니다!

어쨌든, SVM이 커널 기능을 계산하는 방법을 모르기 때문에 새로운 (테스트) 예제 사이에 이미 이러한 값을 계산해야하며 훈련 단계에서 지원 벡터로 선택한 예제가 필요합니다. .

따라서 커널 매트릭스를 계산해야합니다. 모두 함께 당신의 예제. 나중에 일부를 훈련시키고 적절한 경우 커널 매트릭스에서 행 + 열을 제거하여 다른 사람들을 테스트합니다. 코드로 보여 드리겠습니다.

예제 코드를 사용할 수 있습니다 ksvm 작업 영역을 일부 데이터와 함께로드하는 문서 :

library(kernlab)
example(ksvm)

플롯이 그려지고 예제를 마무리하기 위해 몇 번의 반환을 누르야하지만 이제 작업 공간에 커널 매트릭스가 있어야합니다. K. 우리는 그것을 복구해야합니다 y 라벨에 사용해야하는 벡터 (예제의 다른 코드에 의해 짓밟 혔으므로) :

y <- matrix(c(rep(1,60),rep(-1,60)))

이제 테스트에 사용할 예제의 하위 집합을 선택하십시오.

holdout <- sample(1:ncol(K), 10)

이 시점부터 나는 다음에 갈 것이다.

  1. 훈련 커널 매트릭스를 만듭니다 trainK 원본에서 K 커널 매트릭스.
  2. 내 교육 세트에서 SVM 모델을 만듭니다 trainK
  3. 모델에서 발견 된지지 벡터를 사용하여 테스트 커널 매트릭스를 만듭니다. testK ... 이것은 이상한 부분입니다. 코드를 보면 kernlab 지원 벡터 지수를 어떻게 사용하는지 보려면 왜 이런 식으로 수행되는지 알 수 있습니다. 다른 방법 으로이 방법을 수행하는 것이 가능할 수도 있지만 문서/예제는 보지 못했습니다. 예측 커널 매트릭스를 사용하여 여기서 "어려운 방법"을하고 있습니다.
  4. SVM을 사용하여 이러한 기능을 예측하고 정확도를보고하십시오.

코드는 다음과 같습니다.

trainK <- as.kernelMatrix(K[-holdout,-holdout])  # 1
m <- ksvm(trainK, y[-holdout], kernel='matrix')  # 2
testK <- as.kernelMatrix(K[holdout, -holdout][,SVindex(m), drop=F]) # 3
preds <- predict(m, testK)  # 4
sum(sign(preds) == sign(y[holdout])) / length(holdout) # == 1 (perfect!)

그것은 단지 그것을해야합니다. 행운을 빕니다!

아래 의견에 대한 응답

K [-holdout, -holdout]은 무엇을 의미합니까? ( "-"는 무엇을 의미합니까?)

벡터가 있다고 상상해보십시오 x, 그리고 당신은 요소 1, 3 및 5를 검색하려고합니다.

x.sub <- x[c(1,3,5)]

모든 것을 검색하려면 x 제외하고 요소 1, 3 및 5, 당신은 다음과 같습니다.

x.sub <- x[-c(1,3,5)]

그래서 K[-holdout,-holdout] 모든 행과 열을 반환합니다 K 제외하고 행을 위해 우리는 보류하고 싶습니다.

as.kernelmatrix의 주장은 무엇입니까?

예, 나는 두 가지 명령을 하나로 내려 놓았습니다.

testK <- as.kernelMatrix(K[holdout, -holdout][,SVindex(m), drop=F])

이제 모델을 교육 했으므로 테스트 예제와 함께 새로운 커널 매트릭스를 제공하려고합니다. K[holdout,] 훈련 예제에 해당하는 행만 제공합니다. K, 및 모든 열 K.

SVindex(m) 귀하의 지원 벡터의 인덱스를 제공합니다. 원래의 훈련 매트릭스 - 그 행/cols는 holdout 제거됨. 따라서 그 열 지수가 올바른 경우 (예 : 올바른 SV 열 참조), 먼저 holdout 열.

어쨌든, 아마도 이것은 더 분명 할 것입니다.

testK <- K[holdout, -holdout]
testK <- testK[,SVindex(m), drop=FALSE]

지금 testK 우리의 행만이 있습니다 테스트 예제 및지지 벡터에 해당하는 열. testK[1,1] 첫 번째 테스트 예제와 첫 번째지지 벡터 사이에 커널 함수의 값이 계산됩니다. testK[1,2] 첫 번째 테스트 예제와 두 번째지지 벡터 등 사이에 커널 기능 값이 있습니다.

@wrahool의 의견에 답변하려면 업데이트 (2014-01-30)

내가 이것을 가지고 놀았을 때 이후로 오랜 시간이 지났으므로 kernlab::ksvm 약간 녹슨이지만 원칙적으로 이것은 정확해야합니다 :-) ... 여기에 간다 :

요점은 무엇입니까 testK <- K[holdout, -holdout] - 테스트 세트에 해당하는 열을 제거하지 않습니까?

예. 짧은 대답은 원한다면 predict 커널 매트릭스를 사용하면 치수 인 A 행렬을 공급해야합니다. rows ~에 의해 support vectors. 행렬의 각 행 (예측하려는 새 예제)에 대해 열의 값은 단순히 해당 예제와지지 벡터 사이에서 평가 된 커널 행렬의 값입니다.

전화 SVindex(m) 차원에서 주어진지지 벡터의 인덱스를 반환합니다. 원래의 교육 데이터.

그래서 먼저 testK <- K[holdout, -holdout] 나에게 줘 testK 내가 예측하려는 예제의 행이있는 매트릭스와 열은 모델이 훈련 된 동일한 예제 (치수)에서 나온 것입니다.

나는 열을 더 서브 세트합니다 testK ~에 의해 SVindex(m) (현재)가 내지지 벡터에 해당하는 열만 제공합니다. 내가 처음으로하지 않았다면 [, -holdout] 선택, 지수가 반환되었습니다 SVindex(m) 올바른 예에 해당하지 않을 수 있습니다 (모두가 N 테스트 예제가 마지막입니다 N 매트릭스의 열).

또한 Drop = False 조건은 정확히 무엇을합니까?

인덱싱 작업이 수행 된 후 리턴 된 객체가 인덱스 된 객체와 동일한 유형이되도록 약간의 방어 코딩입니다.

R에서 2D 차원의 2D (또는 Higher (?)) 객체의 객체 만 색인하면 더 낮은 차원의 객체가 반환됩니다. 나는 통과하고 싶지 않다 numeric 벡터로 predict 그것을 원하기 때문에 matrix

예를 들어

x <- matrix(rnorm(50), nrow=10)

class(x)
[1] "matrix"

dim(x)
[1] 10  5

y <- x[, 1]

class(y)
[1] "numeric"

dim(y)
NULL

마찬가지입니다 data.frameS 등

다른 팁

우선, 나는 사용하지 않았습니다 kernlab 많이. 그러나 단순히 문서를보고 있는데, 나는 predict.ksvm() 방법. 복사 및 붙여 넣기 및 스크린 인쇄물 생략 :

 ## example using the promotergene data set
 data(promotergene)

 ## create test and training set
 ind <- sample(1:dim(promotergene)[1],20)
 genetrain <- promotergene[-ind, ]
 genetest <- promotergene[ind, ]

 ## train a support vector machine
 gene <-  ksvm(Class~.,data=genetrain,kernel="rbfdot",\
               kpar=list(sigma=0.015),C=70,cross=4,prob.model=TRUE)

 ## predict gene type probabilities on the test set
 genetype <- predict(gene,genetest,type="probabilities")

꽤 똑바로 보이는 것 같습니다 : 무작위 샘플링을 사용하여 훈련 세트를 생성하십시오. genetrain 그리고 그것의 보완 genetest, 그런 다음 적합합니다 ksvm 그리고 a predict() 적합을 사용하는 방법과 일치하는 형식의 새 데이터. 이것은 매우 표준입니다.

당신은 찾을 수 있습니다 탈자 부호 Max Kuhn의 패키지. 다양한 회귀, 분류 및 기계 학습 방법 및 패키지를위한 일반적인 평가 및 테스트 프레임 워크를 제공합니다. kernlab, 몇 개의 비네팅과 a JSS 종이.

Steve Lianoglou가 옳습니다.

Kernlab에서는 약간 유선이며 예측할 때는 각 테스트 예제와지지 벡터 사이에 입력 커널 매트릭스가 필요합니다. 이 매트릭스를 직접 찾아야합니다.

예를 들어, 테스트 매트릭스 [NXM], 여기서 n은 테스트 샘플의 수이고 m은 학습 된 모델의지지 벡터 수입니다 (svindex (model)의 순서로 순서).

예제 코드

trmat <- as.kernelMatrix(kernels[trainidx,trainidx])
tsmat <- as.kernelMatrix(kernels[testidx,trainidx])

#training
model = ksvm(x=trmat, y=trlabels, type = "C-svc", C = 1)

#testing
thistsmat = as.kernelMatrix(tsmat[,SVindex(model)])
tsprediction = predict(model, thistsmat, type = "decision")

커널은 입력 커널 매트릭스입니다. TrainIdx 및 TestIDX는 교육 및 테스트를위한 ID입니다.

솔루션의 요소에서 레이블을 직접 구축하십시오. KSVM 모델 (M)과 데이터를 원래 교육 형식 (D)으로 가져가는이 대체 예측 방법을 사용하십시오.

predict.alt <- function(m, d){
  sign(d[, m@SVindex] %*% m@coef[[1]] - m@b)
}

K는 a입니다 kernelMatrix 훈련을 위해. 유효성 검사를 위해, 실행하면 predict.alt 교육 데이터에서 대체 예측 방법이 KSVM이 반환 한 적합 값과 함께 값을 전환 함을 알 수 있습니다. 기본 예측 변수는 예상치 못한 방식으로 동작합니다.

aux <- data.frame(fit=kout@fitted, native=predict(kout, K), alt=predict.alt(m=kout, d=as.matrix(K))) 
sample_n(aux, 10)
    fit  native alt
1     0       0  -1
100   1       0   1
218   1       0   1
200   1       0   1
182   1       0   1
87    0       0  -1
183   1       0   1
174   1       0   1
94    1       0   1
165   1       0   1
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top