見出し画像

scikit-learn機械学習㉙k-meansクラスタリング

前回までは、scikit-learnの「教師あり学習」モデルに焦点を当ててきましたが、今回は「教師なし学習」の世界に一歩踏み込みます。取り上げるのは、クラスタリングのアルゴリズムの中でも広く使われている k-means(k-平均法) です。

kーMeansは1967年に発表されたアルゴリズムですが、基本的なアイデア自体はさらに前から存在していました。

当時の機械学習の進歩は目覚ましく、例えば1958年にはパーセプトロンロジスティック回帰、1963年には決定木(Decision Tree)や線形サポートベクトルマシン(Linear SVM)が登場しています。これらのモデルは第1次AIブームの中で生まれ、現在の古典的機械学習の基盤となっているものが多いです。

古い技術であるにもかかわらず、k-meansは今なおもデータのパターンやグループを見つけるためのツールとして役立っています。

ちなみに、k近傍法とk平均法は名前が似ていますが、全くの別物です。また、英語表記だと、k-NNとk-meansなので名前自体が全然違います。なお、k近傍法についてはこちらで解説しています。

今回は、k-meansの理論的な仕組みを解説します。


クラスタリングとは

k-meansクラスタリングは、その名前の通り「クラスタリング」のアルゴリズムです。そして、クラスタリングは、教師なし学習の代表的な手法の一つです。

よって、ここでは「教師あり学習」と「教師なし学習」の違いをおさらいし、クラスタリングの目的や利点を解説します。

「教師あり学習」 vs 「教師なし学習」

ここで簡単に教師あり・なしの違いを解説します。簡単に言うと、ラベルがあるかないかの違いになります。

先生がいるわけではありません。

念の為

以下は、「教師あり学習」と「教師なし学習」の簡単な説明です。

教師あり学習は、ラベル付きデータを使ってモデルが学習する手法で、エラー(損失)を最小化するようパラメータを調整してモデルの予測精度を向上させます。次のようなタスクがあります。

  • 回帰タスク:将来の売上や株価の予測

  • 分類タスク:画像認識やスパムメールの分類

この手法は効率的で精度が高い一方、クリーンな訓練データが必要で、新しいパターンや異常値への対応が難しい点が弱点です。

教師なし学習は、ラベルなしのデータからモデルが自動的にパターンや特徴を見つけ出す手法で、以下のようなタスクがあります。

  • クラスタリング:顧客データの特徴に基づいたグループ分け

  • 次元削減:データ可視化のために高次元データから重要な特徴の抽出

  • 異常検知:通常のパターンからの外れ値を識別し不正検出

以上から、教師あり学習と教師なし学習は、データに対するアプローチが大きく異なることがわかります。教師あり学習はモデルを調節(学習)するのにデータを使うのに対し、教師なし学習はパターンを発見(学習)するのにデータを使います。

よって、この二つのアプローチは相反するものではなく、教師なし学習の手法で得られたデータの特徴や構造を、教師あり学習で利用することもあります。

機械学習には「教師あり学習」「教師なし学習」に加え、以下の分類もあります。

自己教師あり学習(Self-supervised Learning)

「ラベルなしデータセット」からラベルを生成し、それを「ラベル付きデータ」として扱う手法です。特に言語モデリングの事前学習でよく使われます。また、画像の一部を隠して復元する訓練もこれに当たります。こちらにも解説があります。

半教師あり学習(Semi-supervised Learning)
少数の「ラベルありデータ」と多数の「ラベルなしデータ」を組み合わせて学習する手法で、ラベル付きデータの取得が難しい場合に特に有効です。例えば、言語モデルの事前学習とファインチューニングの組み合わせ。こちらでも触れています。

強化学習(Reinforcement Learning)
モデルが環境と相互作用しながら、報酬を最大化するための行動を学ぶ手法です。報酬は「ラベル」と似ていますが、モデルが選択する行動によって値が変わるため、試行錯誤を繰り返す必要があります。こちらにシリーズの記事があります。

クラスタリングの目的と利点

