まさなみブログ

主にweb系開発の記事を適当に書いてます。

Pythonではじめる機械学習で機械学習を学習してみた  ~~第2章②~~


ニューラルネットワーク

・多層パーセプトロン(MLP)

from sklearn.neural_network import MLPClassifier
#散布図と決定境界の描画
mlp = MLPClassifier(solver='lbfgs', activation='tanh', max_iter=200, random_state=0, hidden_layer_sizes=[10, 10], alpha=0.1).fit(X_train, y_train)
mglearn.plots.plot_2d_separator(mlp, X_train, fill=True, alpha=.3)
mglearn.discrete_scatter(X_train[:, 0], X_train[:, 1], y_train)
#評価、予測
print(mlp.score(X_train, y_train))
print(mlp.score(X_test, y_test))
print(mlp.predict(Xtest))

参考:
10分でわかる深層学習のニューラルネットワーク - Qiita


・MLPClassifier()の引数について
solver : パラメータ学習アルゴリズム
activation : 活性化関数、デフォルトではrelu
hidden_layer_sizes : 隠れユニットの配列、配列の数が隠れ層の数となる。
alpha : 正則化(l2)パラメータ
max_iter : 学習繰り返し回数


・活性化関数について
pynote.hatenablog.com


・データ前処理
SVCと同様特徴量のサイズが異なる場合、同じくらいのスケールとなるようにそれぞれスケール変換する。


・solverについて
'adam'(Adaptive moment estimation):
期待値計算に指数移動平均を使う現在最も評価されている手法。
過去の学習によって更新されてこなかったパラメータを優先的に更新するようなアルゴリズムになっている。

'lbfgs'(limited memory BFGS):
準ニュートン法を省メモリにて実現した手法。
1000以下の小さいデータセットの場合に高パフォーマンスで、高速にトレーニングが可能。

'sgd'(Stochastic Gradient Descent : 確率的勾配降下法):
訓練データをランダムにシャッフルし、重みを更新する。
この手法は確率的に局所解にはまりにくくなるという長所や、オンライン学習で使いやすいという長所を持っている。


参考:
ニューラルネットワークのパラメータ設定方法(scikit-learnのMLPClassifier) | SPJ


・クラス分類器の不確実性推定、確率の予測

decision_function()メソッドを使うことで、クラス分類の振り分けを正負の値で表すことができる。scikit-learnのクラス分類器ほとんどがこれを有している。

クラス分類の確率の予測にはpredict_prob()が使われる。

gbrt = GradientBoostingClassifier(random_state=0)
gbrt.fit(X_train, y_train_named)
print(gbrt.decision_function(X_test))
print(gbrt.predict_prob(X_test))


・pd.astype(...)
カッコ内のデータ型にキャストするメソッド。
参考:

pandasのデータ型dtype一覧とastypeによる変換(キャスト) | note.nkmk.me


・np.argmax()
配列の最大値のインデックスを取得。



第二章完了。長かった。。なんとなく機械学習の特徴をつかめてきた気もするが、座学だけでは実感がわかない。
勉強と並行して実際に機械学習を実装しようと思う。