授课语音

实践:使用GridSearchCV和RandomizedSearchCV进行超参数优化,提升模型效果

超参数优化是提升机器学习模型效果的一个关键步骤。在实际应用中,我们可以通过使用GridSearchCVRandomizedSearchCV这两种方法来搜索最佳超参数组合,从而提高模型的预测性能。以下将通过实践示例,介绍如何使用这两种方法对模型进行超参数优化。

1. GridSearchCV 超参数优化

GridSearchCV 是一种通过穷举所有可能的超参数组合来寻找最优参数的方法。它通过指定超参数的搜索范围,逐一尝试每一种组合,并使用交叉验证评估每种组合的性能。

1.1 使用GridSearchCV的步骤

  1. 定义模型:选择一个基学习器(例如,随机森林、支持向量机等)。
  2. 指定超参数范围:设定要搜索的超参数范围。
  3. 使用GridSearchCV进行搜索:使用交叉验证方法评估不同超参数组合的效果。
  4. 获取最优超参数:选择表现最好的参数组合。

1.2 代码示例:使用GridSearchCV进行超参数优化

以下是使用GridSearchCV随机森林分类器进行超参数调优的代码示例:

from sklearn.model_selection import 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

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 定义模型
model = RandomForestClassifier()

# 定义要搜索的超参数范围
param_grid = {
    'n_estimators': [50, 100, 200],        # 树的数量
    'max_depth': [5, 10, 20],              # 树的最大深度
    'min_samples_split': [2, 5, 10],       # 分裂节点时最小样本数
}

# 使用GridSearchCV进行超参数搜索
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3)
grid_search.fit(X_train, y_train)

# 输出最优参数和得分
print("Best Parameters: ", grid_search.best_params_)
print("Best Cross-validation Score: ", grid_search.best_score_)

# 使用最佳参数对测试集进行预测
best_model = grid_search.best_estimator_
test_score = best_model.score(X_test, y_test)
print("Test Accuracy: ", test_score)

1.3 解释

  • param_grid:定义了我们要搜索的超参数范围。n_estimators是森林中树的数量,max_depth是每棵树的最大深度,min_samples_split是一个节点最小分裂样本数。
  • GridSearchCV:指定模型和超参数搜索范围,以及使用的交叉验证方法(这里是3折交叉验证)。
  • best_params_:输出最佳的超参数组合。
  • best_score_:输出最佳交叉验证得分。
  • score():使用最佳模型在测试集上评估性能。

2. RandomizedSearchCV 超参数优化

RandomizedSearchCVGridSearchCV 类似,都是用于超参数优化的工具,但它不是穷举所有超参数组合,而是从给定的超参数空间中随机选择一定数量的组合进行评估。因此,RandomizedSearchCVGridSearchCV更加高效,特别适合搜索超参数范围很大的情况。

2.1 使用RandomizedSearchCV的步骤

  1. 定义模型:选择一个基学习器。
  2. 定义超参数分布:设定要搜索的超参数分布,而不是具体的值。
  3. 使用RandomizedSearchCV进行搜索:随机选取超参数组合,并通过交叉验证评估效果。
  4. 获取最优超参数:选择最优的超参数组合。

2.2 代码示例:使用RandomizedSearchCV进行超参数优化

以下是使用RandomizedSearchCV支持向量机(SVM)进行超参数优化的代码示例:

from sklearn.model_selection import RandomizedSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from scipy.stats import randint

# 载入数据
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.2, random_state=42)

# 定义模型
model = SVC()

# 定义要搜索的超参数分布
param_dist = {
    'C': [0.1, 1, 10, 100],              # 正则化参数
    'kernel': ['linear', 'rbf', 'poly'], # 核函数类型
    'gamma': ['scale', 'auto'],          # 核函数的系数
    'degree': randint(1, 6),             # 多项式核函数的次数
}

# 使用RandomizedSearchCV进行超参数搜索
random_search = RandomizedSearchCV(estimator=model, param_distributions=param_dist, n_iter=100, cv=3)
random_search.fit(X_train, y_train)

# 输出最优参数和得分
print("Best Parameters: ", random_search.best_params_)
print("Best Cross-validation Score: ", random_search.best_score_)

# 使用最佳参数对测试集进行预测
best_model = random_search.best_estimator_
test_score = best_model.score(X_test, y_test)
print("Test Accuracy: ", test_score)

2.3 解释

  • param_dist:定义了我们要搜索的超参数分布。C是SVM的正则化参数,kernel是核函数的类型,gamma是核函数的系数,degree是多项式核函数的次数。
  • RandomizedSearchCV:与GridSearchCV类似,param_distributions指定超参数的分布,n_iter指定随机选择的超参数组合的数量,cv指定交叉验证次数。
  • best_params_:输出最佳超参数组合。
  • best_score_:输出最佳交叉验证得分。
  • score():使用最佳模型在测试集上评估性能。

3. 总结

  • GridSearchCV是通过穷举法搜索所有可能的超参数组合,适用于搜索范围较小的场景,计算开销较大。
  • RandomizedSearchCV通过从超参数空间中随机选择一定数量的组合进行评估,适用于超参数空间较大的情况,计算效率更高。
  • 通过使用这两种方法进行超参数优化,我们能够找到最优的模型配置,提高模型的准确性和泛化能力。

在实际应用中,可以根据任务的复杂度和超参数空间的大小选择合适的搜索方法。

去1:1私密咨询

系列课程: