統計解析

【ROC曲線とAUC】機械学習の評価指標

機械学習のモデル作成後にテストデータを使って「本当に良いモデルなのか?」という評価を必ず行う必要があります。今回の記事は分類問題に対して評価指標のROC曲線とAUCについて説明します。他にも評価指標は色々とあるので、随時記事にしていく予定です。 AUCとは AUCとは、二値分類器の評価指標として Area Under the ROC Curve の略です。サンプルに対して 0から1の範囲でスコア(確率)を与える二値分類器 の精度を評価することを考えています。予測スコアでサンプルを(降順)ソートしたときに、真値のTrue となるサンプルが 真値のFalse となるサンプルより上位にきているか』ということを測っています。つまり、ラベル 1 のサンプルに正しく高スコアを与える予測器であるか を見ています。   縦軸がモデルの予測で、横軸が正解データになります。 各象限の説明を簡単にすると、   True Positive(TP): 正解データ正であるものを、正しく正と予測できた数 False Positive(FP):正解データ負であるものを、間違って正と予測した数 Flase Negative(FN):正解データ正であるものを、間違って負と予測した数 True Negative(TN):正解データ負であるものを、正しく負と予測できた数   ROC曲線をプロット 先程の偽陽性率と真陽性率の表をプロットすると以下のようなグラフが出来上がります。このように、閾値を変化させたときの偽陽性率と真陽性率による各点を結んだものがROC曲線です。     閾値を移動させながらPositive / Negativeを判別していくことを考えます。そうすると閾値が0のときは全てNegativeに判断するので偽陽性は0になります。ここから閾値を増加させていくと偽陽性と真陽性が増加していきます。そして閾値が1となったとき全てPositiveと判断するので偽陽性は1になります。モデルの識別能力が高ければ左上に凸のグラフになりますが、識別能力が低ければグラフは対角線上に近づきます。   Sklearnのpython     # ライブラリーのインポート import numpy as np import matplotlib.pyplot as plt from sklearn import svm, …

【ROC曲線とAUC】機械学習の評価指標 Read More »

ロジスティック回帰

前回の記事は線形回帰を説明しました。この記事では、回帰分析群のロジスティック回帰お話になります。 ロジスティック回帰とは ロジスティック回帰とは、2群で分けられた目的変数に対する,1つ以上の説明変数の影響を調べ、機械学習分類アルゴリズムです。ロジスティック回帰は、2群分類の最も簡単で一般的に使用される機械学習アルゴリズムの1つです。 実装が容易で、バイナリ分類の問題のベースラインとして使用できます。 ロジスティック回帰は、さまざまな分類問題に使用できます。 例えば、糖尿病の予測、チャーン分析、キャンペーンの応答など。 では、ロジスティック回帰のモデルを作成しましょう。 まず、データセットを作成します。   #ライブラリー import matplotlib.pyplot as plt import pandas as pd from scipy import stats import seaborn as sns #サンプルデータ作成 distA = stats.norm(30, 5) distB = stats.norm(15, 4) data = [] for i in range(100):     data.append((distA.rvs(), “A”))     data.append((distB.rvs(), “B”)) df = pd.DataFrame(data, columns=[“measurement”, “class”]) #データを表示する print(df.head()) …

ロジスティック回帰 Read More »

データ分析における過学習Overfittingの対策

前回の記事は回帰分析を説明しました。この記事では、回帰分析のお話になります。モデルを調整すると、精度よくなりますが、学習過ぎると過学習(Overfitting)になます。今回は過学習 / 未学習(Underfitting)を説明します。 過学習と 過学習とはoverfittingと呼ばれ、統計学や機械学習において、訓練データに対して学習されているが、未知データ(テストデータ)に対しては適合できていない、汎化できていない状態を指します。データが少ない時または、モデルが問題に対して複雑な時が原因だと考えられる事もあります。 未学習とは 未学習とはunderfittingと呼ばれ、訓練データから有用な特徴量を引き出して記憶することができず、やはり未知のデータへの予測性能は低くなってしまいます。   左の図は未学習です。線形モデルはトレーニングサンプルに適合するのに十分ではありません。 真ん中の図は、次数4の多項式は真の関数をほぼ完全に近似します。右の図は過学習で、モデルはトレーニングデータのノイズを学習してしまいました。 クロスバリデーションを使用して、オーバーフィッティング/アンダーフィッティングを確認することが出来ます。テストデータの平均二乗誤差(MSE)が低ければ、モデルの汎化性能(評価データへの適用能力)を正しく評価します。 Pythonのスクリプトの説明 # ライブラリーのインポート print(__doc__) import numpy as np import matplotlib.pyplot as plt from sklearn.pipeline import Pipeline from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression from sklearn.model_selection import cross_val_score # サンプルデータ作成 def true_fun(X):     return np.cos(1.5 * np.pi * X) np.random.seed(0) n_samples = 30 degrees = …

データ分析における過学習Overfittingの対策 Read More »

