为什么随机搜索的表现比网格搜索更好?

我在使用scikit-learn的RandomizedSearchCV函数进行实验。一些学术论文声称,与进行完整的网格搜索相比,随机搜索能够提供“足够好”的结果,并且节省大量时间。

令人惊讶的是,在一次尝试中,RandomizedSearchCV的表现比GridSearchCV更好。我认为GridSearchCV应该是详尽的,因此结果应该比RandomizedSearchCV好,假设它们搜索的是相同的网格范围。

对于相同的数据集和大致相同的设置,GridSearchCV返回了以下结果:
最佳交叉验证准确率:0.7642857142857142
测试集得分:0.725
最佳参数:’C’: 0.02

而RandomizedSearchCV返回了以下结果:最佳交叉验证准确率:0.7428571428571429
测试集得分:0.7333333333333333
最佳参数:’C’: 0.008

对我来说,0.733的测试得分比0.725要好,并且RandomizedSearchCV的测试得分与训练得分之间的差异更小,据我所知,这意味着过拟合更少。

那么为什么GridSearchCV返回的结果更差呢?

GridSearchCV代码:

def linear_SVC(x, y, param, kfold):    param_grid = {'C':param}    k = KFold(n_splits=kfold, shuffle=True, random_state=0)    grid = GridSearchCV(LinearSVC(), param_grid=param_grid, cv=k, n_jobs=4, verbose=1)    return grid.fit(x, y)#high C means more chance of overfittingstart = timer()param = [i/1000 for i in range(1,1000)]param1 = [i for i in range(1,101)]param.extend(param1)#progress = progressbar.bar.ProgressBar()clf = linear_SVC(x=x_train, y=y_train, param=param, kfold=3)print('LinearSVC:')print('Best cv accuracy: {}' .format(clf.best_score_))print('Test set score:   {}' .format(clf.score(x_test, y_test)))print('Best parameters:  {}' .format(clf.best_params_))print()duration = timer() - startprint('time to run: {}' .format(duration))

RandomizedSearchCV代码:

from sklearn.model_selection import RandomizedSearchCVdef Linear_SVC_Rand(x, y, param, kfold, n):    param_grid = {'C':param}    k = StratifiedKFold(n_splits=kfold, shuffle=True, random_state=0)    randsearch = RandomizedSearchCV(LinearSVC(), param_distributions=param_grid, cv=k, n_jobs=4,                                    verbose=1, n_iter=n)    return randsearch.fit(x, y)start = timer()param = [i/1000 for i in range(1,1000)]param1 = [i for i in range(1,101)]param.extend(param1)#progress = progressbar.bar.ProgressBar()clf = Linear_SVC_Rand(x=x_train, y=y_train, param=param, kfold=3, n=100)print('LinearSVC:')print('Best cv accuracy: {}' .format(clf.best_score_))print('Test set score:   {}' .format(clf.score(x_test, y_test)))print('Best parameters:  {}' .format(clf.best_params_))print()duration = timer() - startprint('time to run: {}' .format(duration))

回答:

首先,试着理解这个:https://stats.stackexchange.com/questions/49540/understanding-stratified-cross-validation

所以你应该知道StratifiedKFold比KFold更好。

在GridSearchCV和RandomizedSearchCV中都使用StratifiedKFold。确保设置”shuffle = False“,并且不使用”random_state“参数。这样做的作用是:你使用的数据集不会被打乱,因此每次训练时你的结果不会发生变化。你可能会得到你期望的结果。

GridSearchCV代码:

def linear_SVC(x, y, param, kfold):    param_grid = {'C':param}    k = StratifiedKFold(n_splits=kfold)    grid = GridSearchCV(LinearSVC(), param_grid=param_grid, cv=k, n_jobs=4, verbose=1)    return grid.fit(x, y)

RandomizedSearchCV代码:

def Linear_SVC_Rand(x, y, param, kfold, n):    param_grid = {'C':param}    k = StratifiedKFold(n_splits=kfold)    randsearch = RandomizedSearchCV(LinearSVC(), param_distributions=param_grid, cv=k, n_jobs=4,                                    verbose=1, n_iter=n)    return randsearch.fit(x, y)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注