DBSCANクラスタリングの解説と実験

前回の記事は密度ベースクラスタリングのOPTICSクラスタリングを解説しました。 今回の記事はもう一つの密度ベースクラスタリングのDBSCANクラスタリングを解説と実験します。 目次: 1.DBSCANとは 2.Sci-kit LearnのDBSCAN 3.コード・実験 (K-Mean++ vs DBSCAN) 4.まとめ DBSCANとは DBSCAN (Density-based spatial clustering of applications with noise ) は、1996 年に Martin Ester, Hans-Peter Kriegel, Jörg Sander および Xiaowei Xu によって提案された密度準拠クラスタリングのアルゴリズムです。半径以内に点がいくつあるかでその領域をクラスタとして判断します。近傍の密度がある閾値を超えている限り,クラスタを成長させ続けます。半径以内に近く点がない点はノイズになります。 長所 1)k-meansと違って,最初にクラスタ数を決めなくてもクラスターを作成できます。 2)とがったクラスターでも分類できます。クラスターが球状であることを前提としない。 3)近傍の密度でクラスターを判断します。 短所 1)border点の概念が微妙で,データによりどのクラスタに属するか変わる可能性があります。 2)データがわからないとパラメータを決めるのが難しいです。 DBSCANの計算プロセスの例1 DBSCANのアルゴリズムは半径以内に確認します。半径以内に3個以上の点があれば、グループを成長させ続けます。左の2列は2点しかないなので、グループに属しません。また、一番下の行は半径以外なので、グループに属しません。 DBSCANの計算プロセスの例2 以上の例と同じ、DBSCANは半径以内に確認して、グループに属するかどうか判断します。最初は上からと下からでグループを確認します。上の確認は半径以外になると、途中に止まりました。このようにDBSCANのアルゴリズムはすべての点はグループを確認します。   DBSCANの論文: A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases …

DBSCANクラスタリングの解説と実験 Read More »

Statsmodelsでの回帰分析

前回の記事は線形回帰を解説しました。 回帰分析の説明はこの記事を参考してください。 線形回帰 回帰分析を行うとき、 Scikit-learn と Statsmodelsのライブラリをよく使います。前回はScikit-learnで回帰分析を行いました。今回はScikit-learnとStatsmodelsのライブラリを比較して、回帰分析を解説・実験します。 目次: 1. ライブラリ 1.1 Scikit-learnの回帰分析 1.2 Statsmodelsの回帰分析 2. コード・実験 2.1 データ準備 2.2 Sklearnの回帰分析 2.3 Statsmodelsの回帰分析 2.4 結果の説明 3. Partial Regression Plots 4.まとめ 1.ライブラリ 1.1 Scikit-learnの回帰分析 sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None) パラメータ設定: fit_intercept : boolean, optional, default True: False に設定すると切片を求める計算を含めません。 normalize : boolean, optional, default False: True に設定すると、説明変数を事前に正規化します。 copy_X : …

Statsmodelsでの回帰分析 Read More »

高度な活性化関数PReLU

今回は高度な活性化関数のPReLUについて解説と実験します。 目次: 1.PReLUとは 2.KerasのPReLU 3.コード・実験 (ReLU vs PReLU) 4.まとめ PReLUとは PReLU は、Parametric Rectified Linear Unitの略称で、ReLUと似ていますが、負のアウトプットがあります。インプットが閾値よりも少ない度合に応じて、負の値を出力するようになっています。特に深い階層において過学習を防ぐ効果があると言われています。プラスとマイナスのどちらにも勾配があるため、学習効率が良いと言われているようです。 f(x) = alphas * x for x < 0 alphasはxと同じ行列を持つ学習対象の配列です。 PreLUの論文:Microsoft Research Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification https://arxiv.org/abs/1502.01852   2.Kerasの高度な活性化関数のPReLU keras.layers.PReLU(alpha_initializer=’zeros’, alpha_regularizer=None, alpha_constraint=None, shared_axes=None) alpha_initializer:重みを初期化する関数。 alpha_regularizer:重みを正則化する関数。 alpha_constraint:重みに対する制約。 shared_axes:活性化関数で共有する学習パラメータの軸。 出力のshapeは入力のshapeと同じです。   3.コード・実験 (ReLU vs PReLU) 概要:データセット:MNIST 60,000の学習データと10,000のテストデータ(28 x …

高度な活性化関数PReLU Read More »

PySparkでのデータ結合

