クラスター分析

Group Lassoの正則化

前回、【正則化のLasso回帰とRidge回帰】について説明しました。 今回の記事はLasso進化形のGroup Lassoの正則化について解説します。   Group Lassoとは Group Lassoは、説明変数の属性に基づいていくつかのグループに分けられるとき、変数選択においてグループ単位で選択したいときに利用する方法です。 Lassoというのは、正則化項にL1normを使ったいわゆるL1正則化のことで、大部分の重みが0に潰れて疎な解が得られます。   この進化形として、Group Lassoという手法があります。Group Lassoでは、重みベクトルの次元をグループ分けして、各グループごとのL2normを正則化項として使います。 使うメリットは以下になります。 カテゴリー変数の効果をモデルに反映 例えば、都道府県を説明変数に入れる場合があります。この場合は、各都道府県をフラグ化して、変数にします。しかしこの方法では「都道府県じたい」が効果のある変数かどうかを判定したい場合にはわかりません。そのためカテゴリー変数じたいの効果の有無を調べる場合にGroup Lassoを使うとわかります。   大規模な線形分類、回帰のライブラのsklearn-contrib-lightningをインストールします。 pip install scikit-learnpip install sklearn-contrib-lightning   ライブラリのインポート from sklearn.datasets import fetch_20newsgroups_vectorizedfrom lightning.classification import CDClassifier   20 newsgroupsはこのブログでも過去何回か取り上げまたしが、ベクトル化済みのデータです。 (130,107のカラム) bunch = fetch_20newsgroups_vectorized(subset=”all”)X = bunch.datay = bunch.targetprint(X.shape)print(y.shape) (18846, 130107)(18846,)   分類の設定と学習 clf = CDClassifier(penalty=”l1/l2″,                   loss=”squared_hinge”,                   multiclass=True,                   max_iter=20,                   alpha=1e-4,                   …

Group Lassoの正則化 Read More »

X-means法でクラスタ数を推定する方法

  前回、【クラスタ数の決め方の1つシルエット分析】について説明しました。 今回の記事はもう一つのクラスタ数を自動推定するX-meansについて紹介します。 x-meansとは x-meansは、k-meansのクラスター数kを自動推定しつつクラスタリングしてくれる手法です。k-meansの逐次繰り返しとBIC(Bayesian information criterion)による分割停止基準を用いて最適なクラスター数を決定します。 BICは重心の近くにガウス分布している仮定してBICを計算します。   詳細はx-meansの論文になります。 今回は「pyclustering」のライブラリを使用して、x-meansのクラスタ数推定を行います。 先ず、ライブラリの読み込み %matplotlib inline import pyclustering from pyclustering.cluster import xmeans import numpy as np import matplotlib import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import make_blobs   サンプルの作成 X, y = make_blobs(n_samples=5000,                   n_features=2,                   centers=4,                   cluster_std=1,                   center_box=(-10.0, 10.0),                   shuffle=True, …

X-means法でクラスタ数を推定する方法 Read More »

ランダムフォレストのアンサンブル【Random Forest Ensemble】

前回の記事 「ランダムフォレスト(分類分析)」はランダムフォレストの特徴とランダムフォレストの例について話しました。ランダムフォレストは分類や回帰に使える機械学習の手法です。今回は別のランダムフォレストアンサンブルのクラスター分析の一つを説明します。 先ずアンサンブルはなんのことでしょう? アンサンブル手法 (Ensemble methods) 同じ学習アルゴリズムの多数のEstimatorからの予測結果を組み合わせた技術。この方法は、一つのEstimatorと比較して一般化可能性/ロバスト性を向上させます。 ランダムフォレストアンサンブル (Random Forest Ensemble) 教師なしデータセットの高次元スパース表現への変換の手法。データポイントは、各ツリーのどのリーフに分類されるかによってコード化されます。 葉のワンホットエンコーディングを使用して、これは森の中に木があるのと同じくらい多くのものとのバイナリコーディングをもたらします。 次元削減法を適用した高次元表現を学びます。 ただし、データセットをクラスが線形分離可能な表現にキャストすると便利なことがよくあります。

スペクトラルクラスタリングのパラメータ解説

  以前の記事はスペクトラルクラスタリングについて説明しました。スペクトラルクラスタリングとは、クラスタリングの機械学習の方法のうち、教師なし学習に分類されます。スペクトラルクラスタリングの詳細はこちらです。   今回の記事はスペクトラルクラスタリングのパラメータ設定を説明します。 Scikit-learnのライブラリのパラメータを説明していきます。   class sklearn.cluster.SpectralClustering(n_clusters=8, eigen_solver=None, random_state=None, n_init=10, gamma=1.0, affinity=’rbf’, n_neighbors=10, eigen_tol=0.0, assign_labels=’kmeans’, degree=3, coef0=1, kernel_params=None, n_jobs=None)   先ず、スペクトラルクラスタリングの例を作成します。   from sklearn import datasets   # データ作成 X,z = datasets.make_blobs(n_samples=5000,                           n_features=2,                           centers=15,                           cluster_std=1.2,                           center_box=(-10.0, 10.0),                           shuffle=True,                           random_state=111                           )   # データの整形 sc=preprocessing.StandardScaler() sc.fit(X) X_norm=sc.transform(X)   …

スペクトラルクラスタリングのパラメータ解説 Read More »

クラスター数の決め方の1つシルエット分析

シルエット分析(Silhouette analysis)とは シルエットは、クラスターの解釈と一貫性な評価の手法です。各クラスターにどれくらいうまくグループしているかを簡潔にグラフィカルに表現します。 シルエット分析は、クラスタリングの結果を評価する事ができます。 シルエットプロットは、1つのクラスター内の各点が隣接するクラスター内のどの点にどれくらい近いかを示すもので、クラスター数などのパラメーターを視覚的に評価する方法です。 この評価の範囲は[-1、1]です。 +1に近いシルエット係数は、標本が隣接するクラスターから遠く離れていることを示します。クラスタリングの分離性能が良いと判断できます。0の値は、隣接する2つのクラスター間の決定境界にあるか、またはそれに非常に近いことを示しており、分離性能が悪い事を示しています。マイナス値だとクラスター化されたサンプルは間違ったクラスターに所属している可能性があります。できる限り1に近い事が目標になります。 実験: 今回の分析は、クラスター数の決め方法を説明します。 シルエットプロットは、3,5,6のクラスター数が、平均シルエットスコア以下になります。シルエット分析は、2と4のクラスター数は高いシルエットスコアになっています。シルエットスコアを使う時に、注意しないといけない事として分離の具合を評価している指標のため、クラスター数が少ないときは高くスコアが出ます。そのため、シルエットプロットも確認し、各クラスターの厚さが似ている事とシルエットスコアの先端部分が超えている事を確認し、クラスター4とします。 Out: For n_clusters = 2 The average silhouette_score is : 0.7049787496083262 For n_clusters = 3 The average silhouette_score is : 0.5882004012129721 For n_clusters = 4 The average silhouette_score is : 0.6505186632729437 For n_clusters = 5 The average silhouette_score is : 0.56376469026194 For n_clusters = 6 …

クラスター数の決め方の1つシルエット分析 Read More »

k-means++

前回の記事にはGMMモデルとMini Batch K-MeansとSpectral Clusteringについて説明します。この記事では、k-means++について説明していきます。 k-means++とは k-means++法は、非階層型クラスタリング手法の1つで、k-means法の初期値の選択に改良を行なった方法です。 先ず、k-meansの初期値の流れは以下のようになります。 1. クラスタ数kを決める2. データが含まれる空間にランダムにk個の点(セントロイド)を置く3. 各データがセントロイドのうちどれに最も近いかを計算して、そのデータが所属するクラスタとする4. セントロイドの位置をそのクラスタに含まれるデータの重心になるように移動する(各セントロイドの重心が変わらなくなるまで3, 4を繰り返す)   k-meansのクラスタには、初期値が不適切であるときにうまく分類ができなかったりする問題も抱えています。下記のクラスタリングの結果は初期値(セントロイド)の問題について解決を図るためにk-means法の改良として考案されたのが,k-means++法です。 初期のクラスター中心をなるべく遠目におくという発想があります。まず始めにデータ点をランダムに選び1つ目のクラスタ中心とし、全てのデータ点とその最近傍のクラスタ中心の距離を求め、その距離の二乗に比例した確率でクラスタ中心として選ばれていないデータ点をクラスタ中心としてランダムに選んでいきます 普通のk-meansでやると以下のような感じで見るからに無様な結果になっています.これは初期セントロイドを乱数で割り当ててるために,近い位置にセントロイドが置かれた場合にこういう感じになってしまいます.   Python Scriptの説明 # ライブラリの読み込みfrom sklearn.cluster import KMeansimport numpy as npimport matplotlib.pyplot as plt#データロードdata = np.loadtxt(‘./data.txt’, delimiter=’ ‘)#k-means++モデル作成kmeans = KMeans(n_clusters=9, init=’random’, random_state=0)y_kmeans = kmeans.fit_predict(data)# グラフの作成plt.scatter(data[:, 0], data[:, 1], c=y_kmeans, s=20, cmap=’viridis’)centers = kmeans.cluster_centers_plt.scatter(centers[:, 0], centers[:, 1], c=’black’, s=100, …

k-means++ Read More »

スペクトラルクラスタリング

クラスタリング分析の話になっております。前回の記事にはGMMモデルとMini Batch K-Meansについて話しました。この記事では、スペクトラルクラスタリング(Spectral Clustering)について話していきます。 スペクトラルクラスタリングとは スペクトラルクラスタリングとは、クラスタリングの機械学習の方法のうち、教師なし学習に分類されます。スペクトルクラスタリングでは、データをグラフに置き換え、繋がりがある近いデータ程一緒にわけられやすくなっています。 KMeansやGaussian mixture modelはクラスタの中心点からの距離に基づいてクラスタリングのモデルですが、スペクトラルクラスタリングでは連結性に注目してクラスタリングのモデルのため、KMeansやGaussian mixtureではうまくクラスタリングできなかったようなデータをうまくクラスタリングできることがあります。 下記の円形と月形のグラフのクラスタリング結果を見ると、スペクトラルクラスタリングがよく対応出来ています。但し、学習時間は20倍以上になっています。 Python Scriptの説明 # ライブラリの読み込み print(__doc__) import time import warnings import numpy as np import matplotlib.pyplot as plt from sklearn import cluster, datasets, mixture from sklearn.preprocessing import StandardScaler from itertools import cycle, islice np.random.seed(0) # データセット作成 n_samples = 1500 noisy_circles = datasets.make_circles(n_samples=n_samples, factor=.5,                                       noise=.05) …

スペクトラルクラスタリング Read More »

Mini Batch K-Means

クラスタリング分析の話になっております。前回の記事にはGMMモデルについて話しました。GMMモデルのクラスタリングは計算時間がそれなりにかかりますので、大量のデータのプロジェクトには合わない事があります。その際にはMini Batch K-Means (ミニバッチ k平均)モデルを用いる事も1つの選択肢になります。   ミニバッチとは部分的にサンプリングされた入力データの一部です。これらのミニバッチでクラスタリングを行い、計算時間を大幅に短縮します。K-meansの結果と比べると若干悪い結果をもたらす事があります。 正確な情報は以下をご覧ください http://scikit-learn.org/stable/modules/generated/sklearn.cluster.MiniBatchKMeans.html#sklearn.cluster.MiniBatchKMeans モデルの比較 Pythonを使用してKMeansとGMMとMiniBatchKMeansを実装し、比較していきます。例えば大量の300,000件のサンプルのデータから各モデルの効率を比較します。下記の図は各モデルのクラスターの結果で、K-Means Mini BatchはK-Meansの半分実行時間になっております。(K-Means 2.95 Sec vs K-Means Mini Batch 1.47sec). GMMと比べるK-Means Mini Batchが三分の一の学習時間になります。学習期間が減らしましたが、クラスターの結果はほとんど変わりません。 MiniBatchKMeansは、大量なデータを学習の場合は K-Means Mini Batchは時間を節約するのに役立ちます。 Python Scriptの説明 <code> # ライブラリの読み込みprint(__doc__) import timeimport numpy as npimport matplotlib.pyplot as plt from sklearn.mixture import GMMfrom sklearn.cluster import MiniBatchKMeans, KMeansfrom sklearn.metrics.pairwise import pairwise_distances_argminfrom sklearn.datasets.samples_generator import make_blobs # 300,000件のサンプルを作成するnp.random.seed(0)batch_size …

Mini Batch K-Means Read More »

クラスター分析2 GMMモデル

前回の記事には クラスター分析 の手法について話しました。今回の記事は、KNNでは分離が上手くいかない時に使用するクラスタリング手法として混合ガウス モデル (GMM)を紹介します。ただし計算時間はそれなりにかかります。 GMMはGaussian mixture modelsの略称です。GMM は”ソフト クラスタリング” 方式と見なすことができます。ソフトクラスタリング方式では、1つの点に対して複数のクラスに所属する確率を出す事ができます。 sklearn.mixture のパッケージでGMM の学習を行う例を以下に示します。混合正規分布の密度を計算し,可視化するスクリプトを作成しています. GMM による分類結果は図中の等高線で表現されます。 これは学習された混合正規分布の高さになります。例えば実際のデータでは、顧客分布で初見さんがやや多く、常連さんの山があるような場合に相当します。当然初見さんが多く、常連さんの山があるという見方ができます。曲線の色はそれぞれの等高線ごとに分けています.以下では二つの分布になることがわかります。 Python Codeの説明 #ライブラリの読み込み import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LogNorm from sklearn import mixture #ランダムサンプル、2つの要素を作成する n_samples = 300 np.random.seed(0) # 地形データを作成 (20, 20) shifted_gaussian = np.random.randn(n_samples, 2) + np.array([20, 20]) # Gaussianデータを作成する C = np.array([[0., …

クラスター分析2 GMMモデル Read More »