第五站:模型优化与超参数调优

1. 模型优化的概念

模型优化的目标是通过调整模型的参数,使得模型的性能(如准确率、精确率、召回率等)达到最佳。模型优化可以从以下几个方面进行:

  1. 特征工程:选择最合适的特征,去除无关特征或异常值。
  2. 算法选择:根据数据的特性选择最合适的算法。例如,使用随机森林、SVM 或神经网络。
  3. 超参数调优:通过调整模型的超参数来提高模型性能。超参数调优是模型优化的一个重要步骤。

2. 超参数调优

超参数调优是指通过调整模型的超参数(如学习率、正则化强度、树的深度等)来提高模型性能。常见的超参数调优方法包括:

  • 网格搜索(Grid Search)
  • 随机搜索(Random Search)
  • 贝叶斯优化
网格搜索(Grid Search)

网格搜索是通过穷举所有可能的超参数组合来寻找最优超参数。

随机搜索(Random Search)

随机搜索与网格搜索类似,但它并不是穷举所有组合,而是随机选择超参数组合,这样可以减少计算开销。

3. 使用 GridSearchCV 调整超参数

GridSearchCV 是一个用于超参数调优的工具,它可以自动尝试多种超参数组合,并使用交叉验证评估每种组合的效果,最终返回最佳的超参数。

代码示例:使用 GridSearchCV 调整随机森林的超参数
# 导入所需的库
from sklearn.ensemble import RandomForestClassifier  # 导入随机森林分类器
from sklearn.model_selection import GridSearchCV  # 导入GridSearchCV,用于超参数搜索
from sklearn.datasets import load_iris  # 导入鸢尾花数据集
from sklearn.model_selection import train_test_split  # 用于数据集的划分

# 加载鸢尾花数据集
data = load_iris()  # 加载鸢尾花数据集,返回一个字典结构,包含数据和标签
X = data.data  # 特征数据(样本的属性,如花萼长度等)
y = data.target  # 标签数据(每个样本的类别)

# 划分训练集和测试集
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保证结果可复现

# 定义超参数的范围,用于GridSearchCV的搜索
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. 导入库

    • RandomForestClassifier:导入用于分类的随机森林模型。
    • GridSearchCV:导入用于超参数搜索的工具,帮助我们通过交叉验证寻找最佳超参数。
    • load_iris:导入鸢尾花数据集(一个经典的机器学习数据集,常用于分类任务)。
    • train_test_split:用于将数据集拆分成训练集和测试集。
  2. 加载数据

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

    • train_test_split(X, y, test_size=0.3, random_state=42):将数据集划分为 70% 的训练集和 30% 的测试集,random_state=42 确保每次运行划分结果一致。
  4. 创建模型

    • rf_model = RandomForestClassifier(random_state=42):创建一个随机森林分类器,random_state=42 确保结果可复现。
  5. 定义超参数范围

    • param_grid 中,我们指定了 n_estimators(树的数量)、max_depth(树的最大深度)和 min_samples_split(每个节点的最小样本数)等超参数的取值范围。
  6. 网格搜索

    • grid_search = GridSearchCV(...):创建一个网格搜索对象,cv=5 表示使用 5 折交叉验证来评估每个超参数组合的效果,scoring='accuracy' 表示通过准确率来评估。
    • grid_search.fit(X_train, y_train):对训练集进行训练和超参数优化。
  7. 打印最佳超参数

    • grid_search.best_params_:打印通过网格搜索找到的最佳超参数组合。
  8. 预测与评估

    • best_model = grid_search.best_estimator_:获取网格搜索过程中找到的最佳模型。
    • y_pred = best_model.predict(X_test):使用最佳模型对测试集进行预测。
    • accuracy = best_model.score(X_test, y_test):计算测试集上的准确率,评估模型的表现。

4. 交叉验证(Cross-Validation)

交叉验证是一种评估模型性能的技术。它通过将数据集划分为多个子集(折叠),然后训练和评估模型。常见的方法是 k-折交叉验证(k-fold Cross-Validation)

5. 使用交叉验证评估模型
# 导入用于交叉验证的函数
from sklearn.model_selection import cross_val_score  # 导入cross_val_score函数,用于交叉验证模型性能

# 创建随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, max_depth=10, random_state=42)  
# 创建一个随机森林分类器模型,n_estimators=100表示使用100棵决策树,max_depth=10表示树的最大深度为10,random_state=42保证每次运行时的结果一致

# 使用 5 折交叉验证评估模型性能
cv_scores = cross_val_score(rf_model, X, y, cv=5)  
# 使用cross_val_score进行5折交叉验证,cv=5表示将数据分成5个子集,每个子集依次作为验证集,其余数据作为训练集
# 将训练集划分成5折后,模型会进行5次训练和验证,每次评估模型的准确率

# 打印每折的评分
print("每折的准确率:", cv_scores)  
# 输出每次交叉验证的准确率,cv_scores是一个数组,包含5个交叉验证的结果

# 打印平均准确率
print(f"平均准确率: {cv_scores.mean() * 100:.2f}%")  
# 打印5折交叉验证后的平均准确率,cv_scores.mean()返回所有折的平均值,*100转化为百分比,保留两位小数

逐行解释

  1. 导入函数

    • cross_val_score:用于计算交叉验证的得分(通常是准确率),并返回每一折的评分。
  2. 创建模型

    • RandomForestClassifier:创建一个随机森林分类器,设置了决策树的数量(n_estimators=100)和每棵树的最大深度(max_depth=10)。
  3. 进行交叉验证

    • cross_val_score(rf_model, X, y, cv=5):这行代码通过交叉验证对模型进行评估。X 是特征数据,y 是标签数据,cv=5 表示数据将被分成5个子集,模型进行5次训练和评估。
  4. 输出每折准确率

    • print("每折的准确率:", cv_scores):打印出每次交叉验证的准确率值,这些值存储在 cv_scores 数组中。
  5. 输出平均准确率

    • print(f"平均准确率: {cv_scores.mean() * 100:.2f}%"):计算并打印5折交叉验证后的平均准确率,.mean() 计算准确率的平均值,* 100 转换为百分比形式,保留两位小数。

知识总结

  • 模型优化 涉及到选择合适的算法、特征工程和超参数调优。
  • 超参数调优 通过调整模型的超参数来提高模型的性能,常用的调优方法包括网格搜索和随机搜索。
  • 交叉验证 是评估模型稳定性的重要工具,帮助我们避免模型的过拟合或欠拟合。
  • 详解 关于交叉验证与模型调优附件详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值