终于把机器学习中的交叉验证搞懂了!!
终于把机器学习中的交叉验证搞懂了!!
交叉验证是机器学习中用于评价模型泛化才干的一种方法,用于权衡模型在训练集之外的新数据上的体现。当天给大家分享机器学习中的一个关键概念,交叉验证。
交叉验证是机器学习中用于评价模型泛化才干的一种方法,用于权衡模型在训练集之外的新数据上的体现。
它的外围现实是将数据集划分为多个子集,模型在不同的子集上交替启动训练和测试,从而缩小模型在某一特定数据宰割上的偏向。交叉验证能够有效地降低模型过拟合的危险,从而提高模型评价的稳固性和牢靠性。
K 折交叉验证将数据集分红 K 个不堆叠的子集(折),每次将其中一个子集(折)作为测试集,其他 K-1 个折作为训练集。
重复这个环节 K 次,每次用不同的折作为测试集,最终将 K 次测试的结果平均,以获取模型的总体性能。
好处
缺陷
from sklearn.model_selection import KFold, cross_val_scorefrom sklearn.datasets import load_irisfrom sklearn.ensemble import RandomForestClassifier# 加载数据data = load_iris()X, y =>
留一交叉验证是 K 折交叉验证的极其方式,其中 K 等于样本总数 N。
每次选取一个样本作为测试集,其他 N-1 个样本作为训练集,重复该环节 N 次,最后计算平均误差。
好处
缺陷
from sklearn.model_selection import LeaveOneOutfrom sklearn.datasets import load_irisfrom sklearn.ensemble import RandomForestClassifier# 加载数据data = load_iris()X, y =>
疏导法经过有放回地从原始数据集中抽取样本,生成多个子样本(通常与原始数据集大小相反)。
每次从生成的样本中训练模型,未被抽中的样本(称为“包外样本”)作为测试集。
重复该环节屡次,并对屡次测试结果启动平均。
好处
缺陷:
import numpy as npfrom sklearn.utils import resamplefrom sklearn.metrics import accuracy_scorefrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_iris# 加载数据data = load_iris()X, y =>
嵌套交叉验证关键用于模型选用和超参数优化。
外层交叉验证用于评价模型的性能,内层交叉验证用于选用模型的最佳超参数。
详细来说,外层将数据分红多个折,每个折作为验证集,残余部分作为训练集;而在每个外层折的训练集中,又经常使用内层交叉验证启动超参数搜查。
好处
缺陷
from sklearn.model_selection import GridSearchCV, cross_val_score, KFoldfrom sklearn.datasets import load_irisfrom sklearn.ensemble import RandomForestClassifier# 加载数据data = load_iris()X, y =>
分层交叉验证是一种不凡的交叉验证方法,特意实用于分类义务。
在分层交叉验证中,每个折内的类别散布与整个数据集的类别散布相反,从而在不同折中坚持相对分歧的标签散布,防止模型评价由于类别失衡而发生偏向。
好处
缺陷
from sklearn.model_selection import StratifiedKFold, cross_val_scorefrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_iris# 加载数据集data = load_iris()X, y =>
期间序列交叉验证是一种专门用于期间序列数据的模型评价方法。与传统交叉验证方法(如 K 折交叉验证)不同,期间序列交叉验证遵照期间的人造顺序,从过去到未来逐渐划分数据。这种方法实用于期间序列预测义务,能够防止将未来的数据走漏到模型训练环节中,从而保障模型的实在性能评价。
期间序列交叉验证的罕用方法
滚动预测法
在滚动预测法中,每次划分训练和测试集时,训练集的大小坚持不变,仅在期间上向前滚动。每次只经常使用最新的训练集数据来预测未来的测试集数据。适宜模拟模型实时滚动预测的状况。
优缺陷:
import numpy as npfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_squared_error# 创立期间序列数据X = np.arange(1, 101).reshape(-1, 1)# 1到100的期间序列y = X.flatten() + np.random.normal(scale=5, size=X.shape[0])# 参与噪声# 定义滚动窗口的大小window_size = 20# 每次训练的窗口大小# 初始化模型model = LinearRegression()# 存储预测结果和误差predictions = []errors = []# 滚动窗口法启动预测for i in range(len(X) - window_size - 1):# 定义训练集和测试集X_train = X[i : i + window_size]y_train = y[i : i + window_size]X_test = X[i + window_size : i + window_size + 1]y_test = y[i + window_size : i + window_size + 1]# 训练模型model.fit(X_train, y_train)# 启动预测y_pred = model.predict(X_test)# 记载预测和误差predictions.append(y_pred[0])mse = mean_squared_error(y_test, y_pred)errors.append(mse)print(f"Window {i+1}: Predicted = {y_pred[0]:.2f}, Actual = {y_test[0]:.2f}, MSE = {mse:.2f}")# 计算平均误差average_mse = np.mean(errors)print(f"\nAverage MSE over all windows: {average_mse:.2f}")
扩展窗口法
在扩展窗口法中,训练集会随着期间始终扩展,即每次训练时,训练集蕴含更常年间段的数据,而测试集仍为后续的一小部分数据。这种方法能让模型在预测时应用更多历史数据。
优缺陷
from sklearn.model_selection import TimeSeriesSplitfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_squared_errorimport numpy as np# 创立期间序列数据X = np.arange(1, 101).reshape(-1, 1)y = X.flatten() + np.random.normal(scale=5, size=X.shape[0])# 经常使用TimeSeriesSplit成功滚动预测法tscv = TimeSeriesSplit(n_splits=5)model = LinearRegression()for train_index, test_index in tscv.split(X):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]model.fit(X_train, y_train)y_pred = model.predict(X_test)print("Test MSE:", mean_squared_error(y_test, y_pred)