ラビットチャレンジ 機械学習レポート

  1. 線形回帰モデル 要点まとめ
    1. 回帰問題
    2. 回帰で扱うデータ
    3. 線形回帰モデル
    4. データ分割とモデルの汎化性能測定
    5. パラメータは最小二乗法で推定
      1. 平均ニ乗誤差(残差平方和)
      2. 最小二乗法
      3. 回帰係数
      4. 予測値
    6. 講義memo
  2. 線形回帰 演習課題
    1. 実行コード
    2. 結果
    3. 考察
      1. 実行コード
  3. 非線形回帰モデル 要点まとめ
    1. 基底展開法
    2. 未学習(underfitting)と過学習(overfitting)
    3. 汎化性能
    4. ホールドアウト法
    5. クロスバリデーション(交差検証)
    6. グリッドサーチ
  4. 非線形回帰モデル 実装演習
    1. 線形回帰モデルで分析
    2. 非線形回帰による分析
    3. リッジ回帰
    4. 多項式
    5. ラッソ回帰
    6. サポートベクター回帰モデル
    7. Keras深層学習による分析
  5. ロジスティック回帰モデル 要点まとめ
    1. 説明変数と目的変数
    2. シグモイド関数
    3. 最尤推定
    4. 尤度関数
    5. 対数尤度関数
    6. 勾配降下法
    7. 確率的勾配降下法(SGD)
  6. ロジスティック回帰モデル 実装演習
    1. モジュールやデータの読み込み
    2. 不要なデータの削除・欠損値の補完
    3. ロジスティック回帰分析
    4. 2変数のロジスティック回帰分析
      1. 考察
  7. 主成分分析 要点まとめ
    1. 主成分分析の手順
    2. 寄与率
  8. 主成分分析 実装演習
    1. 設定と課題
    2. 乳がんデータセット
      1. 入力データ
    3. ロジスティック回帰分析
      1. 出力結果
    4. 主成分分析
      1. 出力結果
    5. 2次元にまで次元を圧縮
      1. 結果出力
      2. 考察
  9. k-近傍法 要点まとめ
    1. k-近傍法 実装演習
  10. k-平均法 要点まとめ
    1. アルゴリズム
    2. 欠点
    3. 講義メモ
    4. k-平均法 実装演習
  11. サポートベクターマシーン 要点まとめ
    1. 実装演習
      1. 訓練データ生成① (線形分離可能)
      2. 訓練データ生成② (線形分離不可能)
      3. ソフトマージンSVM

線形回帰モデル 要点まとめ

回帰問題

ある入力(離散or連続値)から出力(連続値)予測する問題
・直線で予測 線形回帰
・曲線で予測 非線形回帰

回帰で扱うデータ

入力(説明変数または特徴量)
m次元のベクトル(m=1の場合はスカラ)

$$x=(x_1, x_2, x_3, \cdots ,x_m)^T \in\mathbb{R^m}$$

出力(目的変数)
スカラー値
$$y\in\mathbb{R}^1$$

線形回帰モデル

特徴

  • 回帰問題を解くための機械学習モデルの一つ
  • 教師あり学習(教師データから学習)

パラメータ
$$ w=(w_1,w_2,w_3,\cdots,w_m)^T\in\mathbb{R^m}$$

入力とm次元パラメータの線形結合を出力するモデル
慣例的に予測値にはハット\(\hat{y}\)を付ける
切片を\(w_0\)とすると

$$ \hat{y}=w^Tx+w_0=\sum_{k=1}^m x_k w_k+w_0 $$

データ分割とモデルの汎化性能測定

  • 次の二つにデータを分割する
    学習用データ:機械学習モデルの学習に利用するデータ
    検証用データ:学習済みモデルの精度を検証するためのデータ
  • 分割する理由
    モデルの汎化性能を測定するため
    未知のデータに対してどのくらい精度が高いかを測定する

パラメータは最小二乗法で推定

平均ニ乗誤差(残差平方和)

