📜  超参数优化方法 – ML(1)

📅  最后修改于: 2023-12-03 14:57:48.853000             🧑  作者: Mango

超参数优化方法 - ML

在机器学习中,超参数指的是模型训练过程中需要手动设置的参数,如学习速率、正则化系数等。超参数的选择通常对模型的性能有重要影响,并且不同数据集和任务需要不同的超参数。

因此,如何自动地选择合适的超参数就成为了机器学习中一个重要的问题。本文将介绍几种常见且有效的超参数优化方法。

网格搜索(Grid Search)

网格搜索是最简单的超参数优化方法。它会列举所有可能的参数组合,并在所有参数组合中选择最佳的一组参数。网格搜索的优点是简单易懂,缺点是速度慢,并且不能很好地处理大量参数。

使用scikit-learn库中的GridSearchCV类可以进行网格搜索。下面是一个例子:

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
param_grid = {
    'n_estimators': [10, 50, 100],
    'max_features': ['sqrt', 'log2'],
    'min_samples_leaf': [1, 2, 4]
}
grid_search = GridSearchCV(clf, param_grid, cv=5)
grid_search.fit(X, y)
print(grid_search.best_params_)

上述代码中,我们使用了随机森林分类器,并设置了三个参数:n_estimators、max_features、min_samples_leaf,分别表示森林中树的数量、每个树使用的特征数量、每个叶子节点需要的最小样本数。我们通过GridSearchCV类,对这三个参数不同组合进行了搜索,并使用了5折交叉验证。

随机搜索(Random Search)

网格搜索存在一个问题,那就是当参数数量很多时,搜索空间会变得非常大,导致搜索效率低下。随机搜索则是一种解决这个问题的方法,它不再搜索所有可能的参数组合,而是在参数空间中随机采样一些参数组合进行搜索。

使用scikit-learn库中的RandomizedSearchCV类可以进行随机搜索。下面是一个例子:

from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
from scipy.stats import randint

clf = RandomForestClassifier()
param_dist = {
    'n_estimators': randint(10, 100),
    'max_features': ['sqrt', 'log2'],
    'min_samples_leaf': randint(1, 10)
}
rand_search = RandomizedSearchCV(clf, param_distributions=param_dist, cv=5, n_iter=10)
rand_search.fit(X, y)
print(rand_search.best_params_)

上述代码中,我们同样使用了随机森林分类器,并设置了三个参数:n_estimators、max_features、min_samples_leaf。与网格搜索不同的是,我们使用了scipy库中的randint方法定义了每个参数的采样范围,而不是枚举所有可能的取值。我们通过RandomizedSearchCV类,随机采样了10个参数组合进行了搜索,并使用了5折交叉验证。

贝叶斯优化(Bayesian Optimization)

贝叶斯优化是一种智能地搜索超参数空间的方法,它能够通过概率推断等方法,在不断地迭代中寻找最优超参数组合。贝叶斯优化能够根据先前的搜索结果,不断地更新超参数的概率分布,从而更加高效地搜索超参数空间。

使用一个优秀的Python库BayesianOptimization(https://github.com/fmfn/BayesianOptimization)可以进行贝叶斯优化。下面是一个例子:

from sklearn.ensemble import RandomForestClassifier
from bayes_opt import BayesianOptimization

def rf_eval(n_estimators, max_features, min_samples_leaf):
    clf = RandomForestClassifier(n_estimators=int(n_estimators),
                                 max_features=max_features,
                                 min_samples_leaf=int(min_samples_leaf))
    clf.fit(X_train, y_train)
    return clf.score(X_val, y_val)

pbounds = {'n_estimators': (10, 100),
           'max_features': ['sqrt', 'log2'],
           'min_samples_leaf': (1, 10)}
optimizer = BayesianOptimization(f=rf_eval, pbounds=pbounds, verbose=2)
optimizer.maximize(init_points=5, n_iter=10)
print(optimizer.max)

上述代码中,我们同样使用了随机森林分类器,并设置了三个参数:n_estimators、max_features、min_samples_leaf。我们使用了BayesianOptimization库,并将超参数的采样范围和评估函数(rf_eval)传入了该库。BayesianOptimization会在先前的搜索结果基础上,不断更新超参数的概率分布,并寻找最优超参数组合。我们通过maximize方法,开始进行优化,并输出得到的最优超参数组合。

结论

超参数优化是机器学习中一个非常重要的问题,本文介绍了几种常见且有效的超参数优化方法,包括网格搜索、随机搜索、贝叶斯优化。这些方法各有优缺点,可以根据具体的场景选择合适的方法进行超参数优化。