GridSearchCV 回归 vs 线性回归 vs Stats.model OLS

机器算法验证 回归 机器学习 Python r平方 scikit-学习
2022-04-02 16:52:08

我正在尝试使用 3 种不同的方法构建多元线性回归模型,并且每种方法都得到不同的结果。我认为我必须得到相同的结果,但是Where is this difference come from?

使用 GridSearchCV

X_train, X_test, y_train, y_test = cross_validation.train_test_split(data, ground_truth_data, 
    test_size=0.3,random_state =1 )
model = linear_model.LinearRegression()
parameters = {'fit_intercept':[True,False], 'normalize':[True,False], 'copy_X':[True, False]}
grid = GridSearchCV(model,parameters, cv=None)
grid.fit(X_train, y_train)
print "r2 / variance : ", grid.best_score_
print("Residual sum of squares: %.2f"
              % np.mean((grid.predict(X_test) - y_test) ** 2))

输出是:

r2 / variance : 0.823041227357

Residual sum of squares: 0.18

在没有 GridSearchCV 的情况下使用线性回归

X_train, X_test, y_train, y_test = cross_validation.train_test_split(data, ground_truth_data, 
   test_size=0.3,random_state =1 )
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print "r2/variance : ", model.score(X_test,y_test)
print("Residual sum of squares: %.2f"
              % np.mean((model.predict(X_test) - y_test) ** 2))

输出是:

r2 / variance : 0.883799174674

Residual sum of squares: 0.18

使用 Statsmodel OLS 方法

X_train, X_test, y_train, y_test = cross_validation.train_test_split(data, ground_truth_data,     test_size=0.3,random_state =1 )

x_train = sm.add_constant(X_train)
model = sm.OLS(y_train, x_train)
results = model.fit()
print "r2/variance : ", results.rsquared

输出是:

r2/variance : 0.893686634315

我在三个不同的点上感到困惑。

  1. 为什么使用 GridSearchCV 不会增加 r_score 以及为什么错误总和相同?

    我的猜测是 GridSearchCV 进行了一些交叉验证(可能是 k-fold),所以当我们使用它时 r_square 分数会降低。但我对这个问题不是很清楚。

  2. Scikit 和 Statsmodel OLS 有什么区别?
> My guess is Statsmodel OLS looks the training error and Scikit looks the test error. So I think that using Scikit OLS is more rational.

  1. 我们何时以及如何在回归模型上使用 GridSearchCv?

> I have not to much guess.

谢谢你的每一个想法。

1个回答

分数之间的差异可以解释如下

在您的第一个模型中,您正在执行交叉验证。cv=None或未作为参数传递时,GridSearchCV 将默认为cv=3. 通过三折,每个模型将使用 66% 的数据进行训练并使用另外 33% 的数据进行测试。由于在此之前您已经将数据拆分为 70%/30%,因此使用 GridSearchCV 构建的每个模型使用大约 0.7*0.66=0.462 (46.2%) 的原始数据。

在您的第二个模型中,没有 k 折交叉验证。您有一个模型,该模型在 70% 的原始数据上进行了训练,并在剩余的 30% 上进行了测试。由于该模型已获得更多数据,因此预期的得分更高。

在您的最后一个模型中,您使用 70% 的数据训练另一个模型。但是,这一次您不使用为测试而保存的 30% 数据对其进行测试。正如您所怀疑的,您正在查看训练错误,而不是测试错误。几乎总是训练错误优于测试错误,因此更高的分数再次符合预期。

我们何时以及如何在回归模型上使用 GridSearchCv?

应该使用 GridSearchCV 来找到训练最终模型的最佳参数。通常,您应该运行 GridSearchCV,然后查看为模型提供最高分数的参数。然后,您应该采用这些参数并在所有数据上训练您的最终模型。需要注意的是,如果您已经根据所有数据训练了最终模型,则无法对其进行测试。对于任何正确的测试,您必须保留一些数据。