2014-12-11 5 views
1

Java에서 예측에 사용할 수 있도록 pmml 라이브러리를 사용하여 캐럿 임의의 포리스트 모델을 내보내 려합니다. 여기에 내가 얻는 오류가 재현되어 있습니다.PMML 오류로 캐럿 모델 임의 포리스트

data(iris) 
require(caret) 
require(pmml) 
rfGrid2 <- expand.grid(.mtry = c(1,2)) 
fitControl2 <- trainControl(
    method = "repeatedcv", 
    number = NUMBER_OF_CV, 
    repeats = REPEATES) 

model.Test <- train(Species ~ ., 
    data = iris, 
    method ="rf", 
    trControl = fitControl2, 
    ntree = NUMBER_OF_TREES, 
    importance = TRUE, 
    tuneGrid = rfGrid2) 

print(model.Test) 
pmml(model.Test) 

Error in UseMethod("pmml") : 
    no applicable method for 'pmml' applied to an object of class "c('train', 'train.formula')" 
나는 잠시 동안 인터넷 검색을했다

, 그리고 일반 PMML 라이브러리에 PMML 수출에 대해 실제로 약간의 정보를 찾을 수 있습니다에서 랜덤 포레스트 :

methods(pmml) 
[1] pmml.ada   pmml.coxph  pmml.cv.glmnet pmml.glm   pmml.hclust  pmml.itemsets  pmml.kmeans  
[8] pmml.ksvm   pmml.lm   pmml.multinom  pmml.naiveBayes pmml.nnet   pmml.randomForest pmml.rfsrc  
[15] pmml.rpart  pmml.rules  pmml.svm 

그것은 직접 랜덤 포레스트 모델을 사용하여 작동하지만,하지 캐럿은 하나를 훈련 시켰습니다.

library(randomForest) 
iris.rf <- randomForest(Species ~ ., data=iris, ntree=20) 
# Convert to pmml 
pmml(iris.rf) 
# this works!!! 
str(iris.rf) 

List of 19 
$ call   : language randomForest(formula = Species ~ ., data = iris, ntree = 20) 
$ type   : chr "classification" 
$ predicted  : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... 
... 

str(model.Test) 
List of 22 
$ method  : chr "rf" 
$ modelInfo :List of 14 
    ..$ label  : chr "Random Forest" 
    ..$ library : chr "randomForest" 
    ..$ loop  : NULL 
    ..$ type  : chr [1:2] "Classification" "Regression" 
... 

답변

4

당신은 train 또는 train.formula 유형 (즉. 이것이 당신의 model.Test 객체의 유형)으로 pmml 메소드를 호출 할 수 없습니다.

train 방법에 대한 캐럿 설명서는 finalModel 필드로 최고의 모델에 액세스 할 수 있다고 말합니다. 그런 다음 해당 객체에 pmml 메소드를 호출 할 수 있습니다.

rf = model.Test$finalModel 
pmml(rf) 

불행히도, 캐럿의 "매트릭스 인터페이스"를 이용하여 RF 모델을 지정하는 것으로 나타났다 (즉. xy 필드를 설정함으로써) 예 (일반적인 "화학식 인터페이스"를 사용하지. 설정 formula 필드). AFAIK, "pmml"패키지는 그러한 RF 모델의 수출을 지원하지 않습니다.

그래서 최상의 선택은 2 단계 접근 방식을 사용하는 것입니다. 먼저, Caret 패키지를 사용하여 데이터 세트에 가장 적합한 RF 매개 변수를 찾습니다. 둘째,이 매개 변수를 사용하여 "공식 인터페이스"를 사용하여 최종 RF 모델을 수동으로 교육하십시오.

+0

덕분에, 그 선은 오류, RF = model.Test $ finalModel PMML (RF) 당신은 무엇을 의미합니까를 반환 수식 인터페이스? randomforest 패키지의 무작위 추출물일까요? –

+1

공식 인터페이스 :'rf = randomForest (Species ~., data = iris)'. 매트릭스 인터페이스 :'rf = randomForest (y = iris [, c ("Species")], x = iris [, c ("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width ")], data = iris)' – user1808924

+0

즉,'pmml' 메서드는 수식 인터페이스를 사용하여 훈련 된 RF 모델 만 받아들입니다. Matrix 인터페이스를 사용하여 트레이닝 한 RF 모델에 오류가 발생합니다. 불행히도, Caret 패키지는 Matrix 인터페이스를 사용합니다. – user1808924

1

당신은 작업을 수행 할 r2pmml package를 사용할 수 있습니다 응답에 대한

library("caret") 
library("r2pmml") 

data(iris) 

train.rf = train(Species ~ ., data = iris, method = "rf") 
print(train.rf) 
r2pmml(train.rf, "/tmp/train-rf.pmml") 
+0

GitHub의 도움말 페이지에서는 r2pmml :'options ("java.parameters"= c ("- Xms4G", "-Xmx8G"))'를로드하기 전에이 작업이 필요하다고 말합니다. 하지만 java.lang.UnsupportedClassVersionError : org/jpmml/rexp/Main : 지원되지 않는 major.minor 버전 51.0' –

+0

이러한 Java 옵션은 JVM 프로세스에 더 많은 메모리를 할당합니다. 대형 RF 모델의 변환 속도가 빨라집니다. 그러나 java.lang.UnsupportedClassVersionError 문제는 오래된 Java 버전을 사용하고 있음을 나타냅니다. 관련 SO 스레드를 참조하십시오 https://stackoverflow.com/questions/33882019/problems-with-r2pmml – user1808924

+0

'java -version'의 셸 실행을 제외하고 "java version"1.7.0_79 " Java (TM) SE 런타임 환경 (빌드 1.7.0_79-b15) " –