我有大约1.3k的叶片温度样本,我正在尝试使用大气变量(例如气温,太阳辐射,风和湿度)来预测该温度。
我从多元线性回归模型开始,但是我想提高准确性,所以我决定尝试留一法交叉验证方法以获得最佳模型输出。我最终寻求收集系数并进行拦截,以便以后可以使用此模型。
现在,据我了解,交叉验证可以有两个目的。第一个似乎是将您的模型的准确性与其他模型的准确性进行比较,并通过大量的训练数据来确定哪一个最佳。
第二个目的(也是我要使用的目的)是可以使用交叉验证来提高单个模型的准确性。换句话说,我尝试构建的最终模型是在考虑所有可能的训练集之后构建的。我觉得我可能出于第二个目的错了。
无论如何,受我所见(最著名的是this和this)的启发,我开发了以下代码:
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import LeaveOneOut
#Leave ont out cross validation (LOOCV)
#Y_data and X_data are both pandas df
loo = LeaveOneOut()
loo.get_n_splits(X_data)
ytests = []
ypreds = []
All_coef = list()
All_intercept = list()
for train_index, test_index in loo.split(X_data):
X_train, X_test = X_data.iloc[train_index], X_data.iloc[test_index]
Y_train, Y_test = Y_data.iloc[train_index], Y_data.iloc[test_index]
model = LinearRegression()
model.fit(X=X_train, y=Y_train)
Y_pred = model.predict(X_test)
All_coef.append(model.coef_)
All_intercept.append(model.intercept_)
ytests += Y_test.values.tolist()[0]
ypreds += list(Y_pred)
rr = metrics.r2_score(ytests, ypreds)
ms_error = metrics.mean_squared_error(ytests, ypreds)
但是这很奇怪,因为线性回归不在交叉验证循环之内,而是不在交叉验证循环之内,所以我不能真正从中得出最终模型。我是否也想将LinearRegression()
和.fit()
放在循环之外?如果是这样,那么我如何验证最终模型?
我也在考虑应该如何从模型中获取系数和截距。如果我要在循环中保持线性回归,那意味着我将获得每个训练集的系数。用它来表达某种意思会明智吗?
非常感谢您的考虑!