获取KernelRidge类scikit学习库的拟合模型参数

时间:2016-05-05 07:48:16

标签: python machine-learning scikit-learn

我想使用scikit_learn库的KernelRidge类来拟合我的数据的非线性回归模型。但我很困惑,我怎么能这样做。

 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个系数,我该如何获得它们?

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

编辑:

我在这里的代码上面犯了一个错误,内核参数应该是"多项式"而不是"线性"在第7行。

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

但我的问题和以前一样。

2 个答案:

答案 0 :(得分:2)

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

dual_coef_:array,shape = [n_features]或[n_targets,n_features]

所以

Krr.dual_coef_

应该这样做。

编辑:

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

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

enter image description here

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

dual_coef_返回等式2的alpha。因此,将权重向量放在' normal'空间,而不是返回的内核空间,你需要做X.T * Krr.dual_coef _

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

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

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

答案 1 :(得分:0)

说明 KernelRidge 预测如何工作。希望它能帮助人们理解模型。 Illustration of how KernelRidge prediction works