とりあえず一回やってみる機械学習

# 教師あり
正解を与えた状態で学習をする
正解の特徴/パターンを見出し、できるだけ正確な予測ができるようなモデルを作成する。
代表的なのは「回帰」「分類」

「回帰」は連続値を推測する。
「分類」は所属カテゴリ（〇〇かどうか）を推測する

## 回帰

**値を予測する**際に使用する。

### 単回帰
<details><summary>サンプルコード</summary><div>

```python
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(x_train, y_train) #最小二乗法を使って切片と係数を求める
y_pred = regressor.predict(x_test)

#可視化
plt.scatter(x_test, y_test, color='red')
plt.plot(x_test.values, y_pred, color='blue')
```
</div></details>
xの値からyの予測値を直線で考える方法。
残差をできるだけ小さくしていい感じの直線を引く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409578/4f66fbf4-36d6-6e7f-96ab-7ae2cb7173a2.png)

### 重回帰

<details><summary>サンプルコード(単回帰と実装は同じ)</summary><div>

```python
#単回帰と実装は同じ
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(x_train, y_train) #最小二乗法を使って切片と係数を求める
y_pred = regressor.predict(x_test)
```
</div></details>

単回帰の次元が増えた版。（＝説明変数が増えている）
$ x_i \ $の値からyの予測値を**直線**で考える方法。

- 多重共線性に気を付ける（相関の強い変数があるとモデルに悪影響が出ることがある）
- 場合によっては変数を抽出する

```math

y = a + b_1x_1 +b_2x_2+ \cdots +b_ix_i
```
### 多項式回帰
<details><summary>サンプルコード</summary><div>

```python
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree=2)
x_poly = poly_reg.fit_transform(x)
reg = LinearRegression()
reg.fit(x_poly,y)

#可視化
plt.scatter(x, y, color='red')
plt.plot(x.values, reg.predict(x_poly), color='blue')
```
</div></details>

事前に多項式回帰が当てはまるかどうかは、直感的には見えづらい（x2とかの次元もあるため）
degreeが増えるともっとぐにゃぐにゃの曲線も作れるが、適切に定めないと過学習になりがち。
モデルを作ってみて、結果が良ければ採用する。

```math

y = a + b_1x_1 +b_2{x_2}^2
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409578/09acf859-11b4-93ed-a503-6451dca7c925.png)


### その他サンプルコード
※各モデルのサンプルコードはモデルの説明分に記載。
<details><summary>モデルの評価</summary><div>

```python
#平均絶対誤差 (MAE)
import sklearn.metrics as sk
print(sk.mean_absolute_error(y_test, y_pred))
#平均二乗誤差 (MSE)
print(sk.mean_squared_error(y_test, y_pred))
#決定係数 (R2):回帰の当てはまりの良さ。最も良い場合、1.0となる。
print(sk.r2_score(y_test, y_pred))
```
</div></details>

## 分類
〇〇かどうか


### ロジスティック回帰
<details><summary>サンプルコード</summary><div>

```python
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import PolynomialFeatures
clf = LogisticRegression()
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)
```
</div></details>

統計学の考え方をつかっている。
0,1が混合になるあたりの閾値をシグモイド関数を使って確率で表すことができる

```math
y=B_0\times{B_1}^{x1}\times{B_2}^{x2}\\
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409578/6d6c4033-c627-2214-6a8a-7c17802c52fe.png)

### SVM
（仮定した）境界と一番近いデータをサポートベクトルとし、サポートベクトルとの距離＝マージンを最大化するようにサポートベクトルと境界を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409578/7d4b6834-2bc7-de11-6cd3-84a8d6bdfb2a.png)								
								


### 分類木
各質問を通して、不純度を減らしていく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409578/e8009d21-4819-f715-a228-3b87b2a5a11c.png)