データとモデル出力のニ乗誤差の和。
小さいほど直線とデータの距離が近い。
データは既知でパラメータのみ未知。

$$ MSE_{\rm train}=\frac{1}{n_{\rm train}}\sum_{k=1}^{n_{\rm train}}\Big(\hat{y_k}-y_k\Big)^2 $$

最小二乗法

学習データの平均ニ乗誤差の最小化は、その勾配が0になる点を求めればよい。
つまりMSEをwに関して微分したものが0となるwの点を求める。

$$ \frac{\partial}{\partial w}MSE_{\rm train}=0 $$

回帰係数

$$ \bf{\hat{w}} = (X^{(train)\mathrm{T}}X^{(train)})^{-1} X^{(train)\mathrm{T}} y^{(train)}$$

予測値

$$ \bf{\hat{y}} = X(X^{(train)\mathrm{T}}X^{(train)})^{-1} X^{(train)\mathrm{T}} y^{(train)} $$

講義memo

講義で気になったところをメモ

線形とは・・・ざっくり比例のことである
e.g., y=Ax+B (2次元)
z=Ax+By+C (3次元)
※n次元空間における超平面の方程式

$$ \begin{align} y &= a_0 + a_1x_1 + a_2x_2 + \cdots + a_{n-1}x_{n-1} \\ &= a_0 + \sum_{i=1}^{n-1} a_ix_i   (a_0=a_0×1=a_0x_0) \\ &= \sum_{i=0}^{n-1} a_ix_i \quad , where \quad x_0=1 \\ &= \boldsymbol{a}^T \boldsymbol {x},\\ \quad where \quad \boldsymbol{a} &= \left(\begin{array}{c} a_0 \\ a_1 \\ \cdots \\ a_{n-1}  \end{array} \right), \quad \boldsymbol{a}^T = (a_0, a_1, \cdots, a_{n-1}), \quad \boldsymbol {x} = \left(\begin{array}{c} x_0 \\ x_1 \\ \cdots \\ x_{n-1}  \end{array} \right)\\ &=(a_0, a_1, \cdots, a_{n-1})\left(\begin{array}{c} x_0 \\ x_1 \\ \cdots \\ x_{n-1}  \end{array} \right)
\end{align}$$

ベクトルや行列 ⇔ シグマによる数式 ⇔ 掛け算と足し算のみの数式の行き来ができるようになることが重要。ベクトル・行列の数式を見てわからなくなったら掛け算と足し算の形まで落とし込むと理解しやすくなる。

ヴァフニックの原理
かんたんな問題(競馬予測などランキング)を難しい問題(回帰問題)にして解くな

線形回帰 演習課題

ボストンの住宅データセットを線形回帰モデルで分析する。
部屋数が4で犯罪率が0.3の物件はいくらになるか?

実行コード

 

結果

[4.24007956]

部屋数が4で犯罪率が0.3の物件は4240ドルになると推定される。

考察

考察のため片方のパラメータを固定し、もう一つのパラメータを動かして家賃の値段がどのように変化するか見てみる。
パラメータのパターンは次の通り。

  • CRIM:0.1~1.0 RM:7固定
  • CRIM:0.3固定  RM:1~10

実行コード

結果の出力
CRIM:0.1~1.0 RM:7固定の場合

ボストン住宅データ犯罪率と家賃の関係

犯罪率が増加しても家賃はほぼ変わらないことがわかる。

CRIM:0.3固定  RM:1~10の場合

ボストン住宅データ部屋数と家賃の関係

犯罪率が上がっても家賃の価格は微減でほぼ影響がなく、部屋数のほうが大きな影響を与えていることがわかる。
また部屋数が3以下の場合家賃がマイナスとなっており、住むとお金がもらえることになっておかしい。これは5部屋以上のデータしかないデータセットに3部屋以下にも当てはめたために発生した。これは外挿問題と呼ばれる。

非線形回帰モデル 要点まとめ

