2016-05-05 54 views
0

我想使用scikit_learn库的KernelRidge类来拟合我的数据的非线性回归模型。但我很困惑我该如何做到这一点。获取KernelRidge类的拟合模型的参数scikit学习库

from sklearn.kernel_ridge import KernelRidge 
import numpy as np 
n_samples, n_features = 20,1 
rng = np.random.RandomState(0) 
y = rng.randn(n_samples) 
X = rng.randn(n_samples, n_features) 
Krr = KernelRidge(alpha=1.0, kernel='linear',degree = 4) 
Krr.fit(X, y) 

我期待为这个模型设置5个系数,我怎么能得到它们?

上述代码将一维数据转换为四维空间并将模型拟合到数据。我认为根据训练数据应该找到最好的c0,c1,c2,c3,c4。我的问题是我如何访问c0,c1,c2,c3,c4?

编辑:

我在这里我上面的代码犯了一个错误,内核参数应该本着7

Krr = KernelRidge(alpha=1.0, kernel='polynomial',degree = 4) 

“多项式”,而不是“线性”但我的问题是,像以前一样。

+0

也许应该记录_get_params() – Moritz

+0

否此函数将返回我为KernelRidge类设置的所有参数,一旦我定义它。 – sandra

回答

0
http://scikit-learn.org/stable/modules/generated/sklearn.kernel_ridge.KernelRidge.html#sklearn.kernel_ridge.KernelRidge

dual_coef_:阵列,形状= [n_features]或[n_targets,n_features]

所以

Krr.dual_coef_ 

应该这样做。

编辑:

确定,所以dual_coef_是在内核空间中的系数。对于线性内核,内核K(X,X')是X.T * X。所以这是一个N×N矩阵,因此系数的数量等于y的维数。

有3个方程,我们需要了解,

enter image description here

首先是标准岭回归权重估计。 第二个是部分kernalised版本,关系链接两个是第三个等式。

dual_coef_返回式。因此的阿尔法具有权重向量在“正常”的空间,而不是因为它是返回的内核空间,你需要做的XT * Krr.dual_coef_

我们可以检查这是正确的,因为如果内核是线性的,则KRR和Ridge回归相同。

import numpy as np 
from sklearn.kernel_ridge import KernelRidge 
from sklearn.linear_model import Ridge 


rng = np.random.RandomState(0) 
X = 5 * rng.rand(100, 1) 
y = np.sin(X).ravel() 

Krr = KernelRidge(alpha=1.0, kernel='linear', coef0=0) 
R = Ridge(alpha=1.0,fit_intercept=False) 
Krr.fit(X, y) 
R.fit(X, y) 
print np.dot(X.transpose(),Krr.dual_coef_) 
print R.coef_ 

我看到这个输出:

[-0.03997686] 
[-0.03997686] 

将展示它们是等价的(你必须改变拦截选项为默认值模型之间的差异)。

由于程度参数被忽略,正如我在评论中提到的,在这种情况下系数应该是1x1(按原样)。

如果你想确切地知道什么是特定型号的回报,我建议看在GitHub上的源代码,我认为这是获得的这个东西是如何工作的更深层次的理解的唯一途径。https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/kernel_ridge.py

此外,对于非线性内核,权重的直觉很容易丢失,所以如果你这样做,总是从第一原则开始。

+0

我之前检查过dual_coef_属性,但不是返回长度为5的数组,因为我们有5个系数(度数= 4),返回数组的长度与目标数组“y”相同,并且所有元素都与“y ”。换句话说,它返回目标训练数据阵列。 – sandra

+0

我在包括x和y向量的问题中添加了我所有的代码 – sandra

+0

实际上,如果您使用非多项式内核,则度参数首先是无意义的。 degree:float,default = 3 多项式内核的等级。被其他内核忽略。其次,我认为你正在概念化KRR的功能。我会编辑我的答案,因为这对于评论来说太冗长了。 – Chris