なぜk最近傍分類器に合わせる必要があるのですか?


11

私が理解したように、k-NNは遅延学習アルゴリズムであり、トレーニングフェーズを必要としません。では、なぜ.fit()sklearn を使用する必要があるのでしょうか。それを使用するとどうなりますか?

回答:


9

概念レベルで

分類子の適合とは、データセットを入力として取得し、可能な分類子のスペースから選択された分類子を出力することを意味します。多くの場合、分類子はパラメータのセットによって識別されます。つまり、他の可能な分類子と区別されます。パラメータは通常、最適化問題またはその他の数値手順を解くことによって選択されます。ただし、knnの場合、分類子はトレーニングデータ自体によって識別されます。したがって、抽象的なレベルでは、knn分類器をフィッティングするには、トレーニングセットを格納するだけで済みます。

実装レベル

新しいデータポイントでknn分類子を評価するには、トレーニングセット内の最も近い近傍を検索する必要があります。これは、トレーニングセットが大きい場合、コストのかかる演算になる可能性があります。RUserが述べたように、この検索を高速化するためのさまざまなトリックがあり、これらは通常、トレーニングセットに基づいてさまざまなデータ構造を作成することで機能します。一般的な考え方は、新しいポイントを分類するために必要な計算作業の一部は、実際にはポイント間で共通であるということです。したがって、この作業は事前に行うことができ、新しいインスタンスごとに繰り返すのではなく、再利用できます。これらのトリックを使用するknn実装は、トレーニングフェーズでこの作業を行います。たとえば、scikit-learnは、fit()関数の呼び出し中にkdツリーまたはボールツリーを構築できます。

選択k

k


11

あなたはそれを怠惰な方法で実装することができ、言語を発見するときそれはまともな練習になります。(例ごとに私のブログ投稿の1つを参照してください)。ただし、データをインデックス化して予測を行うこともできます(はるかに高速)。

特徴空間の次元が1である場合、この特徴に従ってポイントを並べ替えると、近隣地域をより速く見つけるのに役立ちます(例:二分探索を使用)。より大きな次元では、ソートの自然な一般化はありませんが、(たとえば)quadtreesを使用してポイントにインデックスを付けることができます。

見ると、ソース、あなたは様々な方法が学ぶscikitで実装されていることがわかります。そして、これらの最近隣クエリを改善し続けるいくつかの研究があります。


5

他の回答者の指摘は確かに有効で興味深いものですが、厳密にソフトウェアエンジニアリングの観点からもう1つ指摘しておきます。

APIと一致させるため

sklearnのEstimatorは、とりわけ、fit1つまたは2つの配列のようなもの(監視対象または監視対象外のEstimator であるかによって異なります)および実装固有の詳細(Source)の数をとるメソッドを持つ必要があります。

したがって、knnのfitメソッドがこれまでまったく何もしなかったとしても、knnは推定器であり、sklearnの開発者とそれらが提供するコードは推定器にfitメソッドがあることを期待しているため、おそらく存在します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.