複雑な非線形構造を持つ現象に対して線形回帰では直線でしかモデルを作れない。
そこで単回帰・重回帰から発展して非線形な回帰を考えたい:

$$ \begin{align} \hat{y} &= w_0 + w_1x + w_2x^2 + w_3x^3 + \cdots + w_{n-1}x^{n-1}
\end{align}$$

線形回帰はxが1次式のみだったが上式では\(x^2\)や\(x^3\)と言った非線形な関数になっている。それを関数\(\phi(x)\)を使って表すと

$$ \begin{align} \hat{y} &= w_0 + w_1\phi_1(x) + w_2\phi _2(x) + \cdots + w_{n-1}\phi _{n-1}(x)
\end{align}$$

線形回帰の時からxが\(\phi(x)\)に代わるだけ。
※xから\(\phi(x)\)に変えても、重みパラメータ\(\boldsymbol{w}\)については線形のまま。

基底展開法

$$ y_i=w_0 + \sum_{j=1}^m w_j \phi_j (\boldsymbol{x}_i) + \epsilon$$

線形回帰でxだったものが\(\phi_j(\boldsymbol{x}_i)\)となっている。
この\(\phi_j(\boldsymbol{x}_i)\)を基底関数という。
xは非線形になったがパラメータは何も変わらないので基底展開法も線形回帰と同じ枠組みで推定可能
よく使われる基底関数

  • 多項式関数
  • ガウス型基底関数
  • スプライン関数/Bスプライン関数

未学習(underfitting)と過学習(overfitting)

  • 未学習
    学習データに対して十分小さな誤差が得られないモデル
    対策:モデルの表現力が低いため、表現力の高いモデルを利用する
  • 過学習
    小さな誤差は得られたけど、テスト集合誤差との差が大きいモデル
    対策1:学習データの数を増やす
    対策2:不要な基底関数(変数)を削除して表現力を抑止
    対策3:正則化を利用して表現力を抑止

汎化性能

学習データに対する予測性能ではなく、未知のデータに対しての予測性能。
学習誤差でなく汎化誤差(テスト誤差)が小さいものが良い性能のモデル
汎化誤差は通常、学習データとは別に収集された検証データでの性能を測ることで推定

  • 訓練誤差もテスト誤差もどちらも小さい
    → 汎化しているモデル
  • 訓練誤差は小さいがテスト誤差が大きい
    → 過学習
  • 訓練誤差もテスト誤差もどちらも小さくならない
    → 実学習

ホールドアウト法

学習用とテスト用の二つに分割し、「予測精度」や「誤り率」を推定するために使用。
学習用を多くすればテスト用が減り学習精度は良くなるが、性能評価の精度は悪くなる。
逆にテスト用を多くすれば学習用が減少するので、学習そのものの精度が悪くなることになる。
手元にデータが大量にある場合を除いて、良い性能評価を与えないという欠点がある。

いつ使ってはいけないか?
手元のデータが少ないとき。
理由は外れ値が検証データに入ってしまうと外れ値にフィットしてしまう。

クロスバリデーション(交差検証)

データを複数のブロックに分割する。5分割なら1つを検証データにし残りの4つを学習データにする。この一回の学習と検証のサイクルをイテレータという。
次に検証データに使わなかったデータを検証データにして、分割した数の分だけ検証し、各イテレータで精度を算出する。
その精度の平均値をCV値として汎化性能の評価値とする。
各モデルの中で最も低い値が最も良いモデルとなる。
学習と検証でデータを入れ替えるので先ほど述べたホールドアウト法の欠点を解消する。

グリッドサーチ

全てのチューニングパラメータの組み合わせで評価値を算出
最も良い評価値を持つチューニングパラメータを持つ組み合わせを、「いいモデルのパラメータ」として採用

欠点として組み合わせ爆発がある。
現実的にはベイズ最適化が使われている。

非線形回帰モデル 実装演習

seabornや各種ライブラリインポート
真のデータを作成と表示

真のデータ