PySparkのデータ処理一覧 データを分析する上で、通常は複数のDataFrameを組み合わせすることが必要です。今回は【PySparkでのデータ結合】を説明します。 Union 同じ列を持つDataFrame同士を結合する方法です。 PySparkのデータ結合 unionallでspf1とspf2を結合し、sdf3を作成します。 # PySpark sdf1 = spark.createDataFrame([(‘a1’, 10),(‘a2’, 20),(‘a3’, 30)],[“c1”, “c2”]) sdf2 = spark.createDataFrame([(‘a1’, 100),(‘a2’, 200)],[“c1”, “c2”]) sdf3 = sdf1.unionAll(sdf2) pandasのappend 2つのDataFrame pdf1、pdf2をUnionで結合し、pdf3を作成します。ignore_indexにはTrueを指定して、新たにindexを振り直します。 # Python Pandas import pandas as pd pdf1 = pd.DataFrame([[‘a1’, 10],[‘a2’, 20],[‘a3’, 30]], columns=[“c1”, “c2”]) pdf2 = pd.DataFrame([[‘a1’, 100],[‘a2’, 200]], columns=[“c1”, “c2”]) pdf3 = pdf1.append(pdf2, ignore_index=True) pandasのconcat 2つのDataFrame …

PySparkでのデータ結合 Read More »

クラスタリングのアルゴリズム評価するFMI( Fowlkes-Mallows Index)

前回の記事はアルゴリズム評価を解説しました。 今回はクラスタリングのアルゴリズム評価するFMIを解説します。 FMI (Fowlkes-Mallows index)とは The Fowlkes-Mallows 指標 または、Fowlkes-Mallows スコアはクラスタリングのアルゴリズム評価する方法です。2つのクラスタリングアルゴリズムの結果間の類似性を判断するために使用されるこの方法。さらに、クラスタリングアルゴリズムの結果と実際のラベルも使われます。FMIの形式は下記になります。 TPは真陽性の数です。つまり、真のラベルと予測ラベルの両方で同じクラスターに属するポイントの数です。 FPはFalse Positiveの数です。予測ラベルではなく、真のラベルの同じクラスターに属するポイントの数です。 FNはFalse Negativeの数です。真のラベルではなく、予測ラベルの同じクラスター内です。 スコアの範囲は0〜1です。高い値は、2つのクラスター間の類似性が高いと示します。 今回は、ラベルがあるクラスタリング方法の評価をしていきます。 FMIのサンプル データセット:digitデータ 8×8の画像が1797枚(0〜9のラベル) クラスターアルゴリズム: K-Means, MeanShift モデル評価:FMI (Fowlkes-Mallows index) ライブラリの読み込む import numpy as np import pandas as pd import os import seaborn as sns import matplotlib.pyplot as plt from tqdm import tqdm_notebook from sklearn import datasets from sklearn.cluster import KMeans …

クラスタリングのアルゴリズム評価するFMI( Fowlkes-Mallows Index) Read More »

密度ベースのOPTICSクラスター

  前回の記事はk-means++, x-meansなどのクラスター分析を解説しました。 今回は密度ベースのOPTICSクラスターを解説します。 OPTICSクラスターとは OPTICS (Ordering Points To Identify the Clustering Structure)は密度ベースのクラスター分析(Density-based Clustering)の手法の一つです。ポイントが集中しているエリアおよび空または疎なエリアによって分離されているエリアを検出します。このアルゴリズムは、空間位置および指定された近傍数までの距離のみに基づいてパターンを自動的に検出します。DBSCANと似ているアルゴリズムになります。そのためクラスター数を決める必要がないアルゴリスムになります。 DBSCAN と OPTICSの検索距離 DBSCAN では、3つの点が存在しています。クラスターの中心、クラスターから到達できるもの、そしてノイズになります。特定のポイントからの検索距離の範囲内でクラスター内にない場合は、そのポイントにはノイズとして他のクラスターだとマークが付けられます。そのためクラスタリングといいつつ外れているものも検出することになります。 OPTICS の場合、検索距離は中心距離と比較される最大距離として扱われます。マルチスケール OPTICS は、最大到達可能性距離の概念を使用します。この距離は、あるポイントから、検索によってまだ訪問されていない最も近いポイントまでの距離です。 sklearn.cluster.cluster_optics_dbscanでOPTICSクラスターを作成します。scikit-learn 0.21.3が必要です。 pip install -U scikit-learn ライブラリのロード %matplotlib inline from sklearn.cluster import OPTICS, cluster_optics_dbscan import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt import numpy as np サンプルを作成 np.random.seed(0) n_points_per_cluster = 250 C1 …

密度ベースのOPTICSクラスター Read More »

keras プーリングレイヤー (Pooling layer)

