为什么内置的Ridge回归不能以任何合理的方式预测数据的真实值?

时间:2019-03-31 13:41:45

标签: numpy scikit-learn regression

我正在从事作业任务,该任务旨在比较自我实现的岭回归与ADMM与sklearn软件包的内置功能。尽管我自己的实现可能会很麻烦,但我仍然坚持解释内置函数的输出。

我正在Windows上使用3.7版本的Python。我的目的是预测模型Y = X * Beta + Epsilon中的Y值, 其中Y是包含100个变量的向量,X是矩阵,尺寸为100x2000,样本来自具有设置协方差矩阵的多元正态分布,Beta是向量,其设置值为2000个位置中的5,10或100 在这一点上,我已经尝试过将sklearn.linear_model.Ridge的可传递参数与某些“更简单”的数据进行合理的组合,以进行验证,但无济于事。任何帮助将被申请。

# Function generating problem data:
def generate_task(n,p,cov_rho,b_val,b_k,op=0):
    " Tutaj generujemy macierz X z rozkladu normalnego o zadanych parametrach"
    mean=np.zeros(p)
    " Wersja IID"
    if op==0:
        cov=np.eye(p)
    " Wersja: malejące correlacje"
    if op==1:
        cov=np.fromfunction(lambda i,j:cov_rho**np.abs(i-j),(p,p));
    " Wersja: stale correlacje"
    if op==2:
        cov=np.eye(p)+cov_rho-np.eye(p)*(cov_rho-1)
    Chol=np.linalg.cholesky(cov)
    X=np.random.normal(0,1,(n,p))
    X=X.dot(Chol)
    X=normalise(X)
    B=(n,p+1)
    B=np.ones(B)
    B[:,1:] = X
    X=B
    " Czesc odpowiedzialna za Beta"
    Beta=np.zeros(p+1)
    m=np.arange(p+1)
    np.random.shuffle(m)
    Beta[m[1:b_k]]=b_val
    Beta=Beta.reshape(-1,1)
    " Na koncu generujemy Y zaburzone o epsilon~N(0,1)"
    ep=np.random.multivariate_normal(np.zeros(n), np.eye(n), 1)
    #Y=X.dot(Beta)
    Y=X.dot(Beta)+ep.T
    return Y,X,Beta,ep.T 

Y,X,Beta,ep=generate_task(p,n,0.6,2,10)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33)
clr = Ridge(alpha=0.1, fit_intercept=False, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver='auto')
Y_tr=Y_train.ravel()
Y_te=Y_test.ravel()
clr.fit(X_train,Y_tr)
plt.plot(Y_te, label='Original')
plt.plot(clr.predict(X_test), label = 'Estimate')

这将导致: https://i.imgur.com/4n5okPo.png 与我自己的功能相比: https://i.imgur.com/cieCcFu.png 我觉得这不太可能,尤其是当所述内置函数针对不同任务返回几乎相同的结果时。 编辑:出现的情况下,本示例使用IID矩阵,但问题与相应情况相同。

0 个答案:

没有答案