真の関数からノイズのあるデータを作成
これを非線形回帰モデルで分析する

線形回帰モデルで分析

比較のためまずは線形回帰モデルで分析

出力結果
0.2712539928579739

直線となる線形回帰モデルでは決定変数が0.271と低く、うまく予測できないことがわかる。

非線形回帰による分析

 

結果出力
0.8601036894505026

上記コードの3行目でガウス型基底関数とリッジ正則化を指定して非線形回帰分析を行った。alphaは正則化パラメータ、kernelはカーネル関数の種類。
線形回帰と比べて大幅に数値が改善された。

リッジ回帰

出力結果
0.8289590826069769

こちらもデータに適合し精度が大幅に改善している。

多項式

1次から10次の多項式モデルを考える。

 

結果出力
0.27125399285795715
0.34974120782480167
0.5171148600686912
0.8649636232520035
0.8651176732531856
0.8661052385444666
0.8661120308166388
0.8666017172643924
0.8666269776503734
0.8667253253707998

結果は上から順に1次、2次・・・10次となっている。
この結果をみると次数が増えると結果が良くなっていることがわかるが、4次以降はほとんど変化がない。よって、4次の多項式モデルを使用すればそれで十分であることがわかる。無駄に5次以降のモデルを使う必要はない。

ラッソ回帰

結果出力
2.220446049250313e-16

サポートベクター回帰モデル

結果

サポートベクターマシンで回帰を行っている。

精度の出たガウス型基底関数+リッジ回帰の非線形回帰分析と比べると適合具合でやや劣っている。横軸0.0~02の区間でうまく適合できていないのがわかる。

Keras深層学習による分析

出力結果

coef

[-0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

ロジスティック回帰モデル 要点まとめ

分類問題を解くための教師あり学習モデル。回帰モデルとあるが、分類問題を解くためのモデルである。

・パラメータ

$$ \boldsymbol{\omega} =(\omega_1,\omega_2,\omega_3,\cdots,\omega_m)^T\in\mathbb{R^m} $$

・線形結合

$$ y_i= \boldsymbol{\omega}^T\boldsymbol{x} + w_0 = \sum_{j=1}^m w_jx_j + \omega_0 \phi_j (\boldsymbol{x}_i) + w_0$$

説明変数と目的変数

入力(説明変数):m次元のベクトル

$$ x=(x_1,x_2,x_3,\cdots,x_m)^T\in\mathbb{R^m} $$

出力(目的変数)
$$ y ∈ {0, 1} $$
分類問題では出力は0,1になるがロジスティック回帰モデルでは0~1の確率になる。
このため、20~80%の結果はどちらにも分類せずに結果を保留することもできる。

シグモイド関数

出力が必ず0~1の値になり確率で表現できる単調増加関数。
パラメータaを増加させると形が変わり、x=0付近での曲線の勾配が増加。
aを極めて大きくすると単位ステップ関数に近付く

$$ \sigma(x)=\frac{1}{1+\exp(-ax)}=\frac{1}{1+e^{-ax}} $$

・シグモイド関数の性質

シグモイド関数の微分はシグモイド関数自身で表現することが可能
$$ \sigma^{\prime}(x)=a\sigma(x)\big(1-\sigma(x) \big) $$

最尤推定

元データを固定し、パラメータを変化させる。
この時、尤度関数を最大化させるようなパラメータを選ぶ推定方法を最尤推定という。
ロジスティック回帰モデルではベルヌーイ分布が使用される。

尤度関数

n回の試行で同時に、\(y_1,y_2,y_3,\cdots,y_n\)が起こる確率

$$ {\begin{eqnarray}
P(y_1,y_2,y_3,\cdots,y_n ;p)&=&\prod_{k=1}^np^{y_k}(1-p)^{1-y_k} \\
&=&\prod_{k=1}^n \Big(\sigma(w^Tx_k) \Big)^{y_k}\Big(1-\sigma(w^Tx_k)\Big)^{1-y_k} \\
&=& L(w)
\end{eqnarray}
} $$

対数尤度関数

尤度関数は上に示したように確率pの掛け算を多数おこなう。
そのため、値が小さくなり桁落ちの可能性が高くなるため、実装上必要になる。
対数を取ると微分の計算が簡単になる。
積が和に、指数が積の演算に変換可能。
対数尤度関数が最大になる点と尤度関数が最大になる点は同じ

$$ {\begin{eqnarray}
E(w_1,w_2,w_3,\cdots,w_m) &=&-\log L(w_1,w_2,w_3,\cdots,w_m)\\
&=&-\sum_{i=1}^m\Big(y_i\log y_i+(1-y_i)\log(1-y_i) \Big)
\end{eqnarray}
} $$

勾配降下法

最小二乗法は解析に解を求めることができたが対数頻度関数はできないため、逐次的に求める勾配降下法を使う。

$$ w^{k+1}=w^k-\eta\sum_{i=1}^n(y_i-p_i)x_i $$

ここで、\(\eta\)は学習率でモデルのパラメータの収束しやすさを調整する。
nが巨大になった場合、メモリ容量や計算量が莫大になる。

確率的勾配降下法(SGD)

データをランダムに一つ選んでパラメータを更新。
毎回の更新でデータを一つ、または少量しか見ないので効率よく最適な解を探索可能

$$ w^{k+1}=w^k-\eta(y_i-p_i)x_i $$

ロジスティック回帰モデル 実装演習

  • 設定
    タイタニックの乗客データを利用しロジスティック回帰モデルを作成
    特徴量抽出をしてみる
  • 課題
    年齢が30歳で男の乗客は生き残れるか?

モジュールやデータの読み込み

出力結果

不要なデータの削除・欠損値の補完

予測に不必要なカラムをドロップ

nullを含んでいる行を表示

Ageカラムのnullを中央値で補完。結果出力は先頭5行だけ。

 

 

ロジスティック回帰分析

出力結果
/usr/local/lib/python3.7/dist-packages/sklearn/utils/validation.py:760: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
y = column_or_1d(y, warn=True)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, l1_ratio=None, max_iter=100,
multi_class=’auto’, n_jobs=None, penalty=’l2′,
random_state=None, solver=’lbfgs’, tol=0.0001, verbose=0,
warm_start=False)

