【Hands-on Machine Learning with Scikit-Learn, Keras & TensorFlowの勉強メモ】002 - 機械学習概要

##機械学習とは
>
機械学習は、**データを利用して**学習するプログラミング科学である。

##機械学習の流れ
>
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237795/58ee008c-df44-160e-585a-87935165167f.png)

##機械学習の種類
###１．人の介入有無によって分類###
####①教師あり学習####
>
**主なタスク**
　• 分類
　• 回帰
**アルゴリズム**
　• k-Nearest Neighbors 
　• Linear Regression
　• Logistic Regression
　• Support Vector Machines (SVMs)
　• Decision Trees and Random Forests
　• Neural networks
>

####②教師なし学習####
>**主なタスク**
　• クラスタリング
　• 可視化
　• 次元削減
　• 異常検知
　• 相関ルール学習
**アルゴリズム**
　• Clustering
　　- K-Means
　　- DBSCAN
　　- Hierarchical Cluster Analysis (HCA)
　• Anomaly detection and novelty detection
　　- One-class SVM
　　- Isolation Forest
　• Visualization and dimensionality reduction —Principal Component Analysis (PCA)
　　- Kernel PCA
　　- Locally-Linear Embedding (LLE)
　　- t-distributed Stochastic Neighbor Embedding (t-SNE)
　• Association rule learning
　　- Apriori
　　- Ecla
>

####③半教師あり学習####
####④強化学習####
###２．システム稼働中の学習有無によって分類###
####①バッチ学習####
　• 全量データが必要、時間・計算資源かかる
####②オンライン学習####
　• 増分データ対応可能、時間・計算資源かからない
###３．一般化の手法よって分類###
####①Instance-based learning####
　例えば、k-Nearest Neighbors
####②Model-based learning ####
　例えば、Linear Regression

```python:Scikit-Learn線形回帰の実装例
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn.linear_model

# データの準備
country_stats = pd.read_csv("xxx.csv",thousands=',',delimiter='\t',
 encoding='latin1', na_values="n/a")
X = np.c_[country_stats["GDP per capita"]]
y = np.c_[country_stats["Life satisfaction"]]

# データ可視化（非必須）
country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
plt.show()

# モデルの指定（ここだけ変更すれば、他モデルに切替可能）
model = sklearn.linear_model.LinearRegression()

# モデルの訓練
model.fit(X, y)

# 訓練済みのモデルを利用して、新しい入力値に対して結果を推測する
X_new = [[22587]] # 推測対象の入力値
print(model.predict(X_new)) # 推測値の出力

```
##機械学習のポイント
>
　• アルゴリズム　⇒　適切
　• データ　⇒　高質で代表的なデータの量が十分であること
　　データ量が少ない場合、サンプリングノイズが発生する。
　　データ量が多い場合でも、サンプリング方法が不適切な場合、サンプリングバイアスが発生する。
　　【原文】
　　It is crucial to use a training set that is representative of the cases you want to generalize to. This is often harder than it sounds: if the sample is too small, you will have
sampling noise (i.e., nonrepresentative data as a result of chance), but even very large
samples can be nonrepresentative if the sampling method is flawed. This is called
sampling bias

##データの品質が低い場合の対処
>
　•インスタンスが極端値の場合の選択肢
　　- 当インスタンスを採用しない
　　- 手動で極端値を直す
　•インスタンスに特徴属性のデータが記入されない場合の選択肢
　　- 当属性を採用しない
　　- 当インスタンスを採用しない
　　- 当属性にデータを（平均値など）補足する
　　- 当属性を含む、含まないモデルをそれぞれ訓練する

##過学習
>モデルが訓練データに対してうまく学習されているが、未知データに対しては適合（汎化）できていない状態である。
　【対処】
　　①訓練データの特徴を減少することで、パラメータが少ない、簡単なモデルを利用する
　　②訓練データをもっと収集する
　　③訓練データのノイズを減少する
　　※正則化
　　　モデルを簡単化して、過学習のリスクを軽減する。

##未学習
>
モデルが訓練データにもテストデータにも適合していない、全然ダメな状態である。
　【対処】
　　①もっとパラメーターが多い、強いモデルを利用する
　　②特徴エンジニアリング
　　③モデルの制限を減少する （例えば、正則化のハイパーパラメータを減少する）

##ハイパーパラメータ
>
（モデルのではなく）学習アルゴリズムのパラメーター（事前設定の常数）の一つである。正則化のハイパーパラメータに非常に大きい値を設定した場合、モデルが平坦（傾きが0に近い）になる。学習アルゴリズムがほぼ過学習にならないが、良いソリューションでもない。ハイパーパラメータの最適化は、機械学習システムの構築に重要な部分である。

##Hold-out法と交差検証
>
一般的に、データの80%を訓練データにして、残り20%をテストデータにする。
ただし、データの母数が非常に多い（例えば、１憶件）場合は、1%（10万件）でも十分である。

##モデルの選択
>データセットに対して一番良いモデルがどれか分からないので、複数のモデルを作って計算してみる必要がある。
ただし、簡単タスクの場合は線形回帰を利用し、複雑の場合はニューラルネットワークを利用することが考えられる。