scikit-learn 教師あり学習の覚え書き

# この記事の内容
scikit-learnに含まれている基本的な機械学習法の覚え書きです。簡易的な使用法の羅列ですので、ご容赦ください。
- 教師あり学習 (この記事)
    - 単回帰分析
    - 重回帰分析
    - ロジスティック回帰 (二値分類)
    - ロジスティック回帰 (多値分類)
    - ランダムフォレスト法 (分類)
    - ランダムフォレスト法 (回帰)
    - サポートベクタマシン（SVM）
    - K近傍法 (K-NearestNeighbor)(分類)
    - K近傍法 (K-NearestNeighbor)(回帰)
- 教師なし学習　(以下のURLにて)
    - 主成分分析（PCA）
    - k-means
    - t-SNE

https://qiita.com/t_hirao/items/bcaaf98b0cbea6939ab0


# データセットのインポート

```python
import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
df_iris = pd.DataFrame(data=iris.data,columns=iris.feature_names)
```

# 単回帰分析
```python
from sklearn.linear_model import LinearRegression

#インスタンスの作成
clf = LinearRegression()

#データ数ｎの場合、n×1の行列を作成する
X = df_iris['sepal length (cm)'].values.reshape(-1,1)

Y = iris.target

# 学習
clf.fit(X, Y)

# 回帰係数
print(clf.coef_)

# 切片
print(clf.intercept_)
```
# 重回帰分析
各変数がどの程度目的変数に影響しているかを偏回帰係数の大きさの比較で書くにするため正規化を行う。(normalize=True)
```python
from sklearn.linear_model import LinearRegression

# インスタンスの作成
clf = LinearRegression(normalize=True)
X = df_iris[iris.feature_names].values
Y = iris.target

# 学習
clf.fit(X, Y)

# 回帰係数
print(clf.coef_)

# 切片
print(clf.intercept_)


```
# ロジスティック回帰 (二値分類)
ロジスティック回帰とはベルヌーイ分布に従う統計回帰モデルの一つで、分類問題を行うためのアルゴリズムの一つ。ベルヌーイ分布とは２種類の結果のみが得られる試行の結果を０，１で表した分布。シグモイド関数を用いて、事象が起こる確率を０から１の範囲で算出する。つまり、二値分類で出力された確率をそのまま事象が起こる確率とみなせる。


| LogisticRegression()|引数                    |説明                |
|:--------------------|:----------------------:|:------------------:|
|penalty              |l1：L1正則化、l2：L2正則化|ペナルティ関数の設定   |
|C                    |                       |正則化の影響度の設定   |
|random_state         |                       |乱数                 |
|solver               |'newton-cg','lbfgs','liblinear','sag','saga'|最適化のアルゴリズム |
|max_iter             |                       |収束計算の最大試行回数  |
|n_jobs               |                       |計算に使うジョブの数    |
```python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

df_iris_ = df_iris.loc[:99][:]
iris_target = iris.target[:100]

# インスタンス作成
clf = LogisticRegression(solver='liblinear')

# 説明変数
X = df_iris_[iris.feature_names].values

# 目的変数
Y = iris_target

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3)
clf.fit(X_train, y_train)
clf.predict_proba(X_test)
print(accuracy_score(y_test,clf.predict(X_test)))
```

# ロジスティック回帰 (多値分類)
二値分類では、シグモイド関数を１つ用意することでそれぞれのクラスに属する確率を１以下で表した。多値分類では、入力値☓クラス属性の行列を作成し、各クラスごとの確立値を算出する。
コードは同じですが、中で行っている計算は二値分類と多値分類では異なります。
```python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# インスタンス作成
clf = LogisticRegression(solver='liblinear')

# 説明変数
X = df_iris[iris.feature_names].values

# 目的変数
Y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3)
clf.fit(X_train, y_train)
clf.predict_proba(X_test)
```
# ランダムフォレスト法 (分類)
ランダムフォレストは複数のデータの多数決や平均値をもとに少しずつ違う決定木を集めたアンサンブル学習の一つです。つまり、精度の低い複数の結果を組み合わせることで、精度を向上させる機械学習法です。ランダムフォレストはscikit-learn.ensembleの中から分類問題の場合はRandomForestClassifier、回帰問題の場合はRandomForestRegressorというモジュールをインポートします。データ内の重要な特徴量をfeature_importances_で抽出することができる。