線形回帰

前回の記事は複数のクラスタリングのシリーズを説明しました。この記事では、回帰分析のお話になります。 では、線形回帰から始めましょう。線形回帰は、最も基本的なモデルです。しかし拡張してより複雑なデータ動作をモデル化することができます。 線形回帰とは 線形回帰とは、一般的に使用される予測分析方法です。目的変数 と 1 以上の説明変数の間の線形関係を使用して、目的変数を予測する分析です。例えば、過去の価格と売上増加の関係を分析して将来の価格戦略を決定できます。 では、Pythonで線形回帰実験しましょう。 標準的なインポートから始めます。 import matplotlib.pyplot as pltimport seaborn as sns; sns.set()import numpy as np   次は50件のサンプルデータを作成して、散布図を描きます。 rng = np.random.RandomState(1)x = 10 * rng.rand(50)y = 2 * x – 5 + rng.randn(50)plt.scatter(x, y); Scikit-Learn’s のLinearRegressionを利用し、線形回帰を作成します。 from sklearn.linear_model import LinearRegressionmodel = LinearRegression(fit_intercept=True)model.fit(x[:, np.newaxis], y)xfit = np.linspace(0, 10, 1000)yfit = model.predict(xfit[:, np.newaxis])plt.scatter(x, y)plt.plot(xfit, …

線形回帰 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 »

クラスター分析

クラスター分析とは データのグループ化を含む機械学習技術になる。クラスターとは「集団」「群れ」を意味する英語で、その名の通り、データ全体をいくつかの集団(グループ)に分類する分析手法である。分類にあたっては、サンプル同士がお互いに「似ているか」または「似ていないか」を基準に分ける事ができる。この類似度・非類似度をもとにしたグループ分けの考え方の違いによって、多数のバリエーションが存在する。以下はクラスター分析の代表的な手法の「階層的手法」と「非階層的手法」について説明する。クラスター分析は多様な産業に使われる手法で、例えば下記のような使い方がある。 One to Oneマーケティングクラスター毎に求められる情報やアクションを予測し、ポジショニング確認を目的としたブランドの分類や、クラスターに応じておすすめ情報や配信キャンペーンに変化を付けるなど、最適なアプローチ戦略に役立することに用いられる。 小売小売でも商圏分析・価格弾力性分析・顧客分析・売り上げ予測といった様々な分析方法がある。その中でも顧客分析で、顧客を分類する事によってキャンペーン施策に繋げて、売り上げ増加を行う分析方法のときにクラスター分析が活躍する。例えば顧客の来店分析を以下のようにする事でクラスター分析を用いる。以下のグラフは、ある店の会員カードの使用回数である。   来店キャンペーン等で、初回は割引クーポン配布しており、利用で増えるがその後中々利用してもらえないのがネックであった。平均利用回数は、約4.2回のため5回利用の壁を突破するために5回利用した人に何か更にクーポンを渡そうか考えた。しかしよく上のグラフを見て欲しい。初回のキャンペーンで作ってそのままの人が多く、またヘビーユーザー層もおり、微妙に中間で使う人達がいるといった状態になっている。こういった層を上手くクラスタリングしてくれるのがクラスター分析である。例えば以下になる。 このクラスター別に、最適な販促を行っていく事が売り上げに繋がった。平均回数は分かりやすいが、個別事情といったものまで分析に取り入れられないのでデータ分布を確認し、分析をする事で最適なキャンペーン施策を立案する事が可能になった。 2種類のクラスター分析 階層的手法全てのデータ間の類似度(または非類似度)を計算した後、ある基準で似たもの同士を併合していく方法です。デンドログラム型(図1)の出力になるのが特徴になります。デンドログラムの縦軸は距離となっており、グループが結合した距離のところで線分が結合するようになっています。 図1:デンドログラム型   非階層的手法全体をあらかじめ決めておいたクラスター数に分割していく方法です。サンプル数が大きいビッグデータを分析するときに適しています。ただし、あらかじめいくつのクラスターに分けるかは、分析者が決める必要があり、最適クラスター数を自動的には計算する方法は確立されていません。代表的な手法としてk平均法(K-Means法)/Two-step法があります。情報量を用いて、最適なクラスター数に調整する事もできます。 図2:クラスター分析(非階層的手法)   Pythonでクラスター分析は、以下のように行う。 <pre><code><? $str = <<<‘EOD’import pandas as pdfrom sklearn import datasetsfrom sklearn.cluster import KMeansfrom matplotlib import pyplot as pltiris = datasets.load_iris()df = pd.DataFrame(iris.data, columns=iris.feature_names)result = KMeans(n_clusters=3).fit_predict(df[[‘sepal length (cm)’,’sepal width (cm)’, ‘petal length (cm)’,’petal width (cm)’]])</code></pre>   また数理的に最適だと思われる最適な数は以下のようにElbow plotを用いる事ができる。 <pre><code>distorsions …

クラスター分析 Read More »