2016-10-27 17 views
0

私は約200k個のオブジェクトからなるデータセットを扱います。すべてのオブジェクトには4つの機能があります。ユークリッド距離でK最近隣(KNN)でそれらを分類します。プロセスは約20秒で終了します。KNNがカスタムメトリックで遅いのはなぜですか?

最近、カスタムメトリックを使用する理由があります。おそらくそれはより良い結果を生むでしょう。私はカスタムメトリックを実装し、KNNは1時間以上働くようになっています。私はそれを終えるのを待たなかった。

私はこの問題の理由が私の基準であると考えました。私はコードをreturn 1で置き換えます。 KNNはまだ1時間以上働いていました。私は理由がアルゴリズムボールツリーだと仮定しましたが、KNNとそれとユークリッドメトリックは約20秒で動作します。

今私は何が間違っているのか分かりません。私はPython 3とSklearn 0.17.1を使用します。 Hereプロセスをカスタムメトリックで終了することはできません。私もアルゴリズムbruteを試しましたが、同じ効果があります。 scikit-learnのアップグレードとダウングレードは効果がありません。 Python 2でカスタムメトリックによる分類を実装しても効果はありません。私はこのメトリック(ちょうど1を返す)をCythonで実装しましたが、同じ効果があります。

def custom_metric(x: np.ndarray, y: np.ndarray) -> float: 
    return 1 

clf = KNeighborsClassifier(n_jobs=1, metric=custom_metric) 
clf.fit(X, Y) 

カスタムメトリックでKNNによる分類プロセスを向上させることはできますか?

私の英語が不明な場合は、

+2

ユーザ定義関数はPythonでは特に高速ではありません。それらを呼び出す際にオーバーヘッドが多くあります。あなたのカスタムメトリックは、Cで実装されているものを置き換えている可能性があります。 – chepner

+0

KNNのユークリッドメトリックを持つ距離行列は、行列の加算と乗算の観点から実装できます(|| ab ||^2 = || a || (OpenBLAS、ATLAS、MKL) – damienfrancois

+0

@chepner関数は 'return 1'でもオーバーヘッドが存在するのでしょうか?また、私が上で指摘したように、私はCythonでメトリックを実装し、実行時間も大きかった。 @damienfrancoisユークリッドメトリックでは問題ありません。それはsklearnの標準メトリックです。カスタムメトリックを使用しようとすると、パフォーマンスに問題があります。 C/C++ライブラリを見て、C/C++でプログラムを再実装する必要がありますか? – ANtlord

答えて

0

Sklearnは最適化され、cythonといくつかのプロセスを使用してできるだけ早く実行します。純粋なPythonコードを書くことは、特に数回呼び出されたときにコードが遅くなる原因です。 cythonを使用してカスタムメトリックを作成することをお勧めします。 ここにあるチュートリアルをご覧ください:https://blog.sicara.com/https-medium-com-redaboumahdi-speed-sklearn-algorithms-custom-metrics-using-cython-de92e5a325c

0

@RédaBoumahdiが正しく指摘しているのは、pythonで定義されたカスタムメトリックを使用しているためです。これは、hereで説明されている既知の問題です。それは議論の終わりに「不安定」として閉じられました。したがって、pythonメトリックを使用する場合にGILが遅くなるのを避けるために、カスタムメトリックをcythonで記述することだけが提案されています。

関連する問題