交叉验证和模型评估方法


1. 交叉验证(Cross-Validation)

例子:

假设我们有一个数据集,包含 10 个样本,特征只有一个(我们假设这些数据是通过某种方式标注的,表示是否能通过某个考试),每个样本的数据如下:

样本编号特征(X)标签(y)
12.01
23.01
34.00
42.51
53.50
65.00
71.01
84.50
92.21
103.80

如果我们想要评估某个分类器在这个数据集上的性能,5折交叉验证 将会把这个数据集分成 5 个子集(每个子集包含 2 个样本),然后进行 5 次训练和验证。

5折交叉验证步骤:
  1. 第一折

    • 训练集:样本 3、4、5、6、7、8、9、10(8个样本)
    • 验证集:样本 1、2(2个样本)
    • 训练模型并评估性能
  2. 第二折

    • 训练集:样本 1、2、5、6、7、8、9、10(8个样本)
    • 验证集:样本 3、4(2个样本)
    • 训练模型并评估性能
  3. 第三折

    • 训练集:样本 1、2、3、4、7、8、9、10(8个样本)
    • 验证集:样本 5、6(2个样本)
    • 训练模型并评估性能
  4. 第四折

    • 训练集:样本 1、2、3、4、5、6、9、10(8个样本)
    • 验证集:样本 7、8(2个样本)
    • 训练模型并评估性能
  5. 第五折

    • 训练集:样本 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 个不同的组合。

步骤:
  1. 定义参数范围

    • n_estimators: [50, 100, 150]
    • max_depth: [5, 10, 15]
    • min_samples_split: [2, 5, 10]
  2. 每个组合尝试一次

    • 训练一个使用 50 棵树、深度为 5 的模型,评估性能。
    • 训练一个使用 50 棵树、深度为 10 的模型,评估性能。
    • 继续遍历所有超参数组合,直到每个组合都尝试过。
  3. 选择最佳组合

    • 网格搜索会通过交叉验证,评估每个超参数组合的表现,最终返回表现最好的超参数组合。
举个例子

假设我们使用网格搜索来调整一个模型的两个超参数:learning_raten_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}%")  
# 打印优化后的模型的准确率,保留两位小数

逐行解释

  1. 导入库

    • GridSearchCV:用来进行超参数调优并通过交叉验证评估每个超参数组合的效果。
    • RandomForestClassifier:用于创建随机森林模型。
    • load_iris:加载鸢尾花数据集。
    • train_test_split:将数据集划分为训练集和测试集。
  2. 加载数据集

    • load_iris():加载鸢尾花数据集。
    • X:特征数据(每个样本的属性,如花萼长度、花瓣宽度等)。
    • y:标签数据(每个样本的类别标签,如 Setosa、Versicolor、Virginica)。
  3. 划分数据集

    • train_test_split(X, y, test_size=0.3, random_state=42):将数据集划分为训练集和测试集,其中 30% 的数据用于测试,70% 用于训练。
  4. 创建模型

    • rf_model = RandomForestClassifier(random_state=42):创建一个随机森林分类器模型,random_state=42 确保每次运行时的结果一致。
  5. 定义超参数范围

    • param_grid:设置了我们要搜索的超参数范围。包括树的数量、树的最大深度和划分节点时所需的最小样本数。
  6. 网格搜索

    • GridSearchCV(estimator=rf_model, param_grid=param_grid, cv=5, scoring='accuracy'):创建一个 GridSearchCV 对象,进行超参数搜索。cv=5 表示使用 5 折交叉验证,scoring='accuracy' 表示根据准确率来评估每个超参数组合。
  7. 训练模型

    • grid_search.fit(X_train, y_train):使用训练集数据进行训练,并通过网格搜索调整超参数。
  8. 打印最佳超参数

    • grid_search.best_params_:获取通过网格搜索找到的最佳超参数组合。
  9. 使用最佳模型进行预测

    • grid_search.best_estimator_:获取训练好的最佳模型。
    • best_model.predict(X_test):使用最佳模型对测试集进行预测。
  10. 评估模型准确率

    • best_model.score(X_test, y_test):计算模型在测试集上的准确率。
    • print(f"优化后的随机森林模型准确率: {accuracy * 100:.2f}%"):打印优化后的模型准确率,保留两位小数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值