多项式线性回归,我哪里错了?

Posted

技术标签:

【中文标题】多项式线性回归,我哪里错了?【英文标题】:Polynomial Linear Regression,Where am i going wrong? 【发布时间】:2020-06-20 16:41:11 【问题描述】:

我正在做一个课程作业,问题是:

编写一个函数,在训练数据 X_train 上拟合 0 到 9 度的多项式线性回归模型。对于每个模型,计算训练数据和测试数据的 R2R2(确定系数)回归分数,然后返回这两个数组都在一个元组中。

这个函数应该返回一个 numpy 数组的元组 (r2_train, r2_test)。两个数组的形状都应该是 (10,)

我的代码:` 从 sklearn.linear_model 导入线性回归

from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics.regression import r2_score


np.random.seed(0)
n = 15
x = np.linspace(0,10,n) + np.random.randn(n)/5
y = np.sin(x)+x/6 + np.random.randn(n)/10


X_train, X_test, y_train, y_test = train_test_split(x, y, random_state=0)
def answer_two():

def answer_two():
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics.regression import r2_score

# Your code here


def r2_traintest(deg):  

    poly=PolynomialFeatures(deg)
    model=LinearRegression()
    X_f=poly.fit_transform(X_train.reshape(-1,1))

    a=model.fit(X_f,y_train)


    dee=a.predict(poly.fit_transform(X_train.reshape(-1,1)))

    deez=r2_score(dee,y_train)

    gin=a.predict(poly.transform(X_test.reshape(-1,1)))

    mint=r2_score(gin,y_test)

    return deez,mint


lst=[]
lsts=[]

for x in range(0,10,1):

    lst.append(r2_traintest(x)[0])

    lsts.append(r2_traintest(x)[1])


return (np.array(lst),np.array(lsts))

不幸的是,这给了我一个错误的答案,我是否遗漏了什么,请帮忙。

【问题讨论】:

你能提供一个输入和预期输出的例子吗?对我来说,代码看起来不错,但我会用一个函数而不是 2 来编写它,因为拟合两次模型是没有意义的(此外,您正在测试数据集中进行 fit_transform (应该只是使用模型进行转换)适合 r2_trainscore) 是的,我已经编辑了问题,请立即查看。我也是编码新手,所以请原谅我,我更擅长编写体面的代码。 【参考方案1】:

看来您正在反转 r2_score 函数中的参数。必须是r2_score(y_true, y_pred)

这是我的代码:

import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics.regression import r2_score
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

def fit_poly(deg):
    poly = PolynomialFeatures(deg)
    model = LinearRegression()
    X_poly = poly.fit_transform(X_train.reshape(-1, 1))
    model.fit(X_poly, y_train)

    y_pred_train = model.predict(poly.fit_transform(X_train.reshape(-1, 1)))
    r2_train = r2_score(y_train, y_pred_train)

    y_pred_test = model.predict(poly.transform(X_test.reshape(-1, 1)))
    r2_test = r2_score(y_test, y_pred_test)

    return r2_train, r2_test


np.random.seed(0)
n = 15
x = np.linspace(0,10,n) + np.random.randn(n)/5
y = np.sin(x)+x/6 + np.random.randn(n)/10

X_train, X_test, y_train, y_test = train_test_split(x, y, random_state=0)

lst=[]
lsts=[]

for x in range(0,10,1):
    lst.append(fit_poly(x)[0])
    lsts.append(fit_poly(x)[1])

print(lst, lsts)

结果是:

[0.0,0.4292457781234663,0.45109980444082465,0.5871995368779847,0.9194194471769304,0.97578641430682,0.9901823324795082,0.9935250927840416,0.996375453877599,0.9980370625664945] P>

[ - 0.4780864173714179,-0.45237104233936676,-0.0685698414991589,0.005331052945740433,0.7300494281871148,0.8770830091614791,0.9214093981415002,0.9202150411139083,0.6324795282222648,-0.645253216177847] P>

使用您的代码,值有时会高于 1。

顺便说一句,你的新版本代码更清晰,如你所见,我复制粘贴了很多:)

【讨论】:

啊,现在我看到了我的业余错误,非常感谢,我想投赞成票,但我没有声誉,sry。 @sajeera 你总是可以将答案作为解决方案

以上是关于多项式线性回归,我哪里错了?的主要内容,如果未能解决你的问题,请参考以下文章

机器学习系列6 使用Scikit-learn构建回归模型:简单线性回归多项式回归与多元线性回归

R语言回归分析(regression)常见算法:简单线性回归多项式回归多元线性回归多水平回归多输出回归逻辑回归泊松回归cox比例风险回归时间序列分析非线性回归非参数回归稳健回归等

R语言回归分析(regression)常见算法:简单线性回归多项式回归多元线性回归多水平回归多输出回归逻辑回归泊松回归cox比例风险回归时间序列分析非线性回归非参数回归稳健回归等

❤️解决非线性回归问题的机器学习方法总结:多项式线性模型广义线性(GAM)模型回归树模型支持向量回归(SVR)模型

❤️解决非线性回归问题的机器学习方法总结:多项式线性模型广义线性(GAM)模型回归树模型支持向量回归(SVR)模型

多项式回归与模型泛化