在KNN交叉验证网格搜索中定义距离参数(V)(使用标准化欧几里得/马氏距离度量)

3
我正在尝试使用Python的sklearn库进行KNN算法的k倍交叉验证网格搜索,搜索参数包括邻居数量K和距离度量。我将马氏距离和seuclidean作为距离度量,并且理解它们具有需要指定的参数,即V或VI(特征的协方差矩阵或其逆矩阵)。
以下是我的代码:
X_train, X_test, y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=10,stratify=y)

knn=KNeighborsClassifier()

grid_param={'n_neighbors':np.arange(1,51),'metric':['euclidean','minkowski','mahalanobis','seuclidean'],'metric_params':[{'V': np.cov(X_train)}]} 

knn_gscv=GridSearchCV(knn,grid_param,cv=5)

knn_gscv.fit(X_train,y_train) (*)

执行该(*)行时会抛出以下错误:

TypeError: __init__() got an unexpected keyword argument 'V'

我也尝试过使用VI而不是V,但仍然遇到相同的错误。

我找到了下面的潜在解决方案,但它们并没有帮助。

https://github.com/scikit-learn/scikit-learn/issues/6915

Scikit-learn:如何定义网格搜索的距离度量参数

非常感谢您的帮助!

这也是我的第一个问题,所以任何反馈都会对我有所帮助。

1个回答

4
grid_params = [
    {'n_neighbors': np.arange(1, 51), 'metric': ['euclidean', 'minkowski']},
    {'n_neighbors': np.arange(1, 51), 'metric': ['mahalanobis', 'seuclidean'],
     'metric_params': [{'V': np.cov(X_train)}]}
]

问题在于 euclideanminkowski 度量不接受 V 参数,因此您需要将它们分开。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接