随机搜索和网格搜索以优化函数

        【翻译自 : Random Search and Grid Search for Function Optimization

       【说明:Jason Brownlee PhD大神的文章个人很喜欢,所以闲暇时间里会做一点翻译和学习实践的工作,这里是相应工作的实践记录,希望能帮到有需要的人!】

       函数优化需要选择一种算法,以有效地对搜索空间进行采样并找到一个好的或最佳的解决方案。有许多算法可供选择,尽管为哪种类型的解决方案可行或可能解决问题建立基准非常重要。这可以使用简单的优化算法(例如随机搜索或网格搜索)来实现。优化算法所获得的结果在计算上是有效的,可以为更复杂的优化算法生成并提供比较点。有时,发现幼稚算法可以达到最佳性能,尤其是在那些嘈杂或不平滑的问题以及领域专业知识通常会偏重优化算法选择的那些问题上。

      在本教程中,您将发现用于函数优化的简单算法。完成本教程后,您将知道:

朴素的算法在函数优化项目中的作用。
如何生成和评估函数优化的随机搜索。
如何生成和评估用于函数优化的网格搜索。

教程概述

        本教程分为三个部分:他们是:

朴素函数优化算法
随机搜索函数优化
网格搜索函数优化

朴素函数优化算法

      您可以使用许多不同的算法来进行优化,但是您如何知道所得到的结果是否很好呢?解决此问题的一种方法是使用朴素的优化算法来建立性能基准。朴素的优化算法是一种不假设正在优化的目标函数的算法。它可以非常轻松地应用,并且该算法获得的最佳结果可以用作比较更复杂算法的参考点。如果更复杂的算法平均不能比单纯的算法获得更好的结果,则它没有解决您的问题的技巧,应该放弃。

有两种朴素的算法可用于函数优化。他们是:

随机搜寻
网格搜索

      这些算法被称为“搜索”算法,因为从根本上说,优化可以归结为搜索问题。例如。找到使目标函数的输出最小化或最大化的输入。可以使用另一种称为“穷举搜索”的算法,该算法会枚举所有可能的输入。这在实践中很少使用,因为枚举所有可能的输入是不可行的,例如需要太多时间才能运行。但是,如果您发现自己正在处理一个优化问题,可以在合理的时间内对所有输入进行枚举和评估,那么这应该是您应该使用的默认策略。

随机搜索函数优化

       随机搜索也称为随机优化或随机采样。随机搜索涉及生成和评估目标函数的随机输入。 之所以有效,是因为它不假设目标函数的结构。 这对于存在很多可能影响或偏向优化策略的领域专业知识的问题可能是有益的,从而可以发现非直观的解决方案。

       对于搜索空间嘈杂或不平滑(不连续)的区域(可能导致算法依赖可靠梯度)的高度复杂问题,随机搜索也可能是最佳策略。我们可以使用伪随机数生成器从域中生成随机样本。 每个变量都需要一个明确定义的界限或范围,并且可以从该范围中采样一个统一的随机值,然后进行评估。生成随机样本在计算上是微不足道的,并且不会占用太多内存,因此,生成大量输入样本然后进行评估可能是有效的。 每个样本都是独立的,因此可以根据需要并行评估样本以加快流程。下面的示例给出了一个简单的一维最小化目标函数的示例,然后生成并评估100个输入的随机样本。 然后报告性能最佳的输入。

# example of random search for function optimization
from numpy.random import rand

# objective function
def objective(x):
	return x**2.0

# define range for input
r_min, r_max = -5.0, 5.0
# generate a random sample from the domain
sample = r_min + rand(100) * (r_max - r_min)
# evaluate the sample
sample_eval = objective(sample)
# locate the best solution
best_ix = 0
for i in range(len(sample)):
	if sample_eval[i] < sample_eval[best_ix]:
		best_ix = i
# summarize best solution
print('Best: f(%.5f) = %.5f' % (sample[best_ix], sample_eval[best_ix]))

         运行示例将生成输入值的随机样本,然后对其进行评估。 然后确定最佳性能点并报告。

        注意:由于算法或评估程序的随机性,或者数值精度的不同,您的结果可能会有所不同。 考虑运行该示例几次并比较平均结果。

        在这种情况下,我们可以看到结果非常接近于最佳输入0.0。

Best: f(-0.01762) = 0.00031

        我们可以更新示例以绘制目标函数,并显示示例和最佳结果。 下面列出了完整的示例。

# example of random search for function optimization with plot
from numpy import arange
from numpy.random import rand
from matplotlib import pyplot

# objective function
def objective(x):
	return x**2.0

# define range for input
r_min, r_max = -5.0, 5.0
# generate a random sample from the domain
sample = r_min + rand(100) * (r_max - r_min)
# evaluate the sample
sample_eval = objective(sample)
# locate the best solution
best_ix = 0
for i in range(len(sample)):
	if sample_eval[i] < sample_eval[best_ix]:
		best_ix = i
# summarize best solution
print('Best: f(%.5f) = %.5f' % (sample[best_ix], sample_eval[best_ix]))
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# plot the sample
pyplot.scatter(sample, sample_eval)
# draw a vertical line at the best input
pyplot.axvline(x=sample[best_ix], ls='--', color='red')
# show the plot
pyplot.show()

         再次运行示例将生成随机样本并报告最佳结果。

Best: f(0.01934) = 0.00037

         然后创建一个折线图,显示目标函数的形状,随机样本和一条红线,用于从样本中找出最佳结果。

