import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score
# 加载波士顿房价数据集 boston = load_boston() X = pd.DataFrame(boston.data, columns=boston.feature_names) y = boston.target
交叉验证是一种评估机器学习模型泛化能力的方法。它通过将数据集分成多个子集,以确保模型在未见过的数据上也能表现良好。最常用的交叉验证方法是 K 折交叉验证。
在 K 折交叉验证 中,数据集会被分成 K 个相同的部分。然后进行 K 次训练和验证,每次使用其中一个部分作为验证集,其余的作为训练集。最后,对 K 次训练结果进行平均,以得到模型的最终性能估计。
交叉验证的步骤
将数据集分成 K 个折(fold)。
每次取一个折作为验证集,其余的折作为训练集。
训练模型并在验证集上评估性能。
重复以上步骤,直到每个折都被用作验证集一次。
计算所有验证的平均性能指标。
K 折交叉验证的实现
让我们通过一个简单的例子来演示如何在 Scikit-Learn 中实施 K 折交叉验证。我们将使用 Iris 数据集,这是一个常用的分类数据集。
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestClassifier
# 加载 Iris 数据集 iris = load_iris() X = iris.data y = iris.target
# 定义模型 model = RandomForestClassifier(n_estimators=100, random_state=42)
# 进行 5 折交叉验证 scores = cross_val_score(model, X, y, cv=5)
import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split, cross_val_score from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier
# 加载数据 iris = load_iris() X = iris.data y = iris.target
# 绘制条形图 model_names = results.keys() mean_scores = [np.mean(scores) for scores in results.values()] std_scores = [np.std(scores) for scores in results.values()]
import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.svm import SVC from sklearn.metrics import classification_report
2. 准备数据
我们使用Iris数据集进行模型训练和评估。
1 2 3 4 5 6 7
# 加载数据 data = load_iris() X = data.data y = data.target
import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split, RandomizedSearchCV from sklearn.svm import SVC from scipy.stats import randint
2. 加载数据
我们将使用具有四个特征的 Iris 数据集。
1 2 3 4 5 6
# 加载数据 iris = load_iris() X, y = iris.data, iris.target
import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import KFold, cross_val_score from sklearn.neighbors import KNeighborsClassifier
# 加载数据集 iris = load_iris() X, y = iris.data, iris.target
# 构建模型 model = KNeighborsClassifier(n_neighbors=3)