【最も直感的な機械学習】k-近傍法(k-NN)の仕組みを新人エンジニア向けに徹底解説!
こんにちは。ゆうせいです。
「機械学習のアルゴリズムって、なんだか複雑な数式や理論が多くて難しそう…」
エンジニアとして新しい分野に足を踏み入れるとき、そんな風に感じてしまうことはありませんか?
もし、その中にとてつもなくシンプルで、「え、そんな簡単な考え方でいいの?」と思えるようなアルゴ-リズムがあったとしたら、まずはそこから学んでみたいと思いませんか?
今回は、そんな機械学習への入門に最適なアルゴリズム、「k-近傍法(k-Nearest Neighbors, k-NN)」について、世界一わかりやすく解説していきます!
k-近傍法(k-NN)とは?「ご近所さん」に聞く多数決!
k-近傍法は、分類や回帰の問題を解くための、非常に直感的でシンプルな手法です。
その根本的なアイデアは、たった一言で表せます。
「仲間外れはどれだ?答えは、一番近くにいるご近所さんたちに聞けばわかる!」
つまり、「あるデータは、その周りにあるデータと似たような性質を持つだろう」という考え方に基づいています。ことわざで言えば「類は友を呼ぶ」を地で行くアルゴリズムですね。
新しいデータがどちらのグループに属するかわからないとき、そのデータの「最も近くにいるご近所さん」をk人見つけてきて、そのk人の中で最も多数派だったグループに、新しいデータを分類する。
たったこれだけが、k-NNの基本的な仕組みです。
例え話:クラスの転校生はどのグループ?
もっとイメージを掴むために、学校のクラスで考えてみましょう。
そのクラスには、すでに「運動部グループ」と「文化部グループ」の2つの大きな輪ができています。
そこへ、一人の転校生がやってきました。
この転校生が、運動部と文化部のどちらのグループに入りそうかを予測したい、というのが今回の問題です。
k-NNの考え方を使ってみましょう!
- kの数を決めるまず、「何人のご近所さんに話を聞くか」を決める必要があります。これがkです。試しに k=3 にしてみましょう。
- ご近所さんを探す転校生の位置から、最も近くに座っている生徒を3人見つけます。
- 多数決をとるその3人の生徒のうち、2人が「運動部グループ」、1人が「文化部グループ」の生徒でした。多数派は「運動部グループ」ですね。
- 予測するこの結果から、k-NNは「この転校生は、おそらく運動部グループに属するだろう」と予測します。
もしk=5に設定したらどうでしょう?
最も近い5人を見たとき、もし運動部が2人、文化部が3人だったら、今度は「文化部グループに属するだろう」と予測が変わります。
このように、k-NNは非常にシンプルで、私たちの日常的な感覚に近い判断をしていることが分かりますね。
k-NNアルゴリズムの具体的なステップ
k-NNが実際にデータを分類する流れを、もう少しだけ詳しく見てみましょう。
- kの値を決める分析者が、ご近所さんを何人にするかというkの値をあらかじめ決めます。一般的には、奇数(3, 5, 7...)を選ぶことが多いです。なぜなら、多数決の際に票が同数になるのを防ぎやすいためです。
- 距離を計算する予測したい新しいデータ点と、すでにグループが分かっている全ての既存のデータ点との「距離」を計算します。この距離が、データ同士の"近さ"の指標になります。
- 距離が近い順に並べる計算した距離を小さい順に並べ替え、最も距離が近い(つまり、最も似ている)データ点を上からk個選び出します。これが「k個の近傍(Nearest Neighbors)」です。
- 多数決で予測する選び出したk個のデータ点が、どのグループに属しているかを確認し、最も数の多かったグループを、新しいデータの予測結果とします。
回帰問題にも使える!
k-NNは、グループ分け(分類)だけでなく、数値を予測する「回帰」問題にも使えます。
例えば、新しい家の販売価格を予測したい場合を考えてみましょう。
その場合、最後のステップである「多数決」を「平均値の計算」に変えるだけです。
予測したい家のk件の「ご近所さん(広さや駅からの距離などが似ている家)」を見つけてきて、そのk件の家の販売価格の平均値を、新しい家の予測価格とします。これも非常に直感的ですよね。
k-NNのメリットとデメリット
シンプルで強力なk-NNですが、もちろん万能ではありません。長所と短所をしっかり理解しておきましょう。
メリット
- とにかくシンプルで直感的: アルゴリズムの理屈が非常に分かりやすく、機械学習の最初のステップとして学ぶのに最適です。
- 「事前学習」が不要: 多くの機械学習モデルと違い、事前に複雑な計算をしてモデルを「訓練」する必要がありません。単に全てのデータを記憶しておくだけです。このような性質を持つアルゴリズムを「レイジーラーナー(怠惰な学習者)」と呼ぶこともあります。
- 柔軟性が高い: 分類と回帰の両方のタスクに使うことができます。また、決定境界が直線的でないような、複雑な問題にも対応できます。
デメリット
- 予測時の計算コストが高い: これが最大の弱点です。事前学習がない代わりに、新しいデータを予測するたびに、全ての既存データとの距離を計算し直す必要があります。データ数が数百万、数千万になると、予測に非常に時間がかかってしまいます。
- 次元の呪いを受けやすい: 特徴量(データの項目)の数、つまり「次元」が多くなると、パフォーマンスが著しく低下します。高次元の空間では、どのデータ点も互いに遠く離れているように見えてしまい、「最も近いご近所さん」という概念自体が意味をなさなくなってくるためです。
- データのがスケールに影響される: 例えば「年齢(0〜100)」と「年収(300万〜2000万)」のように、特徴量ごとの数値の範囲(スケール)が大きく異なると、スケールの大きい年収のほうが距離計算に強く影響してしまいます。そのため、k-NNを使う前には、各特徴量のスケールを揃える「正規化」や「標準化」といった前処理がほぼ必須となります。
少しだけ数式:距離の測り方
k-NNが「近い」かどうかを判断するために使う「距離」。その最も一般的な計算方法が、「ユークリッド距離」です。
これは、中学校で習った三平方の定理を多次元に拡張したもので、2点間の純粋な直線距離を計算します。
2次元空間上の2つの点、p()とq(
)の間のユークリッド距離は以下の式で表されます。
特徴量が3つ、4つ…と増えても、同じように各座標の差の2乗を足していくだけです。
まとめ:次のステップへ!
今回は、最も直感的でシンプルな機械学習アルゴリズムの一つ、「k-近傍法(k-NN)」を解説しました。
- k-NNは「ご近所さんの多数決」で新しいデータを分類するシンプルな手法。
k
という「ご近所さんの数」を自分で決める必要がある。- 仕組みはシンプルだが、予測時に全データとの距離計算が必要なため、大規模なデータには不向き。
- 使う前には、特徴量のスケールを揃える前処理が重要。
このアルゴリズムの美しさは、その単純さにあります。k-NNを理解することは、より複雑なアルゴリズムを学ぶ上での素晴らしい基礎となります。
最後に、あなたの次のステップを提案します。
- scikit-learnで動かしてみる!理論を学んだら、次は実践です。Pythonの機械学習ライブラリscikit-learnには、KNeighborsClassifierというクラスが用意されており、数行のコードでk-NNを試すことができます。まずはこれを使ってみましょう。
- kの値を変えて実験する同じデータに対して、k=1, k=3, k=11…とkの値を変えると、予測結果がどのように変わるかを見てみましょう。kが小さいとノイズに敏感になり、大きすぎると境界がぼやけていく様子が観察できるはずです。
- 標準化を試すデータの前処理としてStandardScalerなどを使い、特徴量のスケールを揃えてからk-NNを適用した場合と、そうでない場合で精度がどれくらい変わるかを比較してみてください。前処理の重要性を体感できるはずです。
k-NNは、いわば機械学習の世界への「玄関」のようなアルゴ-リズムです。
このシンプルで美しい考え方を足がかりに、さらに奥深い機械学習の世界を探求していってくださいね。応援しています!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。