在机器学习模型的训练过程中,超参数的调整或优化是至关重要的。模型的超参数不能通过学习过程从给定的数据集中确定,但它们对于控制学习过程本身至关重要。这些超参数源自机器学习模型的数学表述。例如,在训练线性回归模型时学习的权重是参数,但梯度下降中的学习率是超参数。模型在数据集上的性能在很大程度上取决于适当的调整,即找到模型超参数的最佳组合。
超参数优化有多种技术,如网格搜索、随机搜索、贝叶斯优化等。今天将讨论随机搜索的方法和实现。数据科学家设置模型超参数以控制模型的实现方面。一旦数据科学家固定了模型的超参数值,超参数可以被视为模型设置。这些设置需要针对每个问题进行调整,因为一个数据集的最佳超参数不会是所有数据集的最佳选择。
网格搜索和随机搜索是超参数调整中两种广泛使用的技术。网格搜索穷尽地搜索指定的超参数值的每一种组合。与网格搜索不同,随机搜索不会尝试所有给定的参数值。相反,它从指定的分布中抽取固定数量的参数设置。如果所有参数都以列表形式呈现,则执行无放回抽样;如果至少有一个参数以分布形式给出,则使用有放回抽样。随机搜索中的抽样方式可以事先指定。对于具有连续值的超参数,应指定连续分布以充分利用随机化。这种搜索的主要好处是减少了处理时间。
让看看用于调整两个超参数的随机搜索空间的示例。Python实现基于scikit-learn模块,该模块包含一些流行的参考数据集,包括轻松加载和获取它们的方法。将使用乳腺癌威斯康星数据集进行二元分类。乳腺癌数据集是一个经典且简单的二元分类数据集。
让看看基于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代码可以在中找到。如果喜欢这个内核并发现代码有用,请评论和点赞。