[英]I'm new to spark,trying to generate the decision tree model in scala and use that model in java to predict.How to load that model in java?
[英]How to use R model in java to predict with multiple models?
我有這個構造函數:
public Revaluator(File model,PrintStream ps) {
modelFile=model;
rsession=Rsession.newInstanceTry(ps, null);
rsession.eval("library(e1071)");
rsession.load(modelFile);
}
我想加載模型並用它預測。 Rsession.newInstanceTry(ps, null);
的問題Rsession.newInstanceTry(ps, null);
總是相同的會話,所以如果我加載另一個模型,如:
Revaluator re1=new Revaluator(new File("model1.RData"),System.out);
Revaluator re2=new Revaluator(new File("model2.RData"),System.out);
re1和re2都使用相同的模型,因為var名稱是model
,所以只加載了最后一個。
評估功能:
public REXP evaluate(Object[] arr){
String expression=String.format("predict(model, c(%s))", J2Rarray(arr));
REXP ans=rsession.eval(expression);
return ans;
}
//J2Rarray just creates a string from the array like "1,2,true,'hello',false"
我需要加載大約250個預測變量,有沒有辦法讓Rsession的每個實例成為一個新的分離R會話?
你還沒有在你的問題中粘貼所有代碼,所以在嘗試下面的(復雜)方法之前,請排除原因,並確保你的字段modelFile
和rsession
沒有聲明為static :-)
如果他們不是:
似乎R會話的創建方式依賴於操作系統。
在Unix上它依賴於R本身的多會話能力,在Windows上它從端口6311開始並檢查它是否仍然是免費的。 如果不是,則端口遞增並再次檢查,如果它是空閑的等等。
檢查空閑端口可能出現問題(您正在使用哪種操作系統?)。
您可以嘗試手動配置端口並顯式啟動不同的本地R服務器,如下所示:
Logger simpleLogger = new Logger() {
public void println(String string, Level level) {
if (level == Level.WARNING) {
p.print("! ");
} else if (level == Level.ERROR) {
p.print("!! ");
}
p.println(string);
}
public void close() {
p.close();
}
};
RserverConf serverConf = new RserverConf(null, staticPortCounter++, null, null, null);
Rdaemon server = new Rdaemon(serverConf, this);
server.start(null);
rsession = Rsession.newInstanceTry(serverConf);
如果這不起作用,請顯示您的Revaluator
類的更多代碼,並提供有關您正在運行的操作系統的詳細信息。 此外,應該有幾個日志輸出(至少如果相應地配置了日志級別)。 請粘貼已記錄的消息。
也許它也可以幫助從Google Code獲取rsession的源代碼並使用調試器在Rsession.begin()
設置斷點。 也許這有助於弄清楚出了什么問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.