前回の記事は深層学習について解説しました。 今回はディープラーニングのプーリングレイヤー (Pooling layer)を解説します。 Kerasでは様々なレイヤーが事前定義されており、それらをレゴブロックのように組み合わせてモデルを作成していきます。事前定義されてレイヤーを組み合わせてCNN、LSTM、などのニューラルネットワークを作成します。今回はPoolingレイヤーを説明します。 プーリングレイヤーとは プーリング層は通常畳込み層(Convolution Layer)の直後に設置されます。 プーリング層は畳み込み層で抽出された特徴の位置感度を若干低下させることで対象とする特徴量の画像内での位置が若干変化した場合でもプーリング層の出力が普遍になるようにします。 画像の空間サイズの大きさを小さくすることで調整するパラメーターの数を減らし、過学習を防止するようです。 最大プーリング(max pooling)と平均プーリング(average pooling)など様々な種類があるようだが、画像認識への応用では最大プーリングが実用性の面から定番となります。 では、kerasのコートを実験しましょう。 !wget –no-check-certificate \ https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \ -O /tmp/cats_and_dogs_filtered.zip –2019-07-20 07:15:53–  https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip Resolving storage.googleapis.com (storage.googleapis.com)… 172.217.214.128, 2607:f8b0:4001:c05::80 Connecting to storage.googleapis.com (storage.googleapis.com)|172.217.214.128|:443… connected. HTTP request sent, awaiting response… 200 OK Length: 68606236 (65M) [application/zip] Saving to: ‘/tmp/cats_and_dogs_filtered.zip’ /tmp/cats_and_dogs_ 100%[===================>]  65.43M   250MB/s    in 0.3s 2019-07-20 …

keras プーリングレイヤー (Pooling layer) Read More »

Pythonの正規表現【まとめと例】

今回の記事は正規表現と例についてをまとめします。 正規表現とは 文字列の集合を一つの文字列で表現する方法です。英語では、“regular expressions”(REs や regexes または regex patterns)と呼ばれています。文字列からe-mailや電話番号の検索、抽出、置換ができます。   正規表現で使用する特殊文字 正規表現は、いくつかの特別な文字“メタ文字”によって表現されます。例えば、「$」には、文字列の末尾という意味合いがあります。   メタ文字 メタ文字 説明 指定例 合致する 合致しない . 改行以外の任意の一文字 a.c abc ac abbc ^ 文字列の先頭 ^ab abc zab $ 文字列の末尾 ab$ zab abc * 直前の文字の0回以上の繰り返し ab* a ab abb aa ac + 直前の文字の1回以上の繰り返し ab+ ab abb a ? 直前の文字の0回または1回 ab? a ab abb …

Pythonの正規表現【まとめと例】 Read More »

ダミー変数に変換 【One-Hotエンコーディング】

今回の記事はカテゴリ変数をダミー変数に変換を解説します。 ダミー変数とは、 カテゴリ変数を数字に変換する手法のことです。具体的には、数字ではないデータを「0」と「1」だけの数列に変換します。機械学習は数字などの量的データによって行うものですが、それ以外の事柄でも数字に変換し、分析に取り入れることができます。多クラスの特徴量をone-hot表現に変換したりすることです。 ダミー変数の作り方 二者択一のダミー変数を作成する場合は、どちらか一方を「0」、もう片方を「1」と変換してデータを作ります。 例えば 「はい→1、いいえ→0」、 「男→1、女→0」、 「あり→1、なし→0」   複数から選択するダミー変数を作成する場合は、含まれる要素の数に応じたダミー変数を作ることでデータに転換可能です。例えば、 国「日本、 中国、アメリカ」 日本ダミー : 日本を1、その他を0とした数列 中国ダミー : 中国を1、その他を0とした数列 アメリカダミー : アメリカを1、その他を0とした数列   だは、pandasのget_dummiesでダミー変数を変更しましょう。 pandas.get_dummies(data, prefix=None, prefix_sep=’_’, dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)   data – ダミー変数を作成したいデータ prefix – DataFrameのカラムラベルに付け加える文字列 prefix_sep – prefixで指定された文字列を付け加える際に橋渡しとなる文字列 dummy_na – 欠損値もダミー変数の処理 columns – ダミー変数に変換したい列データ sparse – SparseDataFrameとして返り値 drop_first – カテゴリー数がk個あった時、k-1個のダミー変数を作成するかどうか dtype – 新たなカラムのデータ型   # サンプルデータ作成 …

ダミー変数に変換 【One-Hotエンコーディング】 Read More »

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 »