【发布时间】:2017-08-20 15:21:15
【问题描述】:
当我直接进行简单的线性回归与可以接受任何建模参数并进行交叉验证的函数时,我得到了不同的结果。这似乎是我唯一的区别,但为什么结果如此不同。
直接使用linear_model.LinearRegression()
x_train,x_test,y_train,y_test = train_test_split(features.values,target.values)
regr = linear_model.LinearRegression()
regr.fit(x_train, y_train)
print(np.mean((regr.predict(x_test) - y_test) ** 2))
结果:
395.68
使用泛型函数
from sklearn.model_selection import KFold
from scipy.sparse import csr_matrix
from sklearn.metrics import r2_score
def cv_predict_report(func,params,features,target,fold,verbose=False):
model_details,rmse = [],[]
kf = KFold(n_splits=fold)
for train_ix, test_ix in kf.split(features):
x_train_poly, x_test_poly = features.iloc[train_ix].values,features.iloc[test_ix].values
y_train,y_test = target.iloc[train_ix],target.iloc[test_ix]
#model
model = func(**params)
model.fit(csr_matrix(x_train_poly),y_train)
#save model details
model_details.append(model)
#predictions
preds = model.predict(x_test_poly)
model_rmse = np.mean((preds - y_test) ** 2)
rmse.append(model_rmse)
return model_details,rmse
使用 linear_model.LinearRegression 调用函数
from sklearn import linear_model
lm_model,lm_rmse = cv_predict_report(linear_model.LinearRegression,{},features,target,fold = 2)
print(lm_rmse)
结果
[440.2067193330667, 437.6263639733618]
【问题讨论】:
-
你为什么指望
train_test_split给你和KFold一样的分裂? -
我同意拆分在每种情况下都会有所不同。但我不认为这是他们的 MSE 差异巨大的唯一原因。或者可以吗?我尝试了多次运行不同随机状态的 train_test_split。结果波动不大。
-
MSE 的差异约为 10%,不是吗?这不是我所说的巨大,当然,很好在我期望使用数据集的不同拆分来训练相同的可变性范围内模型。此外,问题不是随机状态,而是训练集的大小不同。
train_test_split默认使用 0.25 分割。您正在使用带有KFold的 2 折,这将是 0.50 拆分。试试folds=4 -
我尝试了 4 折吐出,mse 仍在 436 - 440 范围内。可能你是对的,差异只有 10%,如果这是分裂差异的结果,我可以。但我很担心,因为它们只是不重叠我运行它们的次数。 train_test_split 一直低于 400,kfold 一直高于 435s。
标签: python scikit-learn linear-regression