<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>「k近傍法」タグの記事一覧Python Tech</title>
	<atom:link href="https://tech.nkhn37.net/tag/k%e8%bf%91%e5%82%8d%e6%b3%95/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Sun, 23 Nov 2025 06:15:44 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://tech.nkhn37.net/wp-content/uploads/2021/01/cropped-lion-normal-clear-1-32x32.png</url>
	<title>「k近傍法」タグの記事一覧Python Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【scikit-learn】k近傍法（k-NN）を用いたデータ分類方法</title>
		<link>https://tech.nkhn37.net/scikit-learn-k-neighbors-classifier/</link>
					<comments>https://tech.nkhn37.net/scikit-learn-k-neighbors-classifier/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Sun, 28 Aug 2022 20:00:00 +0000</pubDate>
				<category><![CDATA[scikit-learn]]></category>
		<category><![CDATA[k-NN]]></category>
		<category><![CDATA[KNeighborsClassifier]]></category>
		<category><![CDATA[k近傍法]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=4520</guid>

					<description><![CDATA[Python の機械学習ライブラリである scikit-learn の KNeighborsClassifier を使って k 近傍法 (k-NN) によるデータ分類を行う方法を解説します。 k 近傍法（k-NN） k  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python の機械学習ライブラリである scikit-learn の <span class="jinr-d--text-color d--marker1 d--bold"><code>KNeighborsClassifier</code></span> を使って <span class="jinr-d--text-color d--marker1 d--bold">k 近傍法 (k-NN)</span> によるデータ分類を行う方法を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">k 近傍法（k-NN）</h2>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">k 近傍法 (k-NN)</span> とは、分類の手法の 1 つです。分類の中では非常に単純なアルゴリズムにであり、他のアルゴリズムのように識別関数、識別モデル、生成モデルのようなものを学習するわけではないため、機械学習の中でも<strong>怠惰学習</strong>と呼ばれたりします。</p>



<p class="wp-block-paragraph">k 近傍法の概要を見てみましょう。k-NN は、k-Nearest Neighbors という名の通り、分類したい対象データから k 個の近傍のデータ点を見つけて多数決によって分類するクラスを決めます。近傍を求める際の距離尺度としては、一般的には距離はユークリッド距離が使用されます。距離尺度には他にもマンハッタン距離やマハラノビス距離といったものがあります。</p>



<p class="wp-block-paragraph">k 近傍法の例を少し見てみましょう。以下のようなデータで黄色のデータ点が青なのか緑なのかを分類したいとしましょう。k=3 とすると、青 : 1、緑 : 2 となるので分類結果は緑となります。しかし、k=8 とすると青 : 5、緑 : 3 となるため青に分類されます。このようにいくつの近傍数を見るかによって分類結果は変わってきます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="586" height="375" src="https://tech.nkhn37.net/wp-content/uploads/2022/08/image-39.png" alt="k 近傍法 (k-NN) k=3" class="wp-image-4522" style="width:440px;height:281px" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/08/image-39.png 586w, https://tech.nkhn37.net/wp-content/uploads/2022/08/image-39-300x192.png 300w" sizes="(max-width: 586px) 100vw, 586px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="568" height="394" src="https://tech.nkhn37.net/wp-content/uploads/2022/08/image-40.png" alt="k 近傍法 (k-NN) k=8" class="wp-image-4523" style="width:426px;height:296px" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/08/image-40.png 568w, https://tech.nkhn37.net/wp-content/uploads/2022/08/image-40-300x208.png 300w" sizes="(max-width: 568px) 100vw, 568px" /></figure>
</div>


<p class="wp-block-paragraph">k 近傍法は、Python の機械学習ライブラリである scikit-learn にて <span class="jinr-d--text-color d--marker1 d--bold"><code>KNeighborsClassifier</code></span> で実装がされています。この記事では、scikit-learn の <code>KNeighborsClassifier</code> を使って k 近傍法によるデータ分類する方法を紹介します。</p>



<h2 class="wp-block-heading jinr-heading d--bold"><code>KNeighborsClassifier</code> を使って<br>k 近傍法によるデータ分類をする方法</h2>



<p class="wp-block-paragraph">以降では、scikit-learn を使用します。インストールがされていない場合は pip でインストールしておいてください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pip install scikit-learn</pre>



<h3 class="wp-block-heading jinr-heading d--bold">k 近傍法の使い方（<code>sklearn.neighbors.KNeighborsClassifier</code>）</h3>



<h4 class="wp-block-heading jinr-heading d--bold">実装例</h4>



<p class="wp-block-paragraph">scikit-learn の <code>make_classification</code> で生成したデータを使って、k 近傍法を実現する <span class="jinr-d--text-color d--marker1 d--bold"><code>KNeighborsClassifier</code></span> の使い方を紹介します。k 近傍法は、近傍数をいくつにするかで結果が変わるのでそれも比較してみようと思います。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier


def main():
    """メイン関数"""
    np.random.seed(1)

    # ===== データの用意
    data, label = make_classification(
        n_samples=1000,
        n_classes=2,
        n_features=4,
        n_informative=4,
        n_redundant=0,
    )
    # データセットを訓練用、テスト用に分割する
    train_data, test_data, train_label, test_label = train_test_split(data, label)

    # ===== 複数のkで性能が分類性能がどのように変わるか確認
    k_list = [k for k in range(1, 11)]
    acc_list = []

    # ===== kを変えながらモデルを順番に学習
    for k in k_list:
        # モデルの構築
        model = KNeighborsClassifier(n_neighbors=k)
        # モデルの学習
        model.fit(train_data, train_label)
        # 正解率の評価
        acc_list.append(model.score(test_data, test_label))

    # ===== 正解率をプロットする
    plt.plot(k_list, acc_list)
    plt.title("accuracy list")
    plt.xlabel("n_neighbors")
    plt.ylabel("accuracy")
    plt.show()


if __name__ == "__main__":
    main()</pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="635" height="478" src="https://tech.nkhn37.net/wp-content/uploads/2022/08/image-41.png" alt="k近傍法 (k-NN) 正解率" class="wp-image-4525" style="width:635px;height:478px" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/08/image-41.png 635w, https://tech.nkhn37.net/wp-content/uploads/2022/08/image-41-300x226.png 300w" sizes="(max-width: 635px) 100vw, 635px" /></figure>
</div>


<h4 class="wp-block-heading jinr-heading d--bold">実装内容の解説</h4>



<p class="wp-block-paragraph">上記で紹介した実装例の各部分ごとに内容を紹介していきます。</p>



<p class="wp-block-paragraph"><strong>必要モジュールのインポート</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier</pre>



<p class="wp-block-paragraph">必要なモジュール類をインポートします。今回は scikit-learn の <code>KNeighborsClassifier</code> を使用するので、<code>sklearn.neighbors</code> からインポートします。またデータ生成用に <code>make_classification</code>、データ分割のために <code>train_test_split</code> をインポートしています。NumPy と Matplotlib はデータの操作や可視化用です。</p>



<p class="wp-block-paragraph"><strong>データセットの準備</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    np.random.seed(1)

    # ===== データの用意
    data, label = make_classification(
        n_samples=1000,
        n_classes=2,
        n_features=4,
        n_informative=4,
        n_redundant=0,
    )
    # データセットを訓練用、テスト用に分割する
    train_data, test_data, train_label, test_label = train_test_split(data, label)</pre>



<p class="wp-block-paragraph">データは <code>make_classification</code> を使って生成します。指定しているパラメータとしては以下のような項目です。</p>



<ul class="wp-block-list jinr-list">
<li><code>n_samples</code>：データ点数</li>



<li><code>n_classes</code>：データのクラス数</li>



<li><code>n_features</code>：各データの次元数</li>



<li><code>n_infomative</code>：各データで情報を持ってる特徴数</li>



<li><code>n_redundant</code>：各データで冗長な特徴数</li>
</ul>



<p class="wp-block-paragraph">今回は 4 次元の特徴を持つ 1,000 点のデータで、2 つのクラスに分かれているデータを生成します。</p>



<p class="wp-block-paragraph"><code>n_infomative</code> は 4 次元のうち意味のある特徴数で、<code>n_redundant</code> は冗長な特徴数という意味ですが、公式ドキュメントの記載を見ると「infomative な特徴のランダムな線形結合で生成される特徴の数」ということです。他の特徴で表現できるということは情報はもっていないような特徴ということですね。</p>



<p class="wp-block-paragraph">乱数シードは、<code>np.random.seed</code> で設定していますが <code>make_classification</code> の <code>randam_state</code> 引数で乱数シードを指定することも可能です。<code>train_test_split</code> を使ってデータを訓練用とテスト用に分割しています。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><code>make_classification</code> の公式ドキュメントは<a href="https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html#sklearn-datasets-make-classification" target="_blank" rel="noreferrer noopener">こちら</a>を参照してください。</p>
</div>
		</div></section>



<p class="wp-block-paragraph"><strong>モデルの生成と正解率</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    # ===== 複数のkで性能が分類性能がどのように変わるか確認
    k_list = [k for k in range(1, 11)]
    acc_list = []

    # ===== kを変えながらモデルを順番に学習
    for k in k_list:
        # モデルの構築
        model = KNeighborsClassifier(n_neighbors=k)
        # モデルの学習
        model.fit(train_data, train_label)
        # 正解率の評価
        acc_list.append(model.score(test_data, test_label))</pre>



<p class="wp-block-paragraph">上記部分が k 近傍法を実行している部分です。まずは、<code>KNeighborsClassifier</code> をインスタンス化します。その際の引数としては近傍数の <code>n_neighbors</code> を指定します。</p>



<p class="wp-block-paragraph">モデルの学習については、<code>fit</code> を使用して <code>train_data</code> と <code>train_label</code> を使用します。また、正解率は、訓練データとは異なる <code>test_data</code> と <code>test_label</code> を用いて <code>score</code> により計算します。</p>



<p class="wp-block-paragraph">今回は k=1 ~ 10 までの数を順番に変えながら <code>for</code> 文で実行し、正解率をリストに追加していきます。</p>



<p class="wp-block-paragraph"><strong>正解率のプロット</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    # ===== 正解率をプロットする
    plt.plot(k_list, acc_list)
    plt.title("accuracy list")
    plt.xlabel("n_neighbors")
    plt.ylabel("accuracy")
    plt.show()</pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="635" height="478" src="https://tech.nkhn37.net/wp-content/uploads/2022/08/image-41.png" alt="k近傍法 (k-NN) 正解率" class="wp-image-4525" style="width:635px;height:478px" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/08/image-41.png 635w, https://tech.nkhn37.net/wp-content/uploads/2022/08/image-41-300x226.png 300w" sizes="(max-width: 635px) 100vw, 635px" /></figure>
</div>


<p class="wp-block-paragraph">こちらの部分は、計算した正解率のリストをプロットしている部分です。正解率は、どうやら <code>n_neighbors=3</code> の時が最も高いようです。</p>



<p class="wp-block-paragraph">今回のデータではという意味ですので、3 が常に適切ということはありません。対象とする問題によりハイパーパラメータとして調整する必要があります。近傍数が多すぎると分類範囲の狭いようなカテゴリーではうまく分類されない場合もあります。</p>



<p class="wp-block-paragraph">以上が、scikit-learn の <code>KNeighborsClassifier</code> を使った k 近傍法 (k-NN) によるデータ分類方法の紹介でした。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Python の機械学習ライブラリである scikit-learn の <span class="jinr-d--text-color d--marker1 d--bold"><code>KNeighborsClassifier</code></span> を使って <span class="jinr-d--text-color d--marker1 d--bold">k 近傍法 (k-NN)</span> によるデータ分類を行う方法を解説しました。</p>



<p class="wp-block-paragraph">k 近傍法は、分類アルゴリズムの中ではかなりシンプルな考え方の方法で簡単に適用できます。まずデータ分類するときに使ってみるのもよいでしょう。必ずしも複雑な分類モデルが常に適切ということはなく、k 近傍法で十分な例もあるかもしれません。</p>



<p class="wp-block-paragraph">今回紹介したように簡単に使用できますので、試しに使ってみてください。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><code>sklearn.neighbors.KNeighborsClassifier</code> の公式ドキュメントは<a href="https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn-neighbors-kneighborsclassifier" target="_blank" rel="noreferrer noopener">こちら</a>を参照してください。</p>
</div>
		</div></section>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-data-analysis/scikit-learn/k-nn" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/scikit-learn-k-neighbors-classifier/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: tech.nkhn37.net @ 2026-06-13 13:21:19 by W3 Total Cache
-->