ここでC=1.0と指定されているのは正則化されている。オーバーフィッティングしないような工夫がなされている。 penalty=’l2’でペナルティとしてL2ノルムを指定。 暗黙の仮定が置かれていることに注意

出力結果
array([0])
[[0.50358033 0.49641967]]
[-0.94131796]
[[0.01519666]]

出力結果

2変数のロジスティック回帰分析

課題である年齢が30歳で男の乗客は生き残れるか?を分析する。
説明変数は年齢と性別である。

性別は文字列なので解析できるようにfemale:0,male:1に置き換える

変数として「Pclass_Gender」を用いる。Pclassは乗客の社会階層でGenderは先ほど作った性別の変数を組み合わせて使用する。これを足すことにより、上流階層で女性:1、上流で男性:2、下流階層で女性:3、下流で男性:4と分けられる。

 

考察

この分析結果から上流階層(Pclass_Gender=1.0or2.0)ほど生存しやすく、下流階層(Pclass_Gender=3.0or4.0)は死亡しやすいことがわかる。年齢に関しては、上流階層かつ女性は年齢問わず生存している。それ以外は年齢が若いと生存しやすいことが読み取れる。
性別では男性よりも女性のほうが生存しやすいことが分かった。

主成分分析 要点まとめ

多変量のデータを少数個の指標に圧縮する手法。
主に次元圧縮に利用される。
圧縮に伴う情報の損失をなるべく小さくしたい。
そのためには分散が最大になるように低次元化を行う。
分散が大きいのはそれだけいろんな情報が残っていることを意味する。

主成分分析の手順

  1. 分散共分散行列を計算
  2. 求めた分散共分散行列の固有値問題を解く
  3. 求めた固有値と固有ベクトルに基づいてデータを表現

