gpt4 book ai didi

python-3.x - fit_intercept 参数如何通过 scikit learn 影响线性回归

转载 作者:行者123 更新时间:2023-12-04 06:29:19 27 4
gpt4 key购买 nike

我正在尝试拟合线性模型,并且我的数据集被归一化,其中每个特征除以最大可能值。所以值的范围是 0-1。现在我从我之前的帖子中了解到 Linear Regression vs Closed form Ordinary least squares in Pythonfit_intercept 时,scikit learn 中的线性回归产生与 Closed form OLS 相同的结果参数设置为false。我不太明白如何fit_intercept作品。

对于任何线性问题,如果 y 是预测值。

y(w, x) = w_0 + w_1 x_1 + ... + w_p x_p

在整个模块中,向量 w = (w_1, ..., w_p) 表示为 coef_,w_0 表示为intercept_

在封闭形式的 OLS 中,我们也有 w_0 的偏差值,我们在计算点积之前引入向量 X_0=[1...1],并使用矩阵乘法和逆矩阵求解。
w = np.dot(X.T, X) 
w1 = np.dot(np.linalg.pinv(w), np.dot(X.T, Y))

fit_intercept为真,如果 y 是预测值,则 scikit-learn 线性回归可以解决问题。
y(w, x) = w_0 + w_1 x_1 + ... + w_p x_p + b其中 b 是截取项。

使用有何不同 fit_intercept在模型中,何时应该将其设置为 True/False。我试图查看源代码,似乎系数按某种比例进行了归一化。
if self.fit_intercept:
self.coef_ = self.coef_ / X_scale
self.intercept_ = y_offset - np.dot(X_offset, self.coef_.T)
else:
self.intercept_ = 0

这种缩放到底做了什么。我想解释两种方法(线性回归,闭合形式 OLS)中的系数,但因为只是设置 fit_intercept真/假为线性回归给出了不同的结果,我不能完全确定它们背后的直觉。哪个更好,为什么?

最佳答案

让我们退后一步,考虑您说的以下句子:

since just setting fit_intercept True/False gives different result for Linear Regression



这并不完全正确。它可能不同,也可能不同,这完全取决于您的数据。这将有助于理解回归权重的计算。我的意思是字面意思:您的输入( x )数据是什么样的?

了解您的输入数据并理解其重要性,将帮助您了解为什么有时会得到不同的结果,而有时为什么会得到相同的结果

数据设置

让我们设置一些测试数据:
import numpy as np
from sklearn.linear_model import LinearRegression

np.random.seed(1243)

x = np.random.randint(0,100,size=10)
y = np.random.randint(0,100,size=10)

我们的 xy变量如下所示:
   X   Y
51 29
3 73
7 77
98 29
29 80
90 37
49 9
42 53
8 17
65 35

无拦截模型

回想一下,回归权重的计算有一个封闭形式的解,我们可以使用正规方程获得:

regression

使用这种方法,我们得到一个回归系数,因为我们只有 1 个预测变量:
x = x.reshape(-1,1)
w = np.dot(x.T, x)
w1 = np.dot(np.linalg.pinv(w), np.dot(x.T, y))

print(w1)
[ 0.53297593]

现在,让我们看看设置 fit_intercept = False 时的 scikit-learn :
clf = LinearRegression(fit_intercept=False)

print(clf.fit(x, y).coef_)
[ 0.53297593]

当我们设置 fit_intercept = True 时会发生什么反而?
clf = LinearRegression(fit_intercept=True)

print(clf.fit(x, y).coef_)
[-0.35535884]

似乎设置 fit_intercept to True 和 False 给出了不同的答案,“正确”的答案只有在我们将其设置为 False 时才会出现,但这并不完全正确......

拦截模型

在这一点上,我们必须考虑我们的输入数据实际上是什么。在上面的模型中,我们的数据矩阵(在统计学中也称为特征矩阵或设计矩阵)只是一个包含 x 的向量。值。 y变量不包括在设计矩阵中。如果我们想在我们的模型中添加一个截距,一种常见的方法是在设计矩阵中添加一列 1,因此 x变成:
x_vals = x.flatten()
x = np.zeros((10, 2))
x[:,0] = 1
x[:,1] = x_vals

intercept x
0 1.0 51.0
1 1.0 3.0
2 1.0 7.0
3 1.0 98.0
4 1.0 29.0
5 1.0 90.0
6 1.0 49.0
7 1.0 42.0
8 1.0 8.0
9 1.0 65.0

现在,当我们使用它作为我们的设计矩阵时,我们可以再次尝试封闭形式的解决方案:
w = np.dot(x.T, x)
w1 = np.dot(np.linalg.pinv(w), np.dot(x.T, y))

print(w1)
[ 59.60686058 -0.35535884]

注意2点:
  • 我们现在有 2 个系数。第一个是我们的截距,第二个是 x 的回归系数。预测变量
  • x 的系数当我们设置 fit_intercept = True 时,匹配来自上面 scikit-learn 输出的系数

  • 那么在上面的 scikit-learn 模型中,为什么 True 和 False 之间存在差异?因为在一种情况下没有对截距进行建模。在另一种情况下,基础模型包含一个截距,当您在求解正规方程时手动添加截距项/列时可以确认这一点

    如果您要在 scikit-learn 中使用这个新的设计矩阵,那么为 fit_intercept 设置 True 还是 False 都没有关系。 ,预测变量的系数不会改变(截距值会因居中而不同,但这与本讨论无关):
    clf = LinearRegression(fit_intercept=False)
    print(clf.fit(x, y).coef_)
    [ 59.60686058 -0.35535884]

    clf = LinearRegression(fit_intercept=True)
    print(clf.fit(x, y).coef_)
    [ 0. -0.35535884]

    加起来

    您获得的输出(即系数值)将完全取决于您输入到这些计算中的矩阵(无论是正规方程、scikit-learn 还是任何其他)

    How does it differ to use fit_intercept in a model and when should one set it to True/False



    如果您的设计矩阵不包含 1 的列,则正态方程和 scikit-learn ( fit_intercept = False ) 会给您相同的答案(如您所述)。但是,如果您将该参数设置为 True,如果您使用 1 的列进行计算,您得到的答案实际上将与正常方程相同。

    什么时候应该设置 True/False?顾名思义,当您不想在模型中包含拦截时,您可以设置 False。当您确实需要截距时,您设置 True,并了解系数值会发生变化,但当您的数据包含 1 列时将匹配正态方程方法

    因此,在考虑相同的基础模型时,True/False 实际上不会给您不同的结果(与正态方程相比)。您观察到的差异是因为您正在查看两种不同的统计模型(一种带有截距项,一种没有)。原因 fit_intercept参数存在是这样您就可以创建一个拦截模型,而无需手动添加该 1 的列。它有效地允许您在两个基础统计模型之间切换。

    关于python-3.x - fit_intercept 参数如何通过 scikit learn 影响线性回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46510242/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com