网格搜索函数优化

        网格搜索也称为网格采样或全因子采样。网格搜索涉及为目标函数生成统一的网格输入。 在一维中,这将是沿一条线均匀分布的输入。 在二维中,这将是整个表面上均匀间隔的点的晶格,以此类推,以获取更大的尺寸。

        像随机搜索一样,网格搜索对于通常使用领域专业知识来影响特定优化算法选择的问题尤其有效。网格可以帮助快速识别可能需要更多注意的搜索空间区域。样本的网格通常是均匀的,尽管不一定是这种情况。例如,可以使用等距的log-10标度,以允许跨多个数量级执行采样。不利的一面是,网格的粗糙程度可能会遍及搜索空间中可找到好的解决方案的整个区域,而随着该问题的输入数量(搜索空间的维数)增加,该问题将变得更加严重。通过选择点的均匀间隔,然后依次枚举每个变量,并通过选择的间隔递增每个变量,可以生成样本网格。下面的示例给出了一个简单的二维最小化目标函数的示例,然后针对两个输入变量生成一个间距为0.1的网格样本。然后报告性能最佳的输入。

# example of grid search for function optimization
from numpy import arange
from numpy.random import rand

# objective function
def objective(x, y):
	return x**2.0 + y**2.0

# define range for input
r_min, r_max = -5.0, 5.0
# generate a grid sample from the domain
sample = list()
step = 0.1
for x in arange(r_min, r_max+step, step):
	for y in arange(r_min, r_max+step, step):
		sample.append([x,y])
# evaluate the sample
sample_eval = [objective(x,y) for x,y in sample]
# locate the best solution
best_ix = 0
for i in range(len(sample)):
	if sample_eval[i] < sample_eval[best_ix]:
		best_ix = i
# summarize best solution
print('Best: f(%.5f,%.5f) = %.5f' % (sample[best_ix][0], sample[best_ix][1], sample_eval[best_ix]))

         运行示例将生成输入值的网格,然后对其进行评估。 然后确定最佳性能点并报告。

        注意:由于算法或评估程序的随机性,或者数值精度的不同,您的结果可能会有所不同。 考虑运行该示例几次并比较平均结果。

        在这种情况下,我们可以看到结果精确地找到了最优值。

Best: f(-0.00000,-0.00000) = 0.00000

        我们可以更新示例以绘制目标函数,并显示示例和最佳结果。 下面列出了完整的示例。

# example of grid search for function optimization with plot
from numpy import arange
from numpy import meshgrid
from numpy.random import rand
from matplotlib import pyplot

# objective function
def objective(x, y):
	return x**2.0 + y**2.0

# define range for input
r_min, r_max = -5.0, 5.0
# generate a grid sample from the domain
sample = list()
step = 0.5
for x in arange(r_min, r_max+step, step):
	for y in arange(r_min, r_max+step, step):
		sample.append([x,y])
# evaluate the sample
sample_eval = [objective(x,y) for x,y in sample]
# locate the best solution
best_ix = 0
for i in range(len(sample)):
	if sample_eval[i] < sample_eval[best_ix]:
		best_ix = i
# summarize best solution
print('Best: f(%.5f,%.5f) = %.5f' % (sample[best_ix][0], sample[best_ix][1], sample_eval[best_ix]))
# sample input range uniformly at 0.1 increments
xaxis = arange(r_min, r_max, 0.1)
yaxis = arange(r_min, r_max, 0.1)
# create a mesh from the axis
x, y = meshgrid(xaxis, yaxis)
# compute targets
results = objective(x, y)
# create a filled contour plot
pyplot.contourf(x, y, results, levels=50, cmap='jet')
# plot the sample as black circles
pyplot.plot([x for x,_ in sample], [y for _,y in sample], '.', color='black')
# draw the best result as a white star
pyplot.plot(sample[best_ix][0], sample[best_ix][1], '*', color='white')
# show the plot
pyplot.show()

        再次运行该示例将生成网格样本并报告最佳结果。

Best: f(0.00000,0.00000) = 0.00000

       然后创建一个等高线图,显示目标函数的形状,网格样本为黑点,白色星形代表样本的最佳结果。

       请注意,域边缘的一些黑点似乎不在绘图上; 这只是我们如何选择绘制点的人工产物(例如不在样品上居中)。

 

 

 

以下是一个例子,可以帮助您了解如何使用网格搜索随机森林来优化模型: ```python from sklearn.model_selection import GridSearchCV from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_classification # 创建一个分类问题的随机数据集 X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=0, random_state=0, shuffle=False) # 定义参数网格 param_grid = { 'n_estimators': [10, 50, 100], 'max_depth': [None, 5, 10], 'min_samples_split': [2, 5, 10], 'min_samples_leaf': [1, 2, 4] } # 创建随机森林分类器 rfc = RandomForestClassifier(random_state=0) # 进行网格搜索 grid_search = GridSearchCV(estimator=rfc, param_grid=param_grid, cv=5) grid_search.fit(X, y) # 打印最佳参数 print(grid_search.best_params_) ``` 在这个例子中,我们使用`make_classification`函数创建了一个随机数据集,然后定义了一个参数网格,包含了随机森林分类器的不同参数组合。然后,我们创建了一个随机森林分类器,并使用`GridSearchCV`来对模型进行网格搜索。最后,我们打印了最佳参数组合。 请注意,这个例子只是一个简单的演示,实际上,您可能需要调整更多的参数和更大的参数网格来优化您的模型。此外,网格搜索可能需要很长时间才能完成,特别是如果您的数据集非常大或您的参数网格非常大。因此,您需要考虑到这些因素,并选择合适的参数和网格来进行优化
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值