寄与率

第1~元次元分の主成分の分散は、元のデータの分散と一致
2次元のデータを2次元の主成分で表示した時、固有値の和と元のデータの分散が一致

  • 寄与率:第k主成分の分散の全分散に対する割合(第k主成分が持つ情報量の割合)
  • 累積寄与率:第1-k主成分まで圧縮した際の情報損失量の割合

主成分分析 実装演習

設定と課題

  • 設定
    乳がん検査データを利用しロジスティック回帰モデルを作成
    主成分を利用し2次元空間上に次元圧縮
  • 32次元のデータを2次元上に次元圧縮した際に、うまく判別できるかを確認

乳がんデータセット

  • 乳がんの診断569ケース
  • 各ケースは検査値含む32の値を持っている
  • 目的変数は診断結果(良性腫瘍or悪性腫瘍)

入力データ

二列目が目的変数の診断結果 (良性がB / 悪性がM)
3列目以降が説明変数

ロジスティック回帰分析

説明変数は3列以降、目的変数を2列目としロジスティック回帰で分類

出力結果

Train score: 0.988
Test score: 0.972
Confustion matrix: [[89 1] [ 3 50]]

ロジスティック回帰分析では検証スコア97%で分類できることを確認

 

主成分分析

出力結果

pca出力結果

pca.explained_variance_ratio_は寄与率でどのくらい情報を説明できるかの指標。

第2成分までで60%近くをカバーしていることがわかる。

2次元にまで次元を圧縮

結果出力

X_train_pca shape: (426, 2)
explained variance ratio: [0.43315126 0.19586506]
寄与率の合計: 0.6290163245532953
Text(0, 0.5, ‘PC 2’)

pca2分析

考察

ロジスティック回帰で検証スコア97%を出しているが、主成分分析の寄与率は62.9%なので良性と悪性のクラスタの境界部分にかなり重なり合う部分が見られる。

 

k-近傍法 要点まとめ

分類問題(クラスタリング)のための機械学習手法

最近傍のデータをk個を取ってきて、それらがもっとも多く所属するクラスに識別。
k個のデータから多数決を取るイメージ。
k=1の時、最近傍法と呼ばれる。
kの選び方で結果が変化する。

k-近傍法 実装演習

各種ライブラリ

訓練データ生成

訓練データ

学習

陽に訓練ステップはない

予測

予測するデータ点との、距離が最も近いk個の、訓練データのラベルの最頻値を割り当てる

出力結果

kの値を変化させて結果の違いを確認する。

k=1

k=3

K=5

k=10

k=1~5では中央付近のデータ点を分類しようとしているのがわかる。
kの値が大きくなるにつれ分類境界がなめらかになっていき、k=10だと中央付近の本来黄色であるデータはすべて紫側に分類されるようになった。

k-平均法 要点まとめ

・教師なし学習
・クラスリング手法
・与えられたデータをk個のクラスタに分類

アルゴリズム

  1. 各クラスタ中心の初期値を設定する
  2. 各データ点に対して、各クラスタ中心との距離を計算し、最も距離が近いクラスタを割り当てる
  3. 各クラスタの平均ベクトル(中心)を計算する
  4. 収束するまで2, 3の処理を繰り返す

欠点

初期値が近いとうまくクラスタリングできない。

 

講義メモ

機械学習アルゴリズム辞典

様々な機械学習手法を手っ取り早く知るために参考になる。

k-平均法 実装演習

ライブラリ

データ生成

訓練データ

学習

クラスタリング結果

出力結果

k=3

きれいに三つにクラスタリングできた。

k=10

あきらかに三つにクラスタリングされるべきデータだが、k=10と指定すると無理やりにでも10個のクラスタに分けてしまった。

学習時のクラスタ中心の初期値をわざと偏らせるように変更してみる。

他のコード部分は上記と同じ。

結果