||引数|説明|
|:--|:-:|:-:|
|n_estimators||決定木の個数を指定|
|criterion|'gini-cg', 'entropy'|決定木のデータ分割の指標|
|max_depth||決定木の深さの最大値を指定|
|n_jobs||計算に使うジョブの数|
|random_state||乱数|
|verbose|デフォルトは0|モデル構築の過程のメッセージを出すか|
```python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

clf = RandomForestClassifier(random_state=0)
X = df_iris[iris.feature_names].values
Y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2,random_state=0)

clf.fit(X_train, y_train)
print(accuracy_score(y_test,clf.predict(X_test)))

# 特徴重要度
feature_importance = pd.DataFrame({'feature':iris.feature_names,'importances':clf.feature_importances_}).sort_values(by="importances", ascending=False)
```

# ランダムフォレスト法 (回帰)
```python
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

clf = RandomForestRegressor(random_state=0)
df_iris_ = df_iris.loc[:99][:]
X = df_iris_[iris.feature_names].values
Y = iris.target[:100]

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2,random_state=0)

clf.fit(X_train, y_train)


# 特徴重要度
feature_importance = pd.DataFrame({'feature':iris.feature_names,'importances':clf.feature_importances_}).sort_values(by="importances", ascending=False)
```

# サポートベクタマシン (SVM)
サポートベクタマシンはクラスを明確に分割する境界線を引くためのアルゴリズムで、サポートベクターとは「データを分割する直線に最も近いデータ」です。「マージン最大化」と呼ばれる考え方を使い、正しい分類基準を見つけます。

### scikit-learnに含まれるSVMの種類
- 分類問題（Support Vector Classification）
    - SVC（C-Support Vector Classification）← これだけやります
    - LinearSVC （Linear Support Vector Classification）
    - NuSVC （Nu-Support Vector Classification）
- 回帰問題（Support Vector Regression）
    - SVR
    - LinearSVR
    - NuSVR
- 異常検知のためのSVM
    - OneClassSVM

|SVC()|引数|説明|
|:--|:-:|:-:|
|C||正則化のパラメータ|
|kernel|'linear','poly','rbf','sigmoid','precomputed'|アルゴリズムで使用するカーネルタイプ|
|degree|kernel='poly'の時のみ有効|多項式カーネル関数の次数|
|gamma||カーネルがrbf、poly、sigmoidの時のカーネル係数|
|random_state||乱数|
|verbose|デフォルトは0|モデル構築の過程のメッセージを出すか|

クラスのメソッドはロジスティック回帰などと同様。
```python
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

clf = SVC(random_state=0) 
X = df_iris[iris.feature_names].values
Y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3,random_state=0)

clf.fit(X_train, y_train)
clf.predict(X_test)
```
sklearn.model_selectionのGridSearchCVモジュールを使用することで、パラメータを細かく設定することができる。

# K近傍法 (分類)

学習データをベクトル空間上に予めプロットしておき、未知のデータをそのベクトル空間にプロットする。その点の近傍にあるK個の学習データの多数決から、未知データの属するクラスを推定する。
scikit-learn.neighborsの中から分類問題はKNeighborsClassifier、回帰問題はKNeighborsRegressorというモジュールを使用します。

|SVC()|引数|説明|
|:--|:-:|:-:|
|n_neighbors|デフォルトは5|近傍オブジェクト数|
|weights|'uniform','distance'(デフォルトはuniform)|重み|
|algorithm|'ball_tree','kd_tree','brute','auto'(デフォルトはauto)|アルゴリズム選択|
|leaf_size|リーフサイズ|デフォルトは30|
|n_jobs||計算に使うジョブの数|
|計算に使うジョブの数|デフォルトは0|モデル構築の過程のメッセージを出すか|

```python
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

clf = KNeighborsClassifier(n_neighbors=3)
X = df_iris[iris.feature_names].values
Y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3,random_state=0)

clf.fit(X_train, y_train)

print(accuracy_score(y_test,clf.predict(X_test)))
```

# K近傍法 (回帰)
```python
from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

clf = KNeighborsRegressor(n_neighbors=3)
df_iris_ = df_iris.loc[:99][:]
X = df_iris_[iris.feature_names].values
Y = iris.target[:100]

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3,random_state=0)

clf.fit(X_train, y_train)
```

# 最後に
私自身の解析法の使用方法のまとめを記しました。詳しい解説は、参考サイトや書籍にて確認をお願いいたします。

# 参考にしたサイト

https://kocoffy.com/python/post-1678/#outline__2

https://qiita.com/Hawaii/items/5831e667723b66b46fba

https://ainow.ai/2022/01/26/262387/

https://qiita.com/yshi12/items/26771139672d40a0be32