こちらもどうぞ：[Titanicコンペで機械学習入門](https://qiita.com/Kofuji/items/f5b5cb0ad44e8b811641)

<details><summary>サンプルコード</summary><div>
```python
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(max_depth=5,
                             min_samples_leaf=5,
                             random_state=0)
clf.fit(x_train,y_train) #学習
clf.score(x_test, y_test) #モデルの評価
```
</div></details>
<details><summary>ランダムフォレスト：サンプルコード</summary><div>

```python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
#GridSearchCVを使うと最適なパラメータがどれか、自動で探すことができる
param_grid = {'max_depth':[None, 5, 10, 20], #ノードの深さの制限値
              'n_estimators':[20, 50, 100]} #決定木の数
clf = GridSearchCV(estimator=RandomForestClassifier(random_state=0),
                   param_grid = param_grid,
                   scoring = 'accuracy',
                   cv = 5) #公差検証
clf.fit(x_train,y_train) #学習
clf.score(x_test, y_test) #モデルの評価
clf.best_params_ #最適なパラメータがどうだったか
```
</div></details>
<details><summary>勾配ブ―スティング：サンプルコード</summary><div>
```python
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV
#GridSearchCVを使うと最適なパラメータがどれか、自動で探すことができる
param_grid = {'max_depth':[None, 5, 10, 20], #ノードの深さの制限値
              'n_estimators':[20, 50, 100], #決定木の数
              'learning_rate':[0.01, 0.03, 0.05]} #決定木を作るときの学習率
clf = GridSearchCV(estimator=GradientBoostingClassifier(random_state=0),
                   param_grid = param_grid,
                   scoring = 'accuracy',
                   cv = 5 #公差検証
                   )
clf.fit(x_train,y_train) #学習
clf.score(x_test, y_test) #モデルの評価
clf.best_params_ #最適なパラメータがどうだったか
```
</div></details>

### その他のサンプルコード
<details><summary>モデルの評価</summary><div>
```python
#評価
import sklearn.metrics as sk
from  sklearn.metrics import confusion_matrix
y_pred = clf.predict(x_test)
confusion_matrix(y_true=y_test, y_pred=y_pred)
'正解率:{}'.format(sk.accuracy_score(y_true=y_test, y_pred=y_pred))
'適合率:{}'.format(sk.precision_score(y_true=y_test, y_pred=y_pred))
'再現率:{}'.format(sk.recall_score(y_true=y_test, y_pred=y_pred))
'F1スコア:{}'.format(sk.f1_score(y_true=y_test, y_pred=y_pred))
#モデルを使って予測を出力する
test   = preprocessing(test)
result = clf.predict(test)
result.to_csv('./submission.csv', encoding='UTF-8', header=True, index=True)
```
</div></details>

# 教師なし
## クラスタリング
### k-means
> <img widrh=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409578/e693db58-040b-9dbf-3042-facc18a0a6a4.gif">
>
> 引用：[K-means 法を D3.js でビジュアライズしてみた](http://tech.nitoyon.com/ja/blog/2013/11/07/k-means/)


参考：[k-meansの最適なクラスター数を調べる方法](https://qiita.com/deaikei/items/11a10fde5bb47a2cf2c2)

<details><summary>サンプルコード</summary><div>

```python
#最適なクラスターの数を見つける
#エルボー法
from sklearn.cluster import KMeans
wcss = []
for i in range(1,11):
    kmeans = KMeans(n_clusters=i,init='k-means++',random_state=0)
    kmeans.fit(x)
    wcss.append(kmeans.inertia_)
plt.plot(range(1,11),wcss)
plt.xlabel("number pf clusters")
plt.ylabel('WCSS')

#エルボー法でわかったクラス―数で学習
kmeans = KMeans(n_clusters=4, init='k-means++', random_state=0)
y_kmeans= kmeans.fit_predict(x)
plt.scatter(x[y_kmeans==0, 0], x[y_kmeans==0,1], s=100, color='red', label='cluster2')
plt.scatter(x[y_kmeans==1, 0], x[y_kmeans==1,1], s=100, color='blue', label='cluster2')
plt.scatter(x[y_kmeans==2, 0], x[y_kmeans==2,1], s=100, color='green', label='cluster3')
plt.scatter(x[y_kmeans==3, 0], x[y_kmeans==3,1], s=100, color='cyan', label='cluster4')
plt.scatter(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1], color='yellow', label="center") #重心
```
</div></details>


# 強化学習
(これから勉強します…)
# ディープラーニング
ニューラルネットワークの層を多層化し、特徴量を自動で判別する

# 次元削減
PCA
UMAP
t-SNE