我想实现一个在MLJ中也能工作的核岭回归。此外,我希望能够选择使用特征向量或像Python中的sklearn那样使用预定义的核矩阵。
当我运行这段代码时
const MMI = MLJModelInterface MMI.@mlj_model mutable struct KRRModel <: MLJModelInterface.Deterministic mu::Float64 = 1::(_ > 0) kernel::String = "linear"endfunction MMI.fit(m::KRRModel,verbosity::Int,K,y) K = MLJBase.matrix(K) fitresult = inv(K+m.mu*I)*y cache = nothing report = nothing return (fitresult,cache,report)end N = 10K = randn(N,N)K = K*Ka = randn(N)y = K*a + 0.2*randn(N)m = KRRModel()kregressor = machine(m,K,y)cv = CV(; nfolds=6, shuffle=nothing, rng=nothing)evaluate!(kregressor, resampling=cv, measure=rms, verbosity=1)
evaluate!
函数会对K的不同行子集进行评估。由于表示定理,核岭回归的非零系数数量等于样本数量。因此,可以使用缩减尺寸的矩阵K[train_rows,train_rows]
来代替K[train_rows,:]
。
为了表示我正在使用核矩阵,我会设置m.kernel = ""
。当m.kernel = ""
时,如何让evaluate!
同时选择列和行来形成一个较小的矩阵?
这是我第一次使用MLJ,我希望尽可能少地进行修改。
回答:
引用我在Julia Discourse上从@ablaom那里得到的答案
evaluate!
的预期用途是通过子抽样观察来估计与某些监督学习模型相关的泛化误差,就像交叉验证中的常见用例一样。遗憾的是,evaluate!
没有自然的方式来进行特征子抽样。https://alan-turing-institute.github.io/MLJ.jl/dev/evaluating_model_performance/
仅供参考:有一个实现了MLJ模型接口的核回归版本,即来自包https://github.com/lalvim/PartialLeastSquaresRegressor.jl的核偏最小二乘回归