第5章 教師無し学習
1 教師無し学習とは?
教師無し学習には分類と次元削減があります。このうち、分類はデータの特徴量を解析し、いくつかのグループ(クラスタ)に分けるものです。クラスタ分析ともいいます。
例えば、あやめのデータを使い、クラスタ分析してみましょう。 ファイル cluster.ipynb に以下を記述します。
import pandas as pd
df = pd.read_csv("iris.csv")
df.head()
教師有り学習と同じように特徴量を学習データとします。正解ラベルは使いませんので、学習データのみのデータにします。
df = df[["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]]
df
教師無し学習に使用するアルゴリズムはK平均法が多く使われます。まずいくつのクラスタに分けるかを定めます。例えば3つに分けるとすると、3つのデータをランダムに選びます。これを代表点と呼びます。そのほかのデータは最も近い代表点に所属すると判定します。
その後、クラスタ内の中心となる点を新たな代表点にします。代表点が変化したので再度全てのデータをどの代表点に属するかを判断します。これを代表点が変化しなくなるまで繰り返します。
scikit-learnではいくつのクラスタに分けるかを指定するだけです。
# K平均法
from sklearn.cluster import KMeans
model = KMeans(n_clusters=3, n_init='auto') # 3つに分類
model.fit_predict(df)
2 クラスターの特徴を調べる
各クラスタの特徴を調べてみましょう。 クラスタに分けた結果をcluster列に入れます。
df["cluster"] = model.fit_predict(df)
df
クラスタごとの各列の平均値を見てみましょう。
df.groupby("cluster").mean()
各特徴量の分布を確認します。
import seaborn as sns
sns.set(font=["Meiryo"])
sns.pairplot(data=df, hue="cluster", palette="Set1")
3 いくつのクラスタに分けるか
いくつのクラスタに分けたら良いかはエルボー法がよく使われます。 これはクラスタ内誤差平方和(SSE)を元に行います。クラスタ内誤差平方和は、データと代表点との差を二乗し合計したものです。この数値はクラスタ数を多くすると低下していき、最も小さくなるのはクラスタ数=データ数になったときです。
クラスタ数を次第に大きくしながら、SSEを確認します。SSEは次第に小さくなりますが、ある地点であまり減少しなくなります。そこが最適のクラスタ数と判断できます。
あやめのデータで試してみます。結果をデータフレーム dfs に格納します。2から10までクラスター数を増やしていき、その結果の平均絶対誤差を model.inertia_ で取得し、DataFrameに入れます。
from sklearn.cluster import KMeans
dfs = pd.DataFrame(columns=["SSE"])
for i in range(2,10):
model = KMeans(n_clusters=i, n_init='auto')
model.fit_predict(df)
dfs.loc[i] = [model.inertia_]
dfs
グラフを表示します。
dfs.plot()
3以降はあまり減っていないので、3が最適と分かります。