クラスタリングの目的は、ラベルなしのデータセットを特徴に基づいて「自然な」グループ(クラスタ)に分けることです。なお、この「自然な」については後ほど解説します。

クラスタリングの主な利点は、以下の通りです。

  • データの可視化や情報の圧縮
    複雑なデータセットの特徴を捉え可視化したり、主要な特徴だけを抽出する情報の圧縮を行います。これにより、データの全体像を把握しやすくなります。

  • パターン認識や異常検知
    クラスタに分類することで、データ分布のパターン認識を行います。また、通常のパターンから外れる異常値を検出する異常検知にも利用されます。

  • 意思決定の支援
    例えば、購買行動が似ている顧客グループを特定し、ターゲット層に応じたマーケティング戦略の立案に役立てます。

クラスタリングにより、単純な平均や統計では把握できないデータ構造やパターンを明らかにし、分析や意思決定への利用が可能になります。

k-meansの処理ステップ

k-meansの目的は、類似したデータをk個のクラスタへと自動的に分けることです。ただし、「k」の値はあらかじめ指定する必要があります。

k-meansの名前の意味は、「k個の平均値」です。つまり、k個のグループに分ける際に、それぞれのグループの平均値を中心として、近いデータポイントをグループに含めると言うことです。

クラスタ数を k = 3 とした例を使って解説します。以下のような2次元のデータポイントがあるとします。

ぱっと見でも、3つのクラスタになるのがわかりますが、これをアルゴリズムがどう処理するのかを見ていきます。

ステップ1:初期のセントロイドの選択

まず、3個のセントロイド(centroid、重心、クラスタ中心)の候補として適当な位置を選びます。赤、青、緑の小さいボールが3つのセントロイドです。

通常、k-meansアルゴリズムでは、セントロイドの初期位置が結果に大きな影響を与えます。たとえば、セントロイド同士が初期の段階で近すぎると、収束に時間がかかることがあります。そのため、初期セントロイドは、偏りが少ないように実際のデータポイントからランダムに選ばれます。

ただし、ここでは初期設定には深入りせず、最終的に3つのグループに収束する様子が見えやすくなるように初期位置を適当に決めています。

ステップ2:データポイントの割り当て

次のステップでは、各データポイントを最も近いセントロイドに割り当てます。これは、各ポイントとセントロイド間の距離を計算し、最も近いクラスタにデータを振り分けるプロセスです。

各データポイントがクラスタに割り当てられた

よって、各データポイントが属するクラスタが決まります。

ステップ3:セントロイドの再計算

クラスタのメンバーが決まったので、今度は、クラスタ内の平均を計算し、セントロイド(クラスタ中心の位置)を更新します。

青のセントロイドはデータポイントと重なって見えにくくなっています

よって、新たなクラスタ中心の位置が決まります。

ステップ4:収束条件の確認

ステップ2とステップ3の手順を繰り返します。ただし、クラスタ中心がこれ以上は変化しなくなると判断されたら(収束したら)クラスタリングを完了します。

では、このままクラスタリングの処理を続けてみましょう。

再びステップ2でデータポイントを割り当てなおします。

更新されたセントロイドにデータポイントを割り当て直す

そして、再びステップ3でセントロイドを更新します。

新しいデータポイントの構成によってセントロイドの位置を更新する

この後は、データポイントの割り当ては変わらないので、セントロイドの位置も変化しません。

以上のプロセスにより、データがセントロイドからの距離によって自然なグループに収束して分けられました。

なお、ここでは2次元のデータを扱いましたが、一般には多次元の特徴量ベクトルを扱います。

k-means++による初期化の改善

k-meansの初期値依存性

すでに言及しましたが、k-meansアルゴリズムは初期値依存性が高いという特徴があります。

これは、クラスタの初期セントロイド(中心点)の選び方によって、アルゴリズムが異なる結果に収束することを意味します。つまり、初期セントロイドが偏った位置にあると、k-meansは最適でない局所的な最小値に収束する可能性があり、正しいクラスタリングができないことがあります。

さらに、異なる初期値を設定するたびに異なるクラスタが生成される可能性があるため、クラスタリング結果の一貫性が保証されません。よって、クラスタリングが終わった後に結果を吟味する必要があります。

