Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
22
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

クラスタリングの結果を再利用する

データマイニングは大量のデータに解析手法を適用することで、それまで未知だったデータの特徴を発見し、新たな知見を獲得することですが、しばしば機械学習と共通の技法が利用されます。

ごく単純な考え方として教師なし学習の結果をもってすれば残りのその他のデータも同様に知識の適用が可能であり、結果を訓練データとして正確性を向上させたりすることができるわけです。

学年全体の生徒の成績を分類する

前回は生徒の科目ごとの成績からその傾向ごとに班分けをする例を紹介しました。この生徒たちを受け持っている先生はこの班分け結果をもとに学年全体の生徒も分類できるのではないかと考えました。

識別関数の一種であるサポートベクトルマシンと、確率的分類器であるナイーブベイズは考え方も手法もまったく別のものです。

scikit-learn を使う

scikit-learn の素晴らしいところはたくさんありますが、その中のひとつとして異なる手法でも一貫性のある API が設計されており、よく似たコードで実装可能なところではないかと筆者は考えています。

import numpy as np
from sklearn.cluster import KMeans
from sklearn.naive_bayes import GaussianNB
from sklearn import svm

# データの掲載が冗長なのでカンマ区切りの .csv を読み込む形式に
features = np.genfromtxt('data.csv', delimiter=',')

# K-means クラスタリングでラベルを分類する
kmeans_model = KMeans(n_clusters=3, random_state=10).fit(features)
labels = kmeans_model.labels_

clf = GaussianNB() # ガウシアンカーネルによるナイーブベイズ分類器
#clf = svm.SVC(kernel='rbf', C=1) # RBF カーネルによるサポートベクトルマシン

# クラスタリング結果をもとに分類器を鍛える
clf.fit(features, labels)

# テスト対象のデータ (学年の他の生徒たちの成績) を読み込む
test_X = np.genfromtxt('test.csv', delimiter=',')

# 分類器で分類する
results = clf.predict(test_X)

# 結果をソートして表示
ranks = []
for result, feature in zip(results, test_X):
    ranks.append([result, feature, feature.sum()])

ranks.sort(key=lambda x:(-x[2]))

for rank in ranks:
    print(rank)

まとめ

実際にサンプルデータを用意してやってみるとわかりますが、それぞれの手法でクラスごとの境界がどのように変わるか目で見て把握できるかと思います。ここから先はそれぞれの理論の話になってくるわけです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
22
Help us understand the problem. What are the problem?