2016-06-20 14 views
2

グリッドパラメータの1つがKNNアルゴリズムに使用される距離メトリックであるグリッド検索を実行しようとする次のコードスニペットがあります。 "wminkowski"、 "seuclidean"、 "mahalanobis"の距離メトリックを使用すると、以下の例は失敗します。Scikit-learn:グリッド検索の距離メトリックのパラメータを定義する方法

# Define the parameter values that should be searched 
k_range = range(1,31) 
weights = ['uniform' , 'distance'] 
algos  = ['auto', 'ball_tree', 'kd_tree', 'brute'] 
leaf_sizes = range(10, 60, 10)  
metrics = ["euclidean", "manhattan", "chebyshev", "minkowski", "mahalanobis"] 

param_grid = dict(n_neighbors = list(k_range), weights = weights, algorithm = algos, leaf_size = list(leaf_sizes), metric=metrics) 
param_grid 

# Instantiate the algorithm 
knn = KNeighborsClassifier(n_neighbors=10) 

# Instantiate the grid 
grid = GridSearchCV(knn, param_grid=param_grid, cv=10, scoring='accuracy', n_jobs=-1) 

# Fit the models using the grid parameters 
grid.fit(X,y) 

私は( - WMinkowskiDistance「wminkowski」のwは、例えばpについて)は、様々な距離パラメータの範囲を設定または定義する必要があるため、これがあると仮定する。 「ミンコフスキー」距離が作業することができる、その「P」パラメータがデフォルト2.

を持っているので、だから私の質問は以下のとおりです。

  1. 我々はグリッドサーチのために距離メトリックのパラメータの範囲を設定することができますし、もしそうなら、どのように?
  2. グリッド検索の距離メトリックのパラメータの値を設定できますか?

質問は明らかです。 TIA

答えて

2

私はついに、Scikitユーザーと開発者のメーリングリストの助けを得て答えを得ました。私は他の人にも役立つことを望んで、私が学んだことをここに置いています。

上記の2つの質問に対する答えは「はい」です。これは私がメーリングリストから得たサンプルコードです:注意すべき

params = [{'kernel':['poly'],'degree':[1,2,3],'gamma':[1/p,1,2],'coef0':[-1,0,1]}, 
      {'kernel':['rbf'],'gamma':[1/p,1,2]}, 
      {'kernel':['sigmoid'],'gamma':[1/p,1,2],'coef0':[-1,0,1]}] 

2つのこと:

  1. あなたはパラメータのセットを一覧表示することができ、各セットのためにあなたがいるだけでどのような場所は自由ですパラメータのグループに必要です。つまり、メトリックと対応するパラメータを選択できます。パラメータは、キーを使用して命名されます。

  2. 各キーについて、値のリストを使用できます。これらの値の各組み合わせは、グリッド検索で使用され、対応するメトリック関数に渡されます。

これは、パラメータの組み合わせをメトリックにどのように渡すかという問題が残ります。注:すべてのメトリックをアルゴリズムで使用できるわけではないため、手動で設定する必要があります。

  1. 'wminkowski'['brute', 'ball_tree']アルゴリズムで動作します:以下

    {'metric': ['wminkowski'], 
            'metric_params':[ 
               {'w':np.array([2.0] * len(X.columns)),'p':1.0}, # L1 
               {'w':np.array([2.0] * len(X.columns)),'p':1.5}, 
               {'w':np.array([2.0] * len(X.columns)),'p':2.0}, # L2 
               {'w':np.array([2.0] * len(X.columns)),'p':2.5}, 
               {'w':np.array([2.0] * len(X.columns)),'p':3.5}, 
               {'w':np.array([2.0] * len(X.columns)),'p':3.0} 
               ], 
            'algorithm': ['brute', 'ball_tree'], 
            'n_neighbors': list(k_range), 'weights': weights, 'leaf_size': list(leaf_sizes) } 
    

    注:

    は、私は今、私は上記の要求された例を示しています。

  2. パラメータの可能な組み合わせをすべて列挙するために、私は'metric_params'の辞書のリストを使用する必要があります(私はこれを自動化する方法を見つけられませんでした)。変換は暗黙的に行われていなかったので、私はnumpyの配列を使用することを余儀なくされた上記のケースで
  3. (そうでない場合、我々は例外を取得)

私はこれを行うためのより良い方法のいずれかを知って、コメントしてください。

関連する問題