scikit-learn中的LassoCV如何分割数据?
我正在使用sklearn中的Lasso方法进行线性回归。
根据他们的指导,以及我在其他地方看到的建议,进行交叉验证时,不应该仅仅在所有训练数据上进行,而是建议将数据分成更传统的训练集和验证集。
因此,Lasso模型会在训练集上进行训练,然后根据验证集的交叉验证结果来调整超参数alpha。最后,经过验证的模型会在测试集上进行测试,以便真实地了解它在实际情况中的表现。这样分开处理是为了防止模型过拟合。
实际问题
Lasso的交叉验证是否遵循上述流程,还是说它只是用同样的数据和/或在同一轮交叉验证中训练模型参数和超参数?
谢谢。
1 个回答
11
如果你使用 sklearn.cross_validation.cross_val_score
和 sklearn.linear_model.LassoCV
对象,那你就是在进行一种叫做 嵌套交叉验证 的操作。cross_val_score
会根据你指定的折叠方式(可以用像 sklearn.cross_validation.KFold
这样的对象来实现)把你的数据分成训练集和测试集。训练集会被传给 LassoCV
,而 LassoCV
自己会再对数据进行一次划分,以选择合适的惩罚项。这似乎正是你想要的设置。
import numpy as np
from sklearn.cross_validation import KFold, cross_val_score
from sklearn.linear_model import LassoCV
X = np.random.randn(20, 10)
y = np.random.randn(len(X))
cv_outer = KFold(len(X), n_folds=5)
lasso = LassoCV(cv=3) # cv=3 makes a KFold inner splitting with 3 folds
scores = cross_val_score(lasso, X, y, cv=cv_outer)
回答是:不,LassoCV
不会为你完成所有的工作,你需要把它和 cross_val_score
一起使用,才能得到你想要的结果。这也是使用这些对象的合理方式,因为我们有时只想优化 LassoCV
的超参数,而不一定要直接在另一组保留的数据上进行评估。