在R的reticulate中无法调用sklearn LocalOutlierFactor的_decision_function
在R的reticulate中调用Scikit-learn LocalOutlierFactor的私有函数
_decision_function 我之前用reticulate对接Scikit-learn时也碰到过一模一样的问题:Python里以下划线开头的私有方法没法直接通过常规的$调用,不过有两个简单可靠的方式能解决这个问题,让你顺利调用_decision_function:
方法1:使用py_get_attr函数获取私有方法
reticulate提供了py_get_attr函数,它可以直接获取Python对象的任意属性(包括私有方法),拿到方法后你就能像调用普通函数一样使用它:
library(reticulate) # 你的原有数据准备和模型初始化代码 n <- 5000 n_outlier <- .05 * n set.seed(11212) inlier <- mvtnorm::rmvnorm(n, mean = c(0,0)) outlier <- mvtnorm::rmvnorm(n_outlier, mean = c(20, 20)) testdata <- rbind(inlier, outlier) smp_size <- floor(0.5 * nrow(testdata)) train_ind <- sample(seq_len(nrow(testdata)), size = smp_size) train_lof <- as.data.frame(testdata[train_ind, ]) test_lof <- as.data.frame(testdata[-train_ind, ]) sklearn.neighbors <- import("sklearn.neighbors") lof1 <- sklearn.neighbors$LocalOutlierFactor(n_neighbors=15) lof1$fit(train_lof) # 获取_decision_function方法 decision_func <- py_get_attr(lof1, "_decision_function") # 调用方法并传入测试数据 test_scores <- decision_func(test_lof)
方法2:用反引号包裹私有方法名直接调用
在R中,如果对象的属性名包含下划线这类特殊字符,可以用反引号(`)把方法名包裹起来,这样reticulate就能正确识别并调用这个私有方法:
# 直接调用私有方法 test_scores <- lof1$`_decision_function`(test_lof)
问题原因说明
Python中以下划线开头的方法只是约定俗成的私有方法,并非真正的强制私有,但reticulate在自动补全和属性暴露时会默认隐藏这类方法,所以直接写lof1$_decision_function会失效。不过通过上述两种方式,我们可以绕开这个限制,直接访问对象的内部属性。
注意事项
Scikit-learn的私有方法属于内部实现细节,未来版本可能会修改或移除,如果你是在生产环境使用,建议优先考虑官方公开的API;如果必须使用私有方法,记得做好版本兼容性测试,避免后续库更新导致代码报错。
内容的提问来源于stack exchange,提问作者Henryk Borzymowski
相关产品推荐
相关产品推荐

