机器学习中的超参数优化:随机搜索方法

机器学习模型的训练过程中,超参数的调整或优化是至关重要的。模型的超参数不能通过学习过程从给定的数据集中确定,但它们对于控制学习过程本身至关重要。这些超参数源自机器学习模型的数学表述。例如,在训练线性回归模型时学习的权重是参数,但梯度下降中的学习率是超参数。模型在数据集上的性能在很大程度上取决于适当的调整,即找到模型超参数的最佳组合。

超参数优化有多种技术,如网格搜索、随机搜索、贝叶斯优化等。今天将讨论随机搜索的方法和实现。数据科学家设置模型超参数以控制模型的实现方面。一旦数据科学家固定了模型的超参数值,超参数可以被视为模型设置。这些设置需要针对每个问题进行调整,因为一个数据集的最佳超参数不会是所有数据集的最佳选择。

什么是随机搜索?

网格搜索和随机搜索是超参数调整中两种广泛使用的技术。网格搜索穷尽地搜索指定的超参数值的每一种组合。与网格搜索不同,随机搜索不会尝试所有给定的参数值。相反,它从指定的分布中抽取固定数量的参数设置。如果所有参数都以列表形式呈现,则执行无放回抽样;如果至少有一个参数以分布形式给出,则使用有放回抽样。随机搜索中的抽样方式可以事先指定。对于具有连续值的超参数,应指定连续分布以充分利用随机化。这种搜索的主要好处是减少了处理时间。

随机搜索空间的示例

让看看用于调整两个超参数的随机搜索空间的示例。Python实现基于scikit-learn模块,该模块包含一些流行的参考数据集,包括轻松加载和获取它们的方法。将使用乳腺癌威斯康星数据集进行二元分类。乳腺癌数据集是一个经典且简单的二元分类数据集。

Python实现

让看看基于Python的随机搜索实现。scikit-learn的RandomizedSearchCV函数实现了随机搜索。让看看这个函数的重要参数:

estimator: 一个scikit-learn模型类型的对象。 param_distributions: 一个字典,参数名称作为键,分布或要搜索的参数列表作为值。 scoring: 一个评分策略,用于评估交叉验证模型在测试集上的性能。 n_iter: 它指定要随机尝试的组合数量。选择的数字太低会降低找到最佳组合的机会。 选择的数字太大会增加处理时间。因此,它在运行时间和解决方案质量之间进行权衡。 cv: 在RandomizedSearchCV中,“CV”代表交叉验证,这也在优化过程中执行。交叉验证是一种重采样方法,用于使用样本外的数据块测试模型的泛化能力。可以通过该方法中的“cv”值确定交叉验证分割策略。

从sklearn.datasets,将使用load_breast_cancer方法加载乳腺癌威斯康星数据集。如果return_X_y设置为true,则返回(数据,目标)。

X, y = load_breast_cancer(return_X_y=True) print(X.shape)

让使用train_test_split将数据集拆分为训练和测试集:

X_train, X_test, y_train, y_test = train_test_split(X, y)

将使用StandardScaler进行数据预处理。可以看到,训练数据被拟合转换,而测试数据仅被转换。

ss = StandardScaler() X_train_ss = ss.fit_transform(X_train) X_test_ss = ss.transform(X_test)

首先,将使用Random Forest Classifier,不使用随机搜索,并使用默认值的超参数。

clf = RandomForestClassifier() clf.fit(X_train_ss, y_train) y_pred = clf.predict(X_test_ss)

可以在测试数据上计算准确度分数,并开发一个混淆矩阵:

confusion_matrix(y_test, y_pred), "Test data" acc_rf = accuracy_score(y_test, y_pred) print(acc_rf)

将使用Random Forest Classifier和Randomized Search来找出超参数的最佳可能值。在这里调整Random Forest分类器的五个超参数,如max_depth、max_features、min_samples_split、bootstrap和criterion。随机搜索将搜索给定的超参数分布以找到最佳值。还将使用3折交叉验证方案(cv = 3)。

param_dist = {"max_depth": [3, 5], "max_features": sp_randint(1, 11), "min_samples_split": sp_randint(2, 11), "bootstrap": [True, False], "criterion": ["gini", "entropy"]} # 构建一个分类器 clf = RandomForestClassifier(n_estimators=50) # 随机搜索 random_search = RandomizedSearchCV(clf, param_distributions=param_dist, n_iter=20, cv=5, iid=False) random_search.fit(X_train_ss, y_train) print(random_search.best_params_)

完整的Python代码可以在中找到。如果喜欢这个内核并发现代码有用,请评论和点赞。

  • 机器学习中,超参数优化至关重要,以便模型可以在给定的数据集上得到最佳训练。这些不是通过学习过程学到的。
  • 随机搜索比网格搜索的处理器时间少。
  • 在随机搜索中,从指定的分布中抽取固定数量的参数设置。
  • Pythonscikit-learn库在其RandomizedSearchCV函数中实现了随机搜索。这个函数需要与其参数一起使用,如estimator、param_distributions、scoring、n_iter、cv等。
  • 随机搜索比网格搜索快。然而,在减少处理器时间和找到最优组合之间存在权衡。随机搜索方法可能无法保证找到最优的超参数组合。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485