この初期値依存性を緩和するために、k-means++のような初期化方法が導入され、セントロイドの初期配置を工夫することで、より安定した結果が得られるようになっています。

k-means++による初期化ロジック

k-means++の目的は、初期セントロイドの配置を工夫して、従来のk-meansのような局所最適解に陥るリスクや、結果が不安定になる問題を軽減することです。そのため、k-means++は以下の手順でセントロイドを配置します。

1)一つ目のセントロイドをランダムに選ぶ
最初のセントロイドはランダムにデータポイントから選ばれます。

2)距離に基づく確率で次のセントロイドを選択
次のセントロイドは、各データポイント $${x_i}$$​ と、既存のセントロイドとの最小距離 $${D(x_i)}$$ を用い、次の確率で選びます。

$$
P(x_i) = \frac{D(x_i)^2}{\sum_j D(x_j)^2}
$$

  • $${D(x_i)}$$は、データポイント $${x_i}$$​ と既存の最も近いセントロイドとの距離。

  • $${\sum_j D(x_j)^2}$$ は、全データポイントに対する最小距離の二乗の合計。

この確率 $${P(x_i)}$$ により、既存のどのセントロイドからも遠いデータポイントが次のセントロイドに選ばれやすくなります。

3)このプロセスを繰り返す
これを繰り返し、必要な数のセントロイドが揃うまで、各セントロイドが広く分散するように設定されます。

こうして初期化されたセントロイドにより、クラスタリングが安定しやすく、収束も速くなります。また、クラスタ配置の偏りが軽減され、局所最適解に陥るリスクも低くなります。

なお、scikit-learnでも k-means++ は実装されており、デフォルトになっています。従来のランダム初期化を選ぶこともできますが、ほぼ必要はないでしょう。

k-meansの特徴と問題点

ノイズや外れ値の影響

k-meansでは、クラスタの中心をデータポイントの平均で計算するため、外れ値やノイズがあると、セントロイドがその影響を受け、クラスタの位置が偏ってしまうことがあります。

特に、外れ値が大きな距離に位置する場合、セントロイドが外れ値の方向に引き寄せられるため、他のデータポイントの適切なクラスタリングが難しくなることがあります。また、ノイズや外れ値が多数存在する場合、アルゴリズムの収束が遅くなったり、クラスタの質が低下することもあります。

これにより、クラスタが本来のデータ構造を反映しにくくなるため、ノイズや外れ値が多いデータセットでは、k-meansの使用には注意が必要です。

また、ノイズや外れ値がk-meansに悪影響を与えると考えられる場合、前処理で外れ値を除外すると良い結果が得られる可能性があります。ただし、外れ値が分析上重要である場合は、除外するかどうかを慎重に判断する必要があります。

クラスタの形状に関する制約

k-meansには適用できるデータやその分布に関して、いくつかの特徴があります。

距離の概念:k-meansでは、距離や平均を扱うので、数値データや何らかの距離が計算できるデータで有効です。ユークリッド距離などを用いてデータポイント間の類似性を測定します。特に、データが連続的に分布している場合に適しています。

均一なクラスタ:また、k-meansは、クラスタが球状で均一な分布を持つ場合に強みを発揮します。もちろん、3次元以上の多次元でも利用可能ですが、セントロイドから等距離内に分布するようなグループ分けになります。

k-meansの特徴による以下の問題点もあります。

複雑な境界を扱えない:各クラスタが似たサイズや形状であることが前提条件としてあるため、明確な境界を持つクラスタに適しています。もっと言うと、複雑な形状(例:長い楕円形や非対称な形)のクラスタを持つデータに対しては適切にグループ分けできないことがあります。

クラスタ数の影響度:複数のグループからのデータが同じエリアに存在するし、境界が曖昧な場合、k-meansはその境界を適切に捉えることが難しくなります。この場合、kの値を増やすとうまくいく可能性があります。

結論として、クラスタ数 k の選び方が非常に重要となります。

クラスタ数 k の選び方

エルボー法(Elbow Method)

エルボー法は、クラスタ数$${k}$$の適切な値を決定するための手法です。

