1. 交叉验证(Cross-Validation)
例子:
假设我们有一个数据集,包含 10 个样本,特征只有一个(我们假设这些数据是通过某种方式标注的,表示是否能通过某个考试),每个样本的数据如下:
样本编号 | 特征(X) | 标签(y) |
---|---|---|
1 | 2.0 | 1 |
2 | 3.0 | 1 |
3 | 4.0 | 0 |
4 | 2.5 | 1 |
5 | 3.5 | 0 |
6 | 5.0 | 0 |
7 | 1.0 | 1 |
8 | 4.5 | 0 |
9 | 2.2 | 1 |
10 | 3.8 | 0 |
如果我们想要评估某个分类器在这个数据集上的性能,5折交叉验证 将会把这个数据集分成 5 个子集(每个子集包含 2 个样本),然后进行 5 次训练和验证。
5折交叉验证步骤:
-
第一折:
- 训练集:样本 3、4、5、6、7、8、9、10(8个样本)
- 验证集:样本 1、2(2个样本)
- 训练模型并评估性能
-
第二折:
- 训练集:样本 1、2、5、6、7、8、9、10(8个样本)
- 验证集:样本 3、4(2个样本)
- 训练模型并评估性能
-
第三折:
- 训练集:样本 1、2、3、4、7、8、9、10(8个样本)
- 验证集:样本 5、6(2个样本)
- 训练模型并评估性能
-
第四折:
- 训练集:样本 1、2、3、4、5、6、9、10(8个样本)
- 验证集:样本 7、8(2个样本)
- 训练模型并评估性能
-
第五折:
- 训练集:样本 1、2、3、4、5、6、7、8(8个样本)
- 验证集:样本 9、10(2个样本)
- 训练模型并评估性能
最终评估:
- 你可以计算每一折的准确率(或其他评估指标),然后取 平均值 来评估模型的性能。
- 优点:通过交叉验证,可以更全面地了解模型在不同数据划分下的表现,减少单次划分数据带来的偏差。
2. 网格搜索(Grid Search)
例子:
在实际应用中,机器学习模型有很多超参数,网格搜索(Grid Search) 是一个通过遍历所有可能的超参数组合来找到最佳模型参数的方法。
假设我们有一个 随机森林 模型,我们想调整以下三个超参数:
n_estimators
:树的数量,试 50、100 和 150。max_depth
:树的最大深度,试 5、10 和 15。min_samples_split
:划分节点所需的最小样本数,试 2、5 和 10。
在网格搜索中,网格的每一个点代表一个超参数组合。例如,如果我们有三个超参数,每个超参数有三个可能的值,网格搜索会尝试 3 × 3 × 3 = 27 个不同的组合。
步骤:
-
定义参数范围:
n_estimators
: [50, 100, 150]max_depth
: [5, 10, 15]min_samples_split
: [2, 5, 10]
-
每个组合尝试一次:
- 训练一个使用 50 棵树、深度为 5 的模型,评估性能。
- 训练一个使用 50 棵树、深度为 10 的模型,评估性能。
- 继续遍历所有超参数组合,直到每个组合都尝试过。
-
选择最佳组合:
- 网格搜索会通过交叉验证,评估每个超参数组合的表现,最终返回表现最好的超参数组合。
举个例子:
假设我们使用网格搜索来调整一个模型的两个超参数:learning_rate
和 n_estimators
,并且我们有以下超参数范围:
learning_rate
: [0.1, 0.01, 0.001]n_estimators
: [50, 100]
网格搜索会遍历以下组合:
learning_rate=0.1, n_estimators=50
learning_rate=0.1, n_estimators=100
learning_rate=0.01, n_estimators=50
learning_rate=0.01, n_estimators=100
learning_rate=0.001, n_estimators=50
learning_rate=0.001, n_estimators=100
注意: 网格搜索的计算开销很大,尤其是在超参数范围很广时,尝试的组合很多。
3. GridSearchCV 和 交叉验证的结合
GridSearchCV
是结合了网格搜索和交叉验证的方法,用来寻找最佳超参数。
例子:
假设我们在 鸢尾花数据集 上使用 随机森林 模型,通过网格搜索和交叉验证来寻找最佳超参数。
[GridSearchCV 和 交叉验证的结合.py](…/GridSearchCV 和 交叉验证的结合.py)
# 导入所需的库
from sklearn.model_selection import GridSearchCV # 导入 GridSearchCV,用于超参数调优和交叉验证
from sklearn.ensemble import RandomForestClassifier # 导入随机森林分类器
from sklearn.datasets import load_iris # 导入鸢尾花数据集
from sklearn.model_selection import train_test_split # 用于划分训练集和测试集
# 加载鸢尾花数据集
data = load_iris() # 加载鸢尾花数据集,包含特征数据和标签
X = data.data # 特征数据(如花萼长度、花瓣宽度等)
y = data.target # 标签数据(类别标签:Setosa, Versicolor, Virginica)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 使用 train_test_split 将数据集划分为训练集和测试集,30%的数据作为测试集,70%作为训练集
# random_state=42 保证每次运行时的结果一致
# 创建随机森林模型
rf_model = RandomForestClassifier(random_state=42) # 创建随机森林分类器模型,random_state=42 确保结果可复现
# 定义超参数范围
param_grid = {
'n_estimators': [50, 100, 150], # 树的数量,尝试使用 50、100、150 棵树
'max_depth': [5, 10, 15], # 树的最大深度,尝试深度为 5、10 和 15 的树
'min_samples_split': [2, 5, 10], # 划分节点所需的最小样本数,尝试 2、5、10 个样本的最小值
}
# 使用 GridSearchCV 进行网格搜索,结合交叉验证
grid_search = GridSearchCV(estimator=rf_model, param_grid=param_grid, cv=5, scoring='accuracy')
# estimator=rf_model 表示使用随机森林分类器
# param_grid=param_grid 表示要调优的超参数范围
# cv=5 表示使用 5 折交叉验证来评估每种超参数组合
# scoring='accuracy' 表示我们使用准确率作为评估指标
# 训练模型
grid_search.fit(X_train, y_train) # 使用训练集数据训练模型并进行超参数优化
# 打印最佳超参数
print("最佳超参数:", grid_search.best_params_) # 打印通过网格搜索找到的最佳超参数组合
# 使用最佳模型进行预测
best_model = grid_search.best_estimator_ # 获取网格搜索找到的最佳模型
y_pred = best_model.predict(X_test) # 使用最佳模型对测试集进行预测
# 评估模型准确率
accuracy = best_model.score(X_test, y_test) # 使用测试集计算模型的准确率
print(f"优化后的随机森林模型准确率: {accuracy * 100:.2f}%")
# 打印优化后的模型的准确率,保留两位小数
逐行解释:
-
导入库:
GridSearchCV
:用来进行超参数调优并通过交叉验证评估每个超参数组合的效果。RandomForestClassifier
:用于创建随机森林模型。load_iris
:加载鸢尾花数据集。train_test_split
:将数据集划分为训练集和测试集。
-
加载数据集:
load_iris()
:加载鸢尾花数据集。X
:特征数据(每个样本的属性,如花萼长度、花瓣宽度等)。y
:标签数据(每个样本的类别标签,如 Setosa、Versicolor、Virginica)。
-
划分数据集:
train_test_split(X, y, test_size=0.3, random_state=42)
:将数据集划分为训练集和测试集,其中 30% 的数据用于测试,70% 用于训练。
-
创建模型:
rf_model = RandomForestClassifier(random_state=42)
:创建一个随机森林分类器模型,random_state=42
确保每次运行时的结果一致。
-
定义超参数范围:
param_grid
:设置了我们要搜索的超参数范围。包括树的数量、树的最大深度和划分节点时所需的最小样本数。
-
网格搜索:
GridSearchCV(estimator=rf_model, param_grid=param_grid, cv=5, scoring='accuracy')
:创建一个GridSearchCV
对象,进行超参数搜索。cv=5
表示使用 5 折交叉验证,scoring='accuracy'
表示根据准确率来评估每个超参数组合。
-
训练模型:
grid_search.fit(X_train, y_train)
:使用训练集数据进行训练,并通过网格搜索调整超参数。
-
打印最佳超参数:
grid_search.best_params_
:获取通过网格搜索找到的最佳超参数组合。
-
使用最佳模型进行预测:
grid_search.best_estimator_
:获取训练好的最佳模型。best_model.predict(X_test)
:使用最佳模型对测试集进行预测。
-
评估模型准确率:
best_model.score(X_test, y_test)
:计算模型在测试集上的准确率。print(f"优化后的随机森林模型准确率: {accuracy * 100:.2f}%")
:打印优化后的模型准确率,保留两位小数。