scikit-learn中的算法可能有一些参数具有默认的选项范围,
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=1, **kwargs)
其中参数的默认值为”auto”,其选项包括:algorithm
: {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}
我的问题是,在使用**GridSearchCV**
寻找算法参数的最佳值集时,如果我不将其添加到参数列表中,GridSearchCV是否会遍历参数的所有默认选项?
例如,我想使用**GridSearchCV**
来寻找**kNN**
的最佳参数值,我需要检查n_neighbors
和algorithm
参数,是否可以只传递如下所示的值(因为algorithm
参数有默认选项),
parameter_list = {'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]}
还是我必须指定所有我想检查的选项?
parameter_list = {'algorithm': ['auto', 'ball_tree', 'kd_tree', 'brute'],'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]}
谢谢。
回答:
不,你对参数默认值和可用选项存在误解。
查看KNeighborsClassifier
的文档,参数algorithm
是一个可选参数(即你在构造KNeighborsClassifier时可以选择是否指定它)。
但如果你决定指定它,那么它有可用的选项:{‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}
。这意味着你只能从这些给定的选项中为algorithm
提供值,而不能使用其他字符串来指定algorithm
。默认选项是'auto'
,意味着如果你不提供任何值,它将内部使用'auto'
。
- 情况1:-
KNeighborsClassifier(n_neighbors=3)
这里由于没有为algorithm
指定值,所以它将默认使用algorithm=’auto’。
- 情况2:-
KNeighborsClassifier(n_neighbors=3, algorithm='kd_tree')
这里因为指定了算法,所以它将使用’kd_tree’
现在,GridSearchCV
只会将在param_grid
中指定的参数传递给估计器。所以在你的例子中,当你使用问题中的第一个parameter_list
时,它只会将n_neighbors
传递给估计器,而算法将仅使用默认值('auto'
)。
如果你使用第二个parameter_list
,那么n_neighbors
和algorithm
都将被传递给估计器。