具体的には、クラスタ数を変化させながら、各クラスタのWCSS(Within-Cluster Sum of Squares)を計算します。これは各クラスタ内の分散の総和です。

$$
\text{WCSS} = \sum_{i=1}^{k} \sum_{x \in C_i} | x - \mu_i |^2
$$

  • $${k}$$はクラスタの数です。

  • $${C_i}$$はクラスタ$${i}$$のデータポイントの集合です。

  • $${x}$$はクラスタ$${C_i}$$に属するデータポイントです。

  • $${\mu_i}$$はクラスタ$${i}$$のセントロイドです。

  • $${| x - \mu_i |^2}$$は、データポイント$${x}$$とそのクラスタのセントロイド$${\mu_i}$$との距離の二乗を表します。

WCSSは、クラスタ内の各データポイントとそのクラスタの中心との距離の二乗の合計であり、WCSSが小さいほどデータポイントがクラスタ中心に近いことを意味します。

この結果を横軸$${k}$$、縦軸WCSSとしてプロットし、ひじ(エルボー)のように見えるポイントを探します。

このエルボー点は、WCSSの減少が緩やかになる地点を示し、以降はクラスタ数を増やしても改善効果が小さいと考えられます。エルボー点またはその近辺のクラスタ数を採用することで、より最適な$${k}$$の選択が可能となります。

エルボー点が明確でない場合もあるため、その付近のクラスタ数も含めて考慮し、必要ならば他の評価指標やタスクに対する適合性と併せて確認するのが最善でしょう。

シルエット係数

シルエット係数(シルエットスコア、Silhouette Score)は、クラスタリングの質を測る指標です。

名前に「シルエット」とあるのは、データポイントがクラスタの中でどれだけうまく収まっているか、そして他のクラスタからどれだけ明確に分離されているかを示すことから来ています。つまり、「シルエット(影の輪郭)」が明確なほど、データポイントが自身のクラスタ内にしっかりと収まり、他のクラスタからも十分に離れていうイメージです。

この指標は、1987年に統計学者ピーター・ルセーウによって提案されました。

参考:https://en.wikipedia.org/wiki/Silhouette_(clustering)

シルエット係数では、次の2つの概念を用います。

  • 凝集度(Cohesion)クラスタ内部でのまとまりの強さを表す。同じクラスタ内のデータポイント同士の距離が近さを示します。

  • 分離度(Separation):クラスタ間の分離の度合いを表す。異なるクラスタのデータポイントとの距離が遠さを示します。

シルエット係数$${s(x_i)}$$ は以下の式で計算されます:

$$
s(x_i) = \frac{b(x_i) - a(x_i)}{\max(a(x_i), b(x_i))}
$$

  • $${a(x_i)}$$は、データポイント $${x_i}$$ と同じクラスタ内の他のデータポイントとの平均距離です。凝集度を意味します。

  • $${b(x_i)}$$は、データポイント $${x_i}$$ と他のクラスタ内のデータポイントとの平均距離で最小なものです。分離度を意味します。

シルエット係数の範囲は$${-1}$$から$${+1}$$です。

凝集度が小さくて分離度が大きいほど良好と判断されるので、$${a(x_i) \ll b(x_i)}$$であるほどシルエット係数が$${+1}$$に近づきます。逆に、$${-1}$$に近い場合は、このデータポイントは、むしろ他のクラスタに属するべきだと考えられます。$${0}$$に近い場合はクラスタ間の境界付近に位置すると考えられます。

シルエット係数を活用することで、クラスタ数$${k}$$の適切さを確認し、クラスタリングの質を判断するのに役立ちます。よって、WCSSの代わりにシルエット係数をエルボー法で利用するとより良いクラスタ数を選択できることもあります。

シルエット係数は、WCSSと反対で大きい方が良いのでエルボーが上向きになっているところあたりが良いクラスタ数になります。

次回予告

次回は、scikit-learnのk-meansを使って実験を行います。k-meansなどの教師なし学習モデルは、具体的に使ってみるのが一番わかりやすいです。

お楽しみに!

いいなと思ったら応援しよう!