機械学習は、以下の要因により急速に近年多くの企業において活用されている。
Big Data(ビッグデータ)
GPU acceleration
New techniques
Open framework (scikit-learn)
教師あり学習
教師あり学習とは、訓練データに対し、正解データがついている。
例えば、データの分類、回帰によく使われる
ー>分類
ー>回帰
代表的な教師あり学習アルゴリズム
KNN(K nearest neighbor; k近傍法)
ー>Python scikit-learnによるk-NNの実装を使用すると便利です。
#1 訓練データとテストデータを分ける
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test =train_test_split(iris.data,iris.target, test_size=0.3, random_state=0)
#KNNモデル作成
from sklearn.neighbors import KNeighborsClassifierClassifier
model = KNeighborClassifier(n_neighbors=1)
#学習
model.fit(X_train, y_test)
#テストデータの予測
y_pred = model.predict(X_test)
線形回帰
#データの準備
-scikit-learnによる線形回帰の実装
%matplotlib inline
import sklearn.datasets as datasets
import mathplotlib.pyplot as plt
X,y = dataset.make_regression(n_samples = 50, n_features = 1, noise=20, randam_state=1)
plt.plot(X, y,’o’) #oは小さい円でデータを表示することを指定
plt.show()
#線形回帰
from sklearn.model_selection import_test_split
from sklearn.linear_model import LinearRegression
X_train, X_test,y_train,y_test = train_test_split(X, y, random_state=2)
y_pred =model.predict(X_test)
#グラフの表示
import numpy as np
lx = np.linspace(-2,2)
ly = model.coef_*lx + model.intercept_
plt.plot(X_train, y_train, ‘o’)
plt.plot(X_test, y_test,’x’), markersize=10)
plt.plot(X_test, y_pred,’*’), markersize=10)
plt.show()
教師あり学習の問題点は、以下の2つの状態があります。
適合不足:
訓練データに対しても予測精度が低い状態
過学習:
訓練データによくフィットしているがテストデータ(道のデータ)に
対する精度が低い状態
また、特徴量の数が多いほど過学習に陥りやすくなる。
交差検証(Cross Validation)
パラメーターの調整と評価方法として、交差検証(Cross Validation)を活用する
例えば、あるデータを単純に訓練データとテストデータに分割して検証するのではなく、
データを複数に分割して、その分割した1部をテストデータ、残りを訓練データとして
検証するこの作業を分割数分だけ実行して精度を標準化する。
#交差検証の実施方法
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, x, y, cv=10, scoring=’accuracy’)
print(scores)
print(scores.means())
決定木(可視化による理解がしやすい)
#scikit-learnによる決定木の実装(irisデータを使用)
iris= datasets.load_iris()
X = iris.data
y=iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=27)
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(random_state=27)
model.fit(X_train, y_train)
print(model.score(X_train, y_train))
print(model.score(X_test, y_test))
ここで以下のように、モデルにパラメータを加えるとテストデータに対する精度の向上が確認された。
model = DecisionTreeClassifier(max_depth=3, random_state=27)
その他の手法:
SVM(Support Vector Machine; サポートベクタマシン)
ニューラルネットワーク(深層学習を含む)
教師なし学習
教師なし学習とは、訓練データに対し、正解はついていない。
例えば、データのクラスタリングによく使われる
ー>クラスタリング
手法例:
k-means(k-平均法)
データをk子のクラスタに分割する
アルゴリズム
1.データドメイン内で適当にk個の平均を選択
2.各データ点を、最も近い平均に基づきk個に分割
3.k個のクラスタの重心を算出し、新たな平均とする
4.上記の1から3をクラスが変わらなくなるまで繰り返す
その他の手法:
ー>アソシエーションルール分析
ー>異常検知
半教師あり学習
ー>教師なしデータを含む教師あり学習
ー>教師ありデータによる制約・拡張のある教師なし学習
強化学習
強化学習の特徴は、
行動の良し悪しが学習対象である。
将来にわたっての報酬を最大化するような最適方策を学習する。
探索と利用のトレードオフが存在する。
環境が変化する場合や報酬が非決定的である場合に有効である。
例えば、代表的な2つの手法:
->TD法(Temporal-Difference Learning)について、
シミュレーションや経験から学習する。報酬が得られるのを待つことなく、
学習中の他の状態における価値(の推測結果)を基に、対象の状態における価値を更新する。
隣接する状態の価値関数を利用して、価値関数を更新する。
代表的なTD法は、Q-learning(方策を考慮せず最適パスを学習する方法),
Sarsa(方策を考慮した上で最適な行動を学習する方法)である。
->モンテカルロ法では、
ある状態からスタートして、エピソード終了までランダムに行動し学習する。
学習後は、最も累積報酬の期待値が高い行動を取る。
エピソード終了時に得られる報酬にも基づいて価値関数を更新する。
一般的な機械学習では、入力データの標準化とは、入力データを平均0、分散1に変換することである。
例えば、ハイパーパラメータのチューニング方法としてのグリッドサーチでは、
各ハイパーパラメータの値候補を指定し、全組み合わせを試し、良い組み合わせを得る手法である。
また、遺伝的アルゴリズム(GA)は、ハイパーパラメータの組み合わせで遺伝子を作り、
交叉と突然変異を繰り返して、良い組み合わせを得る手法である。
モデルの最適化
データから学習した結果得られる関数をfとすると、ある入力値xに対する誤差というものが計算されます。
fのBiasとfのVarianceは、トレードオフといわれ、得られる関数による予測値の期待値と
目標とする関数による予測値との差がBiasといいます。
一方、得られる関数による予測値と 得られる関数による予測値の期待値の差の期待値をVarianceといいます。
目指すのは、VarianceもBiasも小さい状態です。
逆に、一番駄目なのが どっちも外れているという状態です。
例えばVarianceが大きいけれどもBiasが小さい
平均すると大体合っていますけれども誤差が多いという状態が
Varianceが大きくてBiasが小さい
逆にぶれないのですが、そもそも中心がずれているというのが
Biasが大きくてVarianceが小さいという状態です
このように互いにトレードオフが発生しています。
つまり、複雑さを制限するとどうなるかというと
複雑さを制限するとBiasは大きくなる。
悪くなるとモデルをシンプルにすると表現力が落ちるので
そもそもの正解から遠ざかり、Varianceが狭まるのであまりぶれなくなる。
従って、このトレードオフを採用すれば、もともとの複雑さで表現すると
平均的には近いが誤差が大きくなりすぎるが、複雑を制限した結果
平均的にはもともとのモデルよりも精度が高くなることが期待されます。
結論として、モデルの最適化は、訓練データとテストデータの両方の予測精度を上げることではなく、
テストデータ(未知のデータ)に対する予測精度を上げることが重要です。


コメント