我想使用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)
但我的问题和以前一样。
答案 0 :(得分:2)
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个方程式,
第一个是标准岭回归权重估计。 第二个是部分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)