クラスタ中心の初期値が三つとも近いと誤ったクラスタリングになることを確認した。

意外なことにクラスタ中心の偏りが2つだけだとうまくクラスタリングする。

結果

 

Numpy実装

出力結果

labels: [2 2 2 2 2 2

2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1]
cluster_centers: [[ 5.05664845 -5.16421186]
[ 0.060793 4.95873178]
[-4.90064464 -4.95419381]]
array([[ 5.05664845, -5.16421186],
[ 0.060793 , 4.95873178],
[-4.90064464, -4.95419381]])

出力結果

サポートベクターマシーン 要点まとめ

・教師あり学習
・分類問題
・回帰問題や教師無し学習への応用もある
・線形分離問題だけでなく非線形分離問題も分類できる。
・入力データを二つのクラスに分類するための超平面を決定する。

決定関数
2クラス分類問題では、特徴ベクトルxがどちらのクラスに属する判定するために次の決定関数と呼ばれる関数\(f(x)\)が使われる。

$$ \begin{align} f(x) &= \boldsymbol{w}^Tx + b
\end{align} $$

この式において\(\boldsymbol{w}\)とxは事前にはわからない未知のパラメータであり、SVMはこれを推定する。

関数\(f(x)\)にあてはめて0未満であれば‐1、0以上であれば+1として2クラスに割り当てる。もしくは正負によってクラス分けを行う。

分類境界
f(x)=0が特徴ベクトル\(\boldsymbol{w}=(x_1,x_2)^T\)を二つのクラスに分ける境界線になっている。一般にこのような境界を分類境界という。

マージン最大化
各クラスのデータ点と分類境界との最短距離をマージンと呼ぶ。このマージンが最大になるような決定関数を学習する。

サポートベクトル
マージン最大化によって決定された分類境界に最も近いデータ点をサポートベクトルという。

ハードマージン
訓練データを完全に2つに分類できる決定関数f(x)がある場合、そのような分類をハードマージンと呼ぶ。

ソフトマージン
ハードマージンは現実の問題では仮定が強すぎる、つまり完全に訓練データを二つに分類できる場合は少ない。そのため、スラック変数と呼ばれる許容誤差を設け、ある程度の誤分類を許すような仮定ををソフトマージンという。

非線形分離

データの分布によっては線形分離ではうまく分類できないケースがある。
入力データを高次元に拡張、高次元の特徴空間上で線形分離を行い、その結果を元の入力データに落とし込むと非線形分離ができるようになる。このような非線形分離の手法を「カーネルトリック」という。

実装演習

各種ライブラリの読み込み

訓練データ生成① (線形分離可能)

訓練データ

SVM訓練データ

学習を行う

予測を行う

出力結果

SVM出力結果(線形分離可能)

マージンが最大化するように二つのクラスに分類された。

訓練データ生成② (線形分離不可能)

データ作成

 

訓練データ

学習

元のデータ空間では線形分離は出来ないが、特徴空間上で線形分離することを考える。今回はカーネルとしてRBFカーネル(ガウシアンカーネル)を利用する。

予測

出力結果

直線では対応できないデータにも2値クラス分類できることが分かった。

ソフトマージンSVM

訓練データ生成③(重なりあり)

訓練データ

 

学習

分離不可能な場合は学習できないが、データ点がマージン内部に入ることや誤分類を許容することでその問題を回避する。
パラメータCはマージンの大きさと誤差の許容度のトレードオフを決めるパラメータ。
この値を変化させて結果の違いを比較してみる。

予測

出力結果

C=1

マージン内に誤分類を許容しつつ、クラスを二つに分類できている。

C=0.1

C=0.01

Cの値を小さくするとマージンが広く取られ、誤分類されるデータが増えていくことが確認された。

C=10

Cの値を大きくしても変化が見られなかった。資料によるとCを大きくすると誤分類を許容しなくなるはずだが、Cを100にしても10000にしても変化が見られなかった。原因はよくわからなかった。

 

コメント

タイトルとURLをコピーしました