2017-04-17 54 views
2

所以我需要使用交叉驗證來進行主要組件迴歸,並且我無法在Python中找到這樣做的包。我編寫了自己的PCR類,但是當對R的pls軟件包進行測試時,它的性能明顯更差,對高維數據(〜50000個特徵)要慢得多,我仍然不確定爲什麼,但這是另一個問題。因爲我所有的其他代碼是在Python和節省時間的考慮,我決定最好的辦法可能只是能夠編寫利用PLS包河這裏的R函數的功能是:在Python中訪問R用戶定義的函數

R_pls <-function(X_train,y_train,X_test){ 
    library(pls) 
    X<-as.matrix(X_train) 
    y<-as.matrix(y_train) 
    tdata<-data.frame(y,X=I(X)) 
    REGmodel <- pcr(y~X,scale=FALSE,data=tdata,validation="CV") 
    B<-RMSEP(REGmodel) 
    C<-B[[1]] 
    q<-length(C) 
    degs<-c(1:q) 
    allvals<-C[degs%%2==0] 
    allvals<-allvals[-1] 
    comps<-which.min(allvals) 
    xt<-as.matrix(X_test) 
    ndata<-data.frame(X=I(xt)) 
    ypred_test<-as.data.frame(predict(REGmodel,ncomp=comps,newdata=ndata,se.fit=TRUE)) 
    ntdata<-data.frame(X=I(X)) 
    ypred_train<-as.data.frame(predict(REGmodel,ncomp=comps,newdata=ntdata,se.fit=TRUE)) 
    data_out=list(ypred_test=ypred_test,ypred_train=ypred_train) 
    return(data_) 
} 

所以我發現了大量有關如何訪問函數中構建的R的信息,但無法爲這種情況找到任何東西。所以我並列如下:

import rpy2.robjects as ro 
prs=ro('R_pls') 

其中R_pls是上面的R函數。這將產生

TypeError: 'module' object is not callable. 

任何想法,我怎麼可能會得到這個工作,或者我願意接受建議,如果有可能是一個更好的方法。

由於

+0

我很確定在sklearn中存在偏最小二乘迴歸和PCA分解。你有沒有試過看看它是否有你需要的東西?我意識到這不是對標題的直接回答,但它可能會有所幫助。 –

+0

所以我確實使用sklearn.decomposition PCA和sklearn線性迴歸來構建PCR類,但是這並不等於R,我不知道爲什麼? –

+0

儘管它本身並不執行pcr,但您可以隨時計算組件,然後用h2o執行lm/glm模型,該模型同時具有python和R接口。 http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/pca.html –

回答

2

考慮導入abitraryř用戶定義函數爲具有包rpy2的SignatureTranslatedAnonymousPackage (STAP)

from rpy2.robjects.numpy2ri import numpy2ri, pandas2ri 
from rpy2.robjects.packages import STAP 
# for rpy2 < 2.6.1 
# from rpy2.robjects.packages import SignatureTranslatedAnonymousPackage as STAP  

r_fct_string = """  
R_pls <- function(X_train, y_train, X_test){ 
    library(pls) 

    X <- as.matrix(X_train) 
    y <- as.matrix(y_train) 
    xt <- as.matrix(X_test) 

    tdata <- data.frame(y,X=I(X)) 
    REGmodel <- pls::pcr(y~X,scale=FALSE,data=tdata,validation="CV") 
    B <- RMSEP(REGmodel) 
    C <- B[[1]] 
    q <- length(C) 
    degs <- c(1:q) 
    allvals <- C[degs%%2==0] 
    allvals <- allvals[-1] 
    comps <- which.min(allvals) 
    ndata <- data.frame(X=I(xt)) 

    ypred_test <- as.data.frame(predict(REGmodel,ncomp=comps,newdata=ndata,se.fit=TRUE)) 
    ntdata <- data.frame(X=I(X)) 
    ypred_train <- as.data.frame(predict(REGmodel,ncomp=comps,newdata=ntdata,se.fit=TRUE)) 
    data_out <- list(ypred_test=ypred_test, ypred_train=ypred_train) 

    return(data_out) 
} 
""" 

r_pkg = STAP(r_fct_string, "r_pkg") 

# CONVERT PYTHON NUMPY MATRICES TO R OBJECTS 
r_X_train, r_y_train, r_X_test = map(numpy2ri, py_X_train, py_y_train, py_X_test) 

# PASS R OBJECTS INTO FUNCTION (WILL NEED TO EXTRACT DFs FROM RESULT) 
p_res = r_pkg.R_pls(r_X_train, r_y_train, r_X_test) 

或者,可以輸出功能作爲@agstudy顯示here如果功能被保存在單獨的.R腳本然後像任何Python函數一樣調用它。

import rpy2.robjects as ro 
robjects.r('''source('my_R_pls_func.r')''') 

r_pls = ro.globalenv['R_pls'] 

# CONVERT PYTHON NUMPY MATRICES TO R OBJECTS 
r_X_train, r_y_train, r_X_test = map(numpy2ri, py_X_train, py_y_train, py_X_test) 

# PASS R OBJECTS INTO FUNCTION (WILL NEED TO EXTRACT DFs FROM RESULT) 
p_res = r_pls(r_X_train, r_y_train, r_X_test)