教師ありのクラスタリング手法ってどうやって実装すればいいんだろう?
今回はビジネスシーンで使用することが多い、教師ありのクラスタリングモデルk近傍法(k-NN)について説明していきます!
ビジネスでの活用性としては以下の通りです。
ビジネスでの活用性
- ECサイト(オンラインショップ)のレコメンド機能実装に活用。
- 特定の顧客に対してマーケティングオートメーションを行うとき、新規に会員登録された顧客がどの施策対象グループに属するのかを判定する。
- 前提として、あるクラスタに対してこの施策をあてるという条件が決まっている必要がある。
今日はしっかりとクラスタリングモデルのアルゴリズムを理解し、実装する力を身につけましょう!
この記事を書いた人
k近傍法(k-NN)とは
k近傍法は、教師あり学習アルゴリズムの1つです。
ラベルのない新規のデータ点を、類似するクラスタ(グループ)に割り当てる機能をもちます。
k近傍法は、近傍(近く)のデータ点のうち多数決で多いクラスタに割り当てることで、クラスタリングを実現します。
具体的な動作は以下の通りです。
k-meansの動作
- 分類したい新規のデータ点を分類済みのデータ群の中に配置する
- 新規データ点の近傍の点で多数決を行い分類するクラスタを割当てる
- ①②を全ての分類したい新規データに対して行う
文字で読むだけでは解釈が難しいと思いますので、次にこの動作を図にして解説していきます!
k近傍法のアルゴリズム
それでは、図解で説明していきます。
今2次元のデータとして、下図のデータセットが初期状態で与えられていたとします。(STEP0)
分類したい新規のデータ点を配置します。(STEP1)
事前に多数決の票数を決めて置き、近傍(k=n)で最も多いクラスタに割り当てます。
近傍(k=5)としたときは、データ点を中心に5番目までに近いデータ点をピックアップしその中で最多のクラスタに割り当てます。(STEP2)
この処理を繰り返し、すべての新規データを分類します。(STEP3)
k近傍法を実装(シナリオとデータ)
それでは、k近傍法の実装プログラムを見ていきましょう!
今回の学習シナリオは、下記の通りです。
シナリオ
また、「がく片の長さ/がく片の幅/花びらの長さ/花びらの幅」=「5/4/2/0.3」のアヤメが観察されたとき品種を予測してください。
シナリオで利用するデータは、こちらからダウンロードできます。
データの構成
- 目的変数のアヤメの品種が0-2でE列に記録されている。
- 説明変数のアヤメのがく片と花びらの長さと幅がA~D列に記録されている。
k近傍法を実装(コードの紹介)
今回のk近傍法によるクラスタリングは、こちらのコードで実装が可能です。
import pandas as pd
from sklearn.cluster import KMeans
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
#データの読込み
df = pd.read_csv('アヤメの品種分類.csv',encoding='shift-jis')
iris_target_data = df.iloc[:,4]
iris_df = df.iloc[:,0:4]
X_train, X_test, Y_train, Y_test = train_test_split(iris_df, iris_target_data)
#k近傍法の実装(n_neighborsは多数決の数を示す)
knn = KNeighborsClassifier(n_neighbors=6)
knn.fit(X_train, Y_train)
Y_pred = knn.predict(X_test)
print(metrics.accuracy_score(Y_test, Y_pred))
出力結果
既存のラベル付きデータから、94.7%の精度でアヤメの品種を予測するモデルが完成しました。
信頼できるモデルと言っても問題なさそうですね!
k近傍法は多数決により所属するクラスタを判定するモデルと説明しましたが、精度を上げるためにどれくらいの数で多数決をとるべきか悩むこともあると思います。
正解は「最もモデル精度が高くなる数」です。
グリッドサーチというn_neighborsを1ずつ変更しながら精度を確かめる手法があるので実行してみましょう。
下記のコードを先ほどのコードの下に追加し、n_neighborsを1~50の範囲で変えながら精度を計算してみます。
accuracy_list = []
sns.set()
k_range = range(1, 50)
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, Y_train)
Y_pred = knn.predict(X_test)
accuracy_list.append(metrics.accuracy_score(Y_test, Y_pred))
figure = plt.figure()
ax = figure.add_subplot(111)
ax.plot(k_range, accuracy_list)
ax.set_xlabel('k-nn')
ax.set_ylabel('accuracy')
plt.show()
出力結果
今回のデータの場合、n_neighborsは7-20の範囲で設定するのが良さそうです!
最後に、「がく片の長さ/がく片の幅/花びらの長さ/花びらの幅」=「5/4/2/0.3」のアヤメの品種を予測してみます。
Y_pred = knn.predict([[5,4,2,0.3]])
print(Y_pred)
上記コードの出力結果は、[0]=ヒオウギアヤメと出力されました。
この予測は94.7%間違いないでしょう。
まとめ
今回は「k近傍法(k-nn)によるクラスタリングモデルの作成方法」について解説しました。
k近傍法は解釈のしやすさと手軽さから実際のビジネスでの活用性が高いモデルです。
今回は教師ありのクラスタリングモデルを紹介しましたが、教師なしの分類モデルに興味がある方はこちらの記事もご覧下さい。
-
コピペで動くk-means/k-means++法|Pythonによる教師なしクラスタリングの活用
教師なしのクラスタリング手法ってどうやって実装すればいいんだろう? 今回はビジネスシーンで必要になることが多い、教師なしのクラスタリングモデルのk-meansについて説明していきます! ビジネスでの活 ...
データサイエンティストとして、キャリア形成を考えている人は以下の記事も参考になります。
-
【完全版】Python習得のロードマップ|初心者プログラミング知識0から年収800万円へ
年収上げたいけど、プログラマって稼げるの? プログラマって知識0からでもなれるの? という質問をもらいますが、「Python」と「データ分析」を武器にすれば6ヶ月で年収800万円以上を狙うことは十分可 ...
それでは、また次の記事でお会いしましょう。
最近のコメント