2017-09-06 12 views
1

클래스 레이블을 예측하는 것 외에도 예측할 때 새로운 데이터의 각 관찰에 대한 기대치를 반환 할 수 있습니까?캐럿 :: predict()에서 클래스 확률과 예측을 얻는 방법?

library(caret) 
knnFit <- train(Species ~ ., data = iris, method = "knn", 
       trControl = trainControl(method = "cv", classProbs = TRUE)) 

x <- predict(knnFit, newdata = iris) 

예상되는 클래스의 벡터를 반환합니다.

str(x) 
Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... 

내가 확률하려면 다음

x <- predict(knnFit, newdata = iris, type = "prob") 
> head(x) 
    setosa versicolor virginica 
1  1   0   0 
2  1   0   0 
3  1   0   0 
4  1   0   0 
5  1   0   0 
6  1   0   0 

는 캐럿 수익 예측과 확률을 모두 가질 수 있습니다를? 나는 확률 버전의 max.col을 취하여 계산할 수 있다는 것을 알고 있지만 두 가지를 모두 얻을 수있는 방법이 있는지 궁금해했다.

+0

이미'predict() '를 두 번 호출하십시오. 단일 호출이 필요한 경우 도우미 함수를 작성하십시오. 문제가 무엇인지 여기에서 이해할 수 있는지 잘 모르겠습니다. – MrFlick

+0

@MrFlick 왜냐하면 저는 실제로 10M 이상의 기록을 예측하고 있기 때문에 시간이 매우 중요합니다. 가능한가? –

+0

아니요. 'caret :: predict.train'에서 소스를 볼 수 있습니다. 유형에 따라 if/else 분기가 명확하게 있습니다. 두 번 전화하는 것이 너무 느립니다? 시간 있니? 내 말은, 당신은 모든 소스 코드를 살펴보고 자신의 코드를 해킹 할 수 있지만 C++ 등의 R 함수를 다시 구현하지 않으면 훨씬 더 빠를 것이라고 확신합니다. – MrFlick

답변

0

답변에 대한 의견을 말합니다. 예상 확률 테이블을 생성 한 후에는 실제로 클래스를 가져 오기 위해 예측 함수를 두 번 실행할 필요가 없습니다. which.max 함수 (빠른 실행)를 적용하여 클래스 열을 추가하도록 요청할 수 있습니다. 그러면 각 행에 대해 확률이 가장 높은 행의 이름 (세 개의 행에 하나)이 지정됩니다. 요청에 따라

당신은 모두 정보와이 표를 얻을 :

library(dplyr) 
predict(knnFit, newdata = iris, type = "prob") %>% 
    mutate('class'=names(.)[apply(., 1, which.max)]) 
# a random sample of the resulting table: 
####  setosa versicolor virginica  class 
#### 18  1 0.0000000 0.0000000  setosa 
#### 64  0 0.6666667 0.3333333 versicolor 
#### 90  0 1.0000000 0.0000000 versicolor 
#### 121  0 0.0000000 1.0000000 virginica 

추신 :이 dplyr 또는 magrittr 패키지에서 배관 연산자를 사용합니다. 점 .은 이전 명령의 결과를 다시 사용할 때 나타냅니다.