機械学習のアルゴリズムについて説明していきます。今回はクラスタリングについてです。
著者がポイントとして考える、AIの基礎をできるだけ簡単な形でお伝えします。書籍等で勉強する前にご一読いただけると、理解を深めることができると思います!pythonの簡単なコードを併せて説明していきます。
クラスタリングとは一言で言うと「それっぽく分ける」ことです。前にAIにできることで説明しています。詳細は↓を読んでみてください。
それっぽく分けるってアバウトすぎるでしょ…
そうですよね。今回は私がNeural Network Console Challenge#2で優秀賞を受賞した中で使ったコード例を基に説明していきます!
クラスタリングとは?使いどころは?
それっぽく分けると言いましたが、すみません…さすがにもう少し詳しく説明します。
クラスタリングとは機械学習の中では代表的な教師なし学習アルゴリズムになります。教師なしとは、観測したデータのみで分析を行う手法で、人があらかじめ正解を与える必要がありません。
教師なしのアルゴリズムだから、そういうデータに出会ったら使いどころということだよね。
いやいや!もっとうまい使いどころがたくさんあるんですよ!お願いしますよ!
クラスタリングがどんなに便利なことか…普通に聞いているだけでは分からないと思いますので少し説明します。
私が思うに、クラスタリングとは単独で結論を出すというより、タグを付けたり、質の異なるデータを分けたり、他のアルゴリズムと連動させたときに効果を発揮するように思います。
- 大量のデータにアノテーションが必要なときに、まず使ってみる
Neural Network Console Challenge#2は、10,000点の音声(BGM)データを解析するAI開発コンテストでした。それぞれの曲に教師データは付与されておりませんでしたので、とにかくデータの状況を知ろうという意味でクラスタリング分析をしました。すると学習に適さない短いBGMだったりのクラスターが出てきたり、データを篩にかけることができます。
- データのアノテーションが感覚的なモノになってしまうとき
犬、猫の画像などであれば瞬時に判断してアノテーションすることができると思いますが、曲はそれとは異なり人の感覚によるものなのでアノテーションは難しいです。例えばある曲をきいたとき、クラシック、バラードなどの曲のジャンルを明確に答えられますか?私は一曲ずつ聞いてアノテーションしようと試みましたが、20~30曲聞いて発狂しそうになったのでやめました。こんな時にもクラスタリング分析が役に立ちます。
- 他の機械学習の前処理としてデータを分ける必要があるとき
データの中に異質なモノが混在していると機械学習の能力が低下することを前に説明しました。大量のデータを学習させようとしたときに、うまく学習が進まないことがあります。それはデータに特長の異なる集団がいくつもある、ということも可能性としては考えられます。そういう時にクラスタリングであらかじめ分けて学習させると効果的だったりします。Neural Network Console Challenge#2の中では、2回のクラスタリング分析を実施しており、1回目はラフにクラスタリングし、2回目で細かく分けるという処理を実施しております。こんな風に前処理としてクラスタリング分析をするということも結構やります。
クラスタリングするってことは、そのものが答えになるケース以外に色々と使い道があるんだね。
そうなんですよ。色々試してみてくださいよ~
代表的なクラスタリング手法と注意点
クラスタリングには様々な手法がありますが、ここでは代表的なモノとしてNeural Network Console Challenge#2の中で使用した2つのアルゴリズムについて説明していきます。
K-means法
クラスタリングの代表的な手法の一つにK-means法があります。K-means法はクラスタの平均(means)を用い、事前に与えられたクラスタ数(k)に分割する手法です。中身の難しい計算は省略しますが、注意点がいくつかあります。
- 最初のクラスターを決定するために乱数を用いるため実行の度にクラスタリング結果が変わる(これを克服するK-means++というアルゴリズムがあります)
- クラスター数kはユーザーが決定する必要があり、これによってもクラスタリング結果は変わってくる。
とまあ、何かをバッチリ決めてやるというよりは、ゆるーく分けるみたいな使い方をするのが良いかなと思います。
混合ガウスモデル
混合ガウスモデルは入力されたデータに対し、その分布を複数のガウス分布(正規分布)で近似するモデルです。各データがどのガウス分布に属する割合が高いかを求めることでデータのクラスタリングを実施する手法となります。注意点としては、
- データがガウス分布(正規分布)に従っているという前提のアルゴリズムなので、他の分布に従う場合はうまくクラスタリングできない。
データに確率分布を当てはめ、どのクラスタに属するかを確率的に決めるので、k-meansより少し説得力あります。
まとめ
クラスタリングの使いどころは…
- 大量のデータにアノテーションが必要なときに、まず使ってみる
- データのアノテーションが感覚的なモノになってしまうとき
- 他の機械学習の前処理としてデータを分ける必要があるとき
K-means法:ゆるーく分けるツール
<注意点>
- 最初のクラスターを決定するために乱数を用いるため実行の度にクラスタリング結果が変わる(これを克服するK-means++というアルゴリズムがあります)
- クラスター数kはユーザーが決定する必要があり、これによってもクラスタリング結果は変わってくる。
混合ガウスモデル:データに確率分布を当てはめ分類するツール
<注意点>
- データがガウス分布(正規分布)に従っているという前提のアルゴリズムなので、他の分布に従う場合はうまくクラスタリングできない。
pythonコード
K-means法
import pandas as pd
# dataフォルダ中の****.csvデータの読み込み(分析対象のデータを入れてください)
s = pd.read_csv("../data/****.csv", header=None, squeeze=True).map(int)
df = pd.DataFrame(s.tolist())
# KMeans
from sklearn.cluster import KMeans
model = KMeans(n_clusters=3) # モデル作成 (クラスタ数 = 3)
model.fit(df)
df["label"] = model.labels_ # ラベルの取得
df.head()
混合ガウスモデル
from sklearn import preprocessing, mixture
#GaussianMixtureモデルをインスタンス化(クラスタ数3)
gmm=mixture.GaussianMixture(n_components=3,covariance_type='full', random_state=1)
gmm.fit(df)
#モデルで予測を実行
z_gmm = gmm.predict(df)
#結果パラメータ出力
print("混合係数\n{}\n".format(gmm.weights_))
print("平均\n{}\n".format(gmm.means_))
print("分散\n{}\n".format(gmm.covariances_))
こんな感じの簡単なコードで実装可能です。
コメント