機械学習の勉強

##はじめに
本記事は機械学習の個人的な勉強におけるメモとして活用しています。
数式や実装は間違っている可能性がありますので、ご了承願います。

##線形回帰モデル
###要点のまとめ
- 回帰問題を解くための機械学習モデルの一つで機械学習の基本とも言えるモデル
$$
\Large y=w_{0}+w_{1}x_{1}+w_{2}x_{2}+\varepsilon
$$
- 教師あり学習(教師データから学習)
- 入力とm次元パラメータの線形結合を出力するモデル　
- モデルの評価における損失関数として平均２乗誤差を使用
- 平均２乗誤差は外れ値の影響を受けるため、前処理段階で外れ値の有無を確認する必要がある


###実装結果と考察
ボストンの住宅データセットを用いて、部屋数が4で犯罪率が0.3の物件の価格を予想してみました。
[実装コードURL](https://github.com/tomatty/report_b/blob/main/LinearRegression.ipynb)


誤差と決定係数の出力結果は以下のようになりました。
<img width = "800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/ec161613-85b4-051f-c5b5-bbf043af8827.png">
決定係数が学習、検証ともに低くなっていますが、これは２つの説明変数しか用いなかったため、良い精度が得られなかったと考えられます。一応、説明変数を増やして再計算したところ、精度が上がることを確認できました。
<img width = "800 "src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/ee0bf5dd-e750-51f2-a201-270229deab6c.png">

##非線形回帰モデル
###要点のまとめ
- 回帰線を線形で表現することができない場合のモデル
$$
\Large y_{i}=w_{0}+\sum_{j=1}^{m}w_{j}\phi_{j}(x_{i})+\varepsilon_{i}
$$
- 現実の問題は非線形ことが多い
- 回帰関数として、基底関数と呼ばれる既知の非線形関数とパラメータベクトルの線型結合を使用
- 未知パラメータは線形回帰モデルと同様に最小2乗法や最尤法により推定
- よく使われる基底関数：多項式関数、ガウス型基底関数、スプライン関数/ Bスプライン関数
- 非線形を扱う場合は、数式が複雑になるので学習においては、未学習と過学習をいかに抑えるかがポイント
- モデルの評価にはホールドアウト法やクロスバリデーションがあるが、データ数に応じて選定する必要がある


###実装結果と考察
データセットは用いず、データをランダムに生成して実装を行ないました。
[実装コードURL]
(https://github.com/tomatty/report_b/blob/main/NonLinearRegressin.ipynb)
生成したデータに対し線形回帰が適さないことを確認
<img width = "400" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/eaf4d849-ec70-9e0a-bfda-cc91f7593c54.png">
カーネルリッジを用いて非線形を表現
<img width = "400" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/747f90bf-7cc0-e37e-720c-fb6e636eb09c.png">
RBFカーネルをいて非線形を表現
<img width = "400" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/80fdaa3c-a97c-1aae-c2ec-ad79f003eb17.png">

##ロジスティック回帰モデル
###要点のまとめ
- 分類問題を解くための教師あり機械学習モデル
$$
\Large P(Y=1|x)=\sigma(w_{0}+w_{1}x_{1}+\cdots+w_{m}x_{m})
$$
- 大きな特徴は出力前にシグモイド関数を通していること
$$
\Large \sigma(x)=\cfrac{1}{1+exp(-ax)}
$$
- 　シグモイド関数を用いることで０〜１で出力される
- 　出力が０〜１となるため、確率的に扱うことが可能となる
- 　シグモイド関数の微分はシグモイド関数を用いて表現することができる

```math
\begin{align}
\cfrac{\partial\sigma(x)}{\partial x}&=\cfrac{\partial}{\partial x}\Bigg(\cfrac{1}{1+exp(-ax)}\Bigg)\\
&=a\sigma(x)(1-\sigma(x))
\end{align}
```

###実装結果と考察
タイタニックデータを用いて年齢ごとの生存成否を分類してみました。

[実装コードURL](https://github.com/tomatty/report_b/blob/main/Logistic_Regression.ipynb)
適合率も再現率もそこまで低くなく、ある程度の精度で分類できていることを確認しました。
<img width = "400" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/7b183c35-1788-b840-b0ce-6e7cabf47358.png">
<img width = "400" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/294a49df-7ca0-2cf5-3169-5b6980e4781d.png">


##主成分分析
###要点のまとめ
- 多くの変数を持つデータの変数を削減し新たな変数を作成するモデル（次元削減）
- 次元削減はするが、データの情報量は大きく損なわずに保持可能
- 情報量を分散と捉えて、分散が大きい成分を主成分として抽出する
- 分散を最大にするデータを行列に置き換えて、固有値問題として解くことができる

###実装結果と考察
がん検査データを利用しロジスティック回帰モデルを作成した後、２次元に圧縮し判別してみました。
[実装コードURL](https://github.com/tomatty/report_b/blob/main/PCA.ipynb)
次元圧縮前のスコア
<img width = "200" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/cb98e0f0-cdcf-de6a-21ed-c12488b1adbc.png">
２次元圧縮後のデータ散布図
<img width = "400" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/0fa403a4-712a-12e7-1c6f-5ae2f16f6dba.png">
次元圧縮後もかなり高い精度で判別できていることを確認しました。
<img width = "400" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/3ebf2de6-c318-fafd-88e8-79a3b61910e3.png">

##k-means
###要点のまとめ
- クラスタリングを行うための教師なし学習モデル
- アルゴリズム
 - 各クラスタの中心の初期値を設定する
 - 各データ点とクラスタの中心の距離を計算し、最も距離が近いクラスに割り当てる
 - 各クラスタの平均ベクトルを計算し、クラスタの中心を更新する
 - 収束するまで繰り返す 
- k-meansは初期値依存性があるため、初期値によってはうまくクラスタリングできない可能性がある
- k-meansの初期値依存性を改善したモデルにk-means++がある
- クラスタの数によっても結果が変わることがある

###実装演習と考察
numpyを用いてランダムにデータを生成し、クラスタリングを行いました。
[実装コードURL](https://github.com/tomatty/report_b/blob/main/KMeans.ipynb)
<img width = "400" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/e257e053-f9d0-8ba4-ce13-6985ebf22733.png">
上手く３つにクラスタリングできていることを確認しました。
<img width = "400" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/09e97f85-8764-e215-2bcf-ef4ca081dfdb.png">



##サポートベクターマシーン
###要点のまとめ
- サーポートベクトルマシンは古くからある手法で、回帰も分類もできるモデル
- ２クラス分類においては特徴ベクトルを分類するために決定関数を用いる
$$
\Large f(x)=w^T x+b
$$
- ２クラスへの分類は決定関数を介して出力されるラベルにより分類する。

```math
\Large
\begin{equation}
y=signf(x)= \left \{
\begin{array}{l}
+1　(f(x)>0) \\
-1　(f(x)<0)
\end{array}
\right.
\end{equation}
```
- 特徴ベクトルを２つのクラスに分ける境界のことを分類境界という
- 分類境界を挟んで２つのクラスの距離をマージンという
- SVMの目的はマージンが最大となるような分類境界を見つけること
- 特徴ベクトルを完全に分離可能という考え方：ハードマージン
- 特徴ベクトルは完全に分離できず誤差(スラック変数)を許容するという考え方：ソフトマージン

###実装結果と考察
numpyを使って線形分離不可能なデータを生成し、SVMを用いて分離境界を作図してみました。
今回はRBFカーネルを用いました。
[実装コードURL](https://github.com/tomatty/report_b/blob/main/SVM_rbf.ipynb)
<img width = "400" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/7cc3083f-9ad4-f5e4-aa9e-2beb61844b53.png">
<img width = "400" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1304367/aedbfe97-ebab-c79b-7775-fe0c509be03a.png">