在使用scikit learn运行K近邻算法时,当我将K设置为21时,会得到一个值错误。然而,当我将K设置为k=np.arange(20) +1
时,却不会出现错误,那么这两种设置有什么区别呢?
k = np.arange(21)parameters = {'n_neighbors': k}knn = sklearn.neighbors.KNeighborsClassifier()clf = sklearn.grid_search.GridSearchCV(knn, parameters, cv=10)clf.fit(X_train, Y_train)ValueError: Invalid shape in axis 1: 0.
另外,有人能解释一下以下代码的含义吗?
a = clf.grid_scores_scores = [b.cv_validation_scores for b in a]
scores的输出如下:
array([ 1. , 0.90909091, 1. , 0.72727273, 0.9 , 1. , 1. , 1. , 1. , 0.88888889]),
clf.grid_scores_
是分类器的准确率,但cv_validation
scores 是什么意思?
回答:
GridSearchCV
期望为每个参数提供一个值列表来进行搜索。如果你只想设置一个值进行搜索,请将其放入列表中:
parameters = {'n_neighbors': [21]} # 正确parameters = {'n_neighbors': np.range(21)} # 错误,第一个值是0parameters = {'n_neighbors': np.range(21) + 1} # 正确
请注意,该列表中的每个值都应该是该参数的有效值。例如,使用np.range(p)
作为n_neighbors
的参数列表是错误的,因为它包含了0
,这对于邻居数量来说是无效的值。
根据文档,
cv_validation_scores
[是] 每个折叠的分数列表
因此,grid_scores_
必须是相应的cv_validation_scores
的平均值。