#初めに
- 本記事はJDLAのE資格の認定プログラム「ラビット・チャレンジ」における機械学習のレポート記事です。この記事では以下の内容について、そのモデルの概念から確認し、数式・実装(私のGithubのリンクを貼っています)を含めてまとめていきます。
- 線形回帰モデル
- 非線形回帰モデル
- ロジスティック回帰モデル
- 主成分分析
- kNN
- k-means
- SVM
機械学習のモデリングプロセスとは?
まず初めに機械学習のモデリングプロセスについて考えていきたいと思います。機械学習のモデリングプロセスは以下の図1のように、6つのプロセスで進むと考えることができると思います。
「4. 機械学習モデルの選定」では具体的に以下のようなモデルが用いられます。
今回は冒頭でも述べたように、そのモデルの概念から確認し、数式・実装を含めてまとめていきたいと思います。
#線形回帰モデル
回帰問題とはある入力(離散あるいは連続値)から出力(連続値)を予測する問題です。線形回帰モデルは回帰問題を解くための機械学習モデルの1つです。
入力:説明変数(特徴量)
$$
\boldsymbol{x}=\left(x_{1}, x_{2}, \cdots, x_{m}\right)^{T} \in \mathbb{R}^{m}
$$
出力:目的変数
$$
y \in \mathbb{R}^{1}
$$
この時、出力として1次元ベクトルではなく2次元ベクトルを返すようなものはマルチタスク学習と考えられます(いつか記事まとめます)。
さて、線形回帰は教師あり学習なので、教師データとしてn個の入力xとそれに伴う出力yのペアが存在する以下のようなデータを手元にあるデータとして仮定します。
\left\{\left(\boldsymbol{x}_{i}, y_{i}\right) ; i=1, \ldots, n\right\}
線形回帰モデルは入力とm次元パラメータの線型結合を出力するモデルなので以下の式のように表せます。m次元空間における超平面の方程式をシグマを用いて表したものです。
線形結合
\hat{y}=\boldsymbol{w}^{T} \boldsymbol{x}+w_{0}=\sum_{j=1}^{m} w_{j} x_{j}+w_{0}
ちなみにwは重みパラメータですが、w0はニューラルネットワークで言うところのバイアスと同じようなものと考えて差し支えないと思います。
パラメータ
\boldsymbol{w}=\left(w_{1}, w_{2}, \cdots, w_{m}\right)^{T} \in \mathbb{R}^{m}
入力xとそれに伴う出力yのペアからパラメータw(m個の要素)を決定したいというモチベーションです。そして最終的には教師データにはないデータxを入力として、出力yを予測したい。というのが線形回帰です。このモデルに含まれる推定するべき未知のパラメータw(あるいはw + 1)を決めるのには最小二乗法により推定します。
重みとは
特徴量が予測値に対してどのように影響を与えるかを決定する値の集合です。正の重みをつける場合、その特徴量の値を増加させると予測値が増加します(負の値では減少)。重みが大きければ、その特徴量は予測に大きな影響を持つと言えます(0であれば全く影響はしません)。
単回帰モデル
説明変数が1次元の場合(m = 1)は単回帰モデルといいます。この時誤差はεで示されます。注意しなければいけないのは、説明変数が1次元だとしてそのほかに予測に需要な説明変数がある場合は全て誤差εになるということです。
モデル数式
y=w_{0}+w_{1} x_{1}+\varepsilon
さて、各データをモデル式に当てはめるとn個の式が導出されます。
n本の連立方程式
y_{1}=w_{0}+w_{1} x_{1}+\varepsilon_{1}\\
y_{2}=w_{0}+w_{1} x_{2}+\varepsilon_{2}\\
y_{n}=w_{0}+w_{1} x_{n}+\varepsilon_{n}
この式をベクトルの内積を用いて記述すると以下のようになります(誤差は一旦無視します)。
行列表現
\left(\begin{array}{c}y_{1} \\ y_{2} \\ \vdots \\ y_{n}\end{array}\right)=\left(\begin{array}{ll}1 & x_{1} \\ 1 & x_{2} \\ & \vdots \\ 1 & x_{n}\end{array}\right)\left(\begin{array}{l}w_{0} \\ w_{1}\end{array}\right)
重回帰モデル
先ほどの単回帰モデルと同様に連立方程式で考えると
y_{1}=w_{0}+w_{1} x_{11}+w_{2} x_{12}+\cdots+w_{m} x_{1 m}+\varepsilon_{1}\\
y_{2}=w_{0}+w_{1} x_{21}+w_{2} x_{22}+\cdots+w_{m} x_{2 m}+\varepsilon_{2}\\
y_{n}=w_{0}+w_{1} x_{n 1}+w_{2} x_{n 2}+\cdots+w_{m} x_{n m}+\varepsilon_{n}
また、行列で表すと以下のようになります。
計画行列
\boldsymbol{y}=X \boldsymbol{w}+\varepsilon
より
\left(\begin{array}{c}
y_{1} \\
y_{2} \\
\vdots \\
y_{n}
\end{array}\right)=\left(\begin{array}{cccc}
1 & x_{11} & \cdots & x_{1 m} \\
1 & x_{21} & \cdots & x_{2 m} \\
\vdots & \vdots & & \vdots \\
1 & x_{n 1} & \cdots & x_{n m}
\end{array}\right)\left(\begin{array}{c}
w_{0} \\
w_{1} \\
\vdots \\
w_{m}
\end{array}\right)
と考えることができます。
最小二乗法
学習データの平均二乗誤差を最小とするパラメータを探索します。つまり切片(w0)と傾き(w1)をどのように変えれば残差平方和が最も小さくなるのか?を探索します。予測値y-実測値yの2乗の和を取ります。
- 学習データの平均二乗誤差を最小とするパラメータを探索
- 学習データの平均二乗誤差の最小化はその勾配が0になる点を求めれば良い
\operatorname{MSE}_{\text {train }}=\frac{1}{n_{\text {train }}} \sum_{i=1}^{n_{\text {train }}}\left(\hat{y}_{i}^{(\text {train })}-y_{i}^{(\text {train })}\right)^{2}
arg(MSEをmin(最小)にするようなwを返してほしい)
\hat{\boldsymbol{w}}=\arg \min _{\boldsymbol{w} \in \mathbb{R}^{m+1}} \mathrm{MSE}_{\text {train }}
MSEをwで偏微分
\frac{\partial}{\partial \boldsymbol{w}} \operatorname{MSE}_{\text {train }}=0
定義
\frac{\partial}{\partial w}\left\{\frac{1}{n_{\text {train }}} \sum_{i=1}^{n_{\text {train }}}\left(\hat{y}_{i}^{\text {(train) }}-y_{i}^{\text {(train) }}\right)^{2}\right\}=0
行列表現
\frac{1}{n_{\text {train }}} \frac{\partial}{\partial \boldsymbol{w}}\left\{\left(X^{(\text {train })} \boldsymbol{w}-\boldsymbol{y}^{(\text {train })}\right)^{T}\left(X^{(\text {train })} \boldsymbol{w}-\boldsymbol{y}^{(\text {train })}\right)\right\}
{}展開
\frac{1}{n_{\text {train }}} \frac{\partial}{\partial \boldsymbol{w}}\left\{\boldsymbol{w}^{T} X^{(\text {train }) T} X^{(\text {train })} \boldsymbol{w}-2 \boldsymbol{w}^{T} X^{(\text {train }) T} \boldsymbol{y}^{(\text {train })}+\boldsymbol{y}^{(\text {train }) T} \boldsymbol{y}^{(\text {train })}\right\}
行列微分計算
2 X^{(\text {train }) T} X^{(\text {train })} \boldsymbol{w}-2 X^{(\text {train }) T} \boldsymbol{y}^{(\text {train })}=0
回帰係数
\hat{\boldsymbol{w}}=\left(X^{(\text {train }) T} X^{(\text {train })}\right)^{-1} X^{(\text {train }) T} \boldsymbol{y}^{(\text {train })}
予測値
\hat{\boldsymbol{y}}=X\left(X^{(\text {train }) T} X^{(\text {train })}\right)^{-1} X^{(\text {train }) T} \boldsymbol{y}^{(\text {train })}
線形回帰モデルの実装(Boston datasets)
コードは私のgithubに記載しています。
Boston datasetsで実装を行いました。
- データの可視化
特徴量変数間の相関を確認することで多重共線性の確認もできます。
【考察】
CRIM -0.39(犯罪率)と負の相関があり、犯罪率が増えると価格は安くなることも予測できる
ZN 0.36と正の相関があり、敷地面積の割合が高いほど価格が向上する傾向がある
INDUS −0.48と負の相関があり、小売業(商業施設やスーパー、ドラッグストアなど)があるほど家賃は高い傾向にあり、非小売業(工場やオフィスビルなど、、、区別できないことにより都会か田舎かの判断ができないので価格にブレがある)が多くなると価格の中央値は下がる傾向にある
CHAS 0:川に面していない 1:川に面している 関係はなさそうなので説明変数から除外する
NOX 工場に近いことでNOXが増加し、商業施設が相対的に少ないため、家賃の低下が観測できる
INDUS + NOX 0.76と強い相関があることがわかる。よって非小売業者の70%以上は工場や廃棄物処理場などの燃焼を行う場所の可能性が高まりまる。
RM 0.7と正の相関が比較的強く、部屋数が増えることで価格は高くなることが予測できる
AGE 古い物件ほど家賃は安い(直感に反しているデータはおそらくリノベーションしている)
DIS 通勤時間と関連性あり?(データが分散しているため除外)
RAD おそらく利便性の高さ?(扱いが難しいので除外)
TAX 直感的に理解できないデータのため除外
PTRATIO 生徒が少ないほど住宅価格は減少、つまり過疎化が進んでいる地域は低価格
B 時代背景が不明なので邪推したくないため除外
LSTAT 労働者階級が低いあるいは人的地位が低い人が多い土地ほど住宅価格の中央値が減少の傾向にある
以上のことを踏まえて、以下の回帰分析を実装・検討しました。単回帰分析、重回帰分析(2変数)、重回帰分析(7変数)の結果はgithubに記載しています。
モデル検証
MSE Train : 45.013, Test : 40.351
R^2 Train : 0.488, Test : 0.458
Ridge回帰分析(L2ノルム)
MSE Train : 45.014, Test : 40.351
R^2 Train : 0.488, Test : 0.458
Lasso回帰分析(L1ノルム)
MSE Train : 46.951, Test : 41.978
R^2 Train : 0.466, Test : 0.437
#非線形回帰モデル
データ構造を線形で捉えられる場合は限られるので、非線形な構造を捉えられる仕組みが必要です。よって、複雑な非線形構造を内在する現象に対して、非線形回帰モデリングを実施します。
基底展開法
回帰係数として、基底関数と呼ばれる既知の非線形関数とパラメータベクトルの線型結合を使用します。
y_{i}=f\left(\boldsymbol{x}_{i}\right)+\varepsilon_{i}
y_{i}=w_{0}+\sum_{j=1}^{m} w_{j} \phi_{j}\left(\boldsymbol{x}_{i}\right)+\varepsilon_{i}
基底関数
多項式関数
\phi_{j}=x^{j}
ガウス型基底関数
\phi_{j}(x)=\exp \left\{\frac{\left(x-\mu_{j}\right)^{2}}{2 h_{j}}\right\}
2次元ガウス型基底関数
\phi_{j}(\boldsymbol{x})=\exp \left\{\frac{\left(\boldsymbol{x}-\boldsymbol{\mu}_{j}\right)^{T}\left(\boldsymbol{x}-\boldsymbol{\mu}_{j}\right)}{2 h_{j}}\right\}
#汎化性能
汎化性能とは、学習に使用した入力データだけでなく、未知データに対してもよい精度を持つモデルの予測性能のことです。
訓練誤差
\mathrm{MSE}_{\text {train }}=\frac{1}{n_{\text {train }}} \sum_{i=1}^{n_{\text {train }}}\left(\hat{y}_{i}^{(\text {train })}-y_{i}^{(\text {train })}\right)^{2}
テスト誤差
\mathrm{MSE}_{\mathrm{test}}=\frac{1}{n_{\mathrm{test}}} \sum_{i=1}^{n_{\text {test }}}\left(\hat{y}_{i}^{(\mathrm{test})}-y_{i}^{(\mathrm{test})}\right)^{2}
##未学習(underfitting)
未学習とは、学習が不十分であるために、データを表現するモデルが全く得られていないような状態です。訓練誤差が十分に減少していなければ未学習の状態であると言えます。これはハイパーパラメータを調整しながら、訓練誤差が下がるまで実験を繰り返すことで改善できます。この訓練誤差をある程度下げられるようになってから、後の細かい作業を行っていきます。
##過学習(overfitting)
過学習とは、学習済みのモデルに未知データを入力した際に予測性能が著しく低下してしまう状態です。つまり、訓練誤差を下げることに注力してしまった結果、与えた訓練データを過剰に表現するようなモデルになってしまった状態です。
##不要な基底関数の削除
基底関数が十分に足りず、表現力の低いモデルは未学習の状態と言えます。逆に、全てのデータに対してfitするように表現力の高いモデルを構築すると過学習が起きてしまい、汎化性能の低いモデルになってしまいます。よって適切なモデル(汎化性能が高いモデル)は交差検証法で決定することがあります。
##正則化(罰則化法)
以下のような多項式の場合を考えると、Mの値(多項式の次数)が高いほど複雑な曲線を表現できます。
y=w_{0}+\sum_{m=1}^{M} w_{m} x_{m}
Mの値を調節することで適切なモデル(汎化性能の高いモデル)を決定します。正則化を導入する場合、多項式フィッティングでの次数Mの設定は大きめに取っておけばよく、過学習しそうな部分を正則化で抑制することができます。大抵Mを調整するより正則化の強さλを調整するほうが楽である場合が多いです。ニューラルネットなど、モデルが複雑なほど、正則化に任せる方が考えるべきパラメータ数を少なくできます。正則化の手法としてL1(Lasso),L2(Ridge)ノルムがあります。
###L1ノルム
大きさとしても扱うことのある各成分の絶対値の和です(マンハッタン距離)。座標軸に平行にしか移動できない場合はL1距離で測るのが適切です。いくつかのパラメータを正確に0に推定します。
\left|x_{1}\right|+\left|x_{2}\right|+\cdots+\left|x_{n}\right|
###L2ノルム
ユークリッドノルム(普通の意味での長さです)。パラメータを0に近づけるように推定します。
\sqrt{x_{1}^{2}+x_{2}^{2}+\cdots+x_{n}^{2}}
非線形回帰モデルの実装
コードは私のgithubに記載しています。
このようなデータに対して実装を行なっていきます。
- ガウス型基底関数
過学習が生じている。これは、ガウス型基底関数を用いた非線形回帰モデルの表現力が高すぎたことによると考えられる。
- リッジ回帰(正則化)
- RBF Kernel
ガウス型基底関数とRidge回帰を組み合わせたモデルであるKernelRidgeモデル(L2制約付き最小二乗学習)の実装
- Lasso回帰
Lasso回帰では正則化の制約が強く、表現力が失われている
- 多項式カーネル
- SVR(サポートベクター回帰)
ハイパーパラメーターの設計
#評価方法
##ホールドアウト法
手元にあるデータを学習用とテスト用の2つに分割し、「予測精度」や「誤り率」を推定するために使用します。経験上、80:20や70:30の割合でデータを分割することが多いです(デフォルトでは75:25)。この手法は手元にあるデータが膨大でないと良い性能を与えないことが一般に知られています(example:iris datasets)。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
x = iris.data # data = 150
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y)
print(len(x_train)) # 112
print(len(x_test)) # 38
##クロスバリデーション(交差検証)
交差検証とは、個々のモデルの汎化性能を評価する統計的な手法で、分類および回帰に用いることができます。今回は交差検証の中でもよく利用されているk-分割交差検証についてまとめています。k-分割交差検証は、データをk個に分割して、そのうちの1つをテストデータに、残りのk-1個を学習データとして正解率の評価を行います。
from sklearn.model_selection import cross_val_score, KFold
from scipy.stats import sem
def evaluate_cross_validation(clf, x, y, K):
cv = KFold(len(y), K,shuffle=True, random_state=0)
scores = cross_val_score(clf, x, y, cv=cv)
print(scores)
print("Mean score: {} (+/-{})".format(np.mean(score),sem(scores)))
##グリッドサーチ
交差検証はモデルの汎化性能を測定する方法でした。対して、グリットサーチとは、指定したハイパーパラメータの全ての組み合わせに対して学習を行い、もっとも良い精度を示したパラメータを採用し、モデルの汎化性能を向上させる方法を探す代表的な手法です。
from sklearn.model_selection import GridSearchCV
# 最適化したいモデルのハイパーパラメータの設定
parameters = [{'C':[1, 5, 10, 50], 'gamma':[0.001, 0.0001]}]
# グリッドサーチを使ったモデルを作成
from sklearn import svm
svc = svm.SVC()
clf = GridSearchCV(svc, parameters)
clf.fit(x_train, y_train)
print(clf.best_params_) # {'C': 50, 'gamma': 0.001}
#ロジスティック回帰モデル
ロジスティック回帰モデルは、分類問題を解くための教師あり機械学習モデルです。ロジスティック回帰といえば2017年にGoogle AI Blogに掲載されたUsing Machine Learning to Predict Parking Difficultyではロジスティック回帰が良いモデルと評価されています。このような記事を見ると、なんでもかんでもDeep Learningに突っ込むのではなく、各モデルの特性をよく理解して解析することの重要性がわかりますね(No Free Lunch theorem)。
まず、以下のような説明変数と目的変数が与えられてるとき
- 説明変数
\boldsymbol{x}=\left(x_{1}, x_{2}, \cdots, x_{m}\right)^{T} \in \mathbb{R}^{m}
- 目的変数
y \in\{0,1\}
教師データはこのように示されます。
- 教師データ
\left\{\left(\boldsymbol{x}_{i}, y_{i}\right) ; i=1, \ldots, n\right\}
パラメータwは以下のように示されます。
- パラメータ
\boldsymbol{w}=\left(w_{1}, w_{2}, \cdots, w_{m}\right)^{T} \in \mathbb{R}^{m}
入力とm次元パラメータの線型結合をシグモイド関数に入力し0か1で判断します。
- 線型結合
\hat{y}=\boldsymbol{w}^{T} \boldsymbol{x}+w_{0}=\sum_{j=1}^{m} w_{j} x_{j}+w_{0}
- シグモイド関数
\sigma(x)=\frac{1}{1+\exp (-a x)}
シグモイド関数の微分を以下に示します。シグモイド関数の微分はシグモイド関数自身で表すことが可能です。
\frac{\partial \sigma(x)}{\partial x}=\frac{\partial}{\partial x}\left(\frac{1}{1+\exp (-a x)}\right)
=(-1) \cdot\{1+\exp (-a x)\}^{-2} \cdot \exp (-a x) \cdot(-a)
=\frac{a \exp (-a x)}{\{1+\exp (-a x)\}^{2}}=\frac{a}{1+\exp (-a x)} \cdot \frac{1+\exp (-a x)-1}{1+\exp (-a x)}
=a \sigma(x)(1-\sigma(x))
##最尤推定
世の中には様々な確率分布(正規分布・t分布・ガンマ分布・一様分布・ディリクレ分布...)が存在します。ロジスティック回帰ではベルヌーイ分布を利用しています。今回はロジスティック回帰を例に最尤推定を考えていきます。最尤推定とは、尤度関数を最大化するようなパラメータを選ぶ推定方法です。
1回の試行でy=y_1になる確率
P(y)=p^{y}(1-p)^{1-y}
N回の試行でy1~ynが同時に起こる確率(p固定)
P\left(y_{1}, y_{2}, \cdots, y_{n} ; p\right)=\prod_{i=1}^{n} p^{y_{i}}(1-p)^{1-y_{i}}
Y1~ynのデータが得られた際の尤度関数
P\left(y_{1}, y_{2}, \cdots, y_{n} ; p\right)=\prod_{i=1}^{n} p^{y_{i}}(1-p)^{1-y_{i}}
ロジスティック回帰の最尤推定では、確率pはシグモイド関数になるので、推定するパラメータは重みパラメータになります。
\begin{aligned}
P\left(Y=y_{1} \mid \boldsymbol{x}_{1}\right) &=p_{1}^{y_{1}}\left(1-p_{1}\right)^{1-y_{1}}=\sigma\left(\boldsymbol{w}^{T} \boldsymbol{x}_{1}\right)^{y_{1}}\left(1-\sigma\left(\boldsymbol{w}^{T} \boldsymbol{x}_{1}\right)\right)^{1-y_{1}} \\
P\left(Y=y_{2} \mid \boldsymbol{x}_{2}\right) &=p_{2}^{y_{2}}\left(1-p_{2}\right)^{1-y_{2}}=\sigma\left(\boldsymbol{w}^{T} \boldsymbol{x}_{2}\right)^{y_{2}}\left(1-\sigma\left(\boldsymbol{w}^{T} \boldsymbol{x}_{2}\right)\right)^{1-y_{2}} \\
& \cdots \\
P\left(Y=y_{n} \mid \boldsymbol{x}_{n}\right) &=p_{n}^{y_{n}}\left(1-p_{n}\right)^{1-y_{n}}=\sigma\left(\boldsymbol{w}^{T} \boldsymbol{x}_{n}\right)^{y_{n}}\left(1-\sigma\left(\boldsymbol{w}^{T} \boldsymbol{x}_{n}\right)\right)^{1-y_{n}}
\end{aligned}
##分類の評価方法
###再現率(Recall)
「本当にPositiveなもの」の中からPositiveと予測できる割合(NegativeなものをPositiveとしてしまう事象については考えていない)
###適合率(Precision)
モデルが「Positiveと予測」したものの中で本当にPositiveである割合(本当にPositiveなものをNegativeとしてしまう子については考えていない)
###F値
PrecisionとRecallのバランスを示しています。
ロジスティック回帰モデルの実装(Titanic datasets)
コードは私のgithubに記載しています。
Titanic datasetsの実装を行いました。
データ前処理などはgithubのコードに記載しています。
実装結果
#主成分分析(PCA)
主成分分析とは、統計学におけるデータ解析手法のひとつで、教師なし学習の次元削減のためのモデルです。具体的には、たくさんの量的な説明変数について、より少ない指標や合成変数(複数の変数が合体したもの)に要約(次元縮約)するための手法です。この要約した合成変数のことを「主成分」と呼び、データのばらつき(分散)が最大になるように第1主成分、第2主成分(2番目に幅が広くなるように)線が引かれます。近年注目を浴びているビッグデータは多変量、多次元であるためそのままでは理解しにくいですが、主成分分析を行うことにより、データの持つ情報をできる限り損なわず、データ全体の雰囲気を可視化し、直感的に理解しやすい形にすることが可能となります。
主成分分析(PCA)の実装(乳がんデータの分析)
コードは私のgithubに記載しています。
乳がんデータの分析の実装を行いました。
統計的解析や前処理はgithubのコードに記載しています。
寄与率は第1主成分が44%、第2主成分が19%、第3主成分が9%
#k近傍法(knn)
k近傍法:KNN(K Nearest Neighbor)とは、教師あり学習の分類に使われる手法の一つで、与えられた学習データをベクトル空間上にプロットしておき、未知のデータから距離が近い順に任意のk個を取得し、多数決でデータが属するクラスを推定します。分類アルゴリズムの中でも、シンプルで明瞭なアルゴリズムです。独立変数が2個しかない場合は、2次元上にデータをプロットできるので、より直感的に理解できることも利点です。また、データ間距離は「ユークリッド距離」を用いることが最も一般的です。
\begin{gathered}
p=\left(p_{1}, p_{2}, \cdots, p_{n}\right), q=\left(q_{1}, q_{2}, \cdots, q_{n}\right) \\
d(p, q)=\sqrt{\left(q_{1}-p_{1}\right)^{2}+\left(q_{2}-p_{2}\right)^{2}+\cdots+\left(q_{n}-p_{n}\right)^{2}} \\
=\sqrt{\sum_{i=1}^{n}\left(q_{i}-p_{i}\right)^{2}}
\end{gathered}
k近傍法(knn)の実装
コードは私のgithubに記載しています。
クラス0、1に対応するデータ点の作成し、k近傍法について実装を行いました。
結果
kの値を変えることで、分類モデルの複雑さを制御できていることがわかります。
#k-平均法(k-means)
K-meansとは、教師なし学習のクラスタリングのアルゴリズムの一種で、実行速度が速く拡張性があるという特徴があります。k-meansのkはハイパーパラメータで、kを指定することでクラスタの数を決めることができます。イメージを掴むために以下に適当にデータを作成し、k-meansの実装結果を示します。
import numpy as np
from sklearn.cluster import KMeans
from sklearn import metrics
import matplotlib.pyplot as plt
x1 = np.array([1,2,3,1,5,6,5,5,6,7,8,9,7,9])
x2 = np.array([1,3,2,2,8,6,7,6,7,1,2,1,1,3])
x = np.c_[x1, x2] #行列を作成
plt.xlim([0, 10])
plt.ylim([0, 10])
plt.title('data')
plt.scatter(x1, x2) #散布図を作成
kmeans = KMeans(n_clusters=3) #今回はk=3とします
kmeans_model = kmeans.fit(x)
colors = ['b','g','y']
markers = ['o','s','D']
for i, l in enumerate(kmeans_model.labels_):
plt.plot(x1[i],x2[i], color=colors[l],marker=markers[l], ls='None')
plt.xlim([0, 10])
plt.ylim([0, 10])
plt.show() %
動的なk-meansを見て視覚的に理解
では、実際のデータを使って分析していきます。
k-平均法(k-means)の実装(ワインデータセット)
コードは私のgithubに記載しています。
k-meansの実装をワインデータセットで行いました。
結果
#サポートベクターマシン
サポートベクターマシン(SVM)は,Vapnikらによって開発された学習手法であり,テキスト分類,文字認識,画像分類,故障判別などの様々な実世界のアプリケーションにおいて優れた性能を発揮することから,近年注目を集めています。
主として以下のような特徴が挙げられます。
- 各種の問題に適用されて優秀な成績をおさめていること
- 機械学習手法として興味ある理論的なサポートがあること
- 実際問題への適用の際に比較的簡単に実施できること
このSVMを提案したVladimir N. VapnikはVapnikの原理という原理を提唱しています。
Vapnikの原理
「ある問題を解くとき、その問題よりも難しい問題を途中段階で解いてはならない」
これは、途中段階で難しいものがあるなら、それを回避する方法を考えた方がよいし、途中段階で本来の問題よりも難しい問題が出てきて回避できないなら、最終的なタスクの変更を検討した方がよい。という意味です。
私はこの話を聞いたときに、特異値分解を思い浮かべました。。。
サポートベクターマシンの実装
コードは私のgithubに記載しています。
線形分離不可能な場合においてカーネル法を適用して分類を行った結果
うまく分類できていることがわかります。
#参考文献
第3版 Python機械学習プログラミング 達人データサイエンティストによる理論と実践 impress top gearシリーズ