この記事では、Pythonと機械学習ライブラリ「scikit-learn」によるニューラルネットワーク(多層パーセプトロン・MLP)の使い方についてまとめました。
ニューラルネットワークとは
ニューラルネットワーク (Neural network)とは、人の脳内にある神経回路を参考にした学習モデルです。
– | 関連記事 |
---|---|
原理の詳細 | ニューラルネットワークの原理 |
機械学習ライブラリ「Scikit-learn」では、バージョン0.18.0からニューラルネットワーク(NN)を利用できるようになりました。
今回は、それを用いてCSVファイルのデータを読み込んで学習させてみました。
書式
scikit-learnでは、sklearn.neural_network.MLPClassifierクラスを使うことでニューラルネットワーク(NN)を実装できます。
このクラスは、ニューラルネットワークでよく利用されている多層パーセプトロン(MLP)方式です。
書式
sklearn.neural_network.MLPClassifier(hidden_layer_sizes=(100, ), activation='relu', solver='adam', alpha=0.0001, batch_size='auto', learning_rate='constant', learning_rate_init=0.001, power_t=0.5, max_iter=200, shuffle=True, random_state=None, tol=0.0001, verbose=False, warm_start=False, momentum=0.9, nesterovs_momentum=True, early_stopping=False, validation_fraction=0.1, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
※各パラメータに設定されてる値(=の後)はデフォルト値
パラメータ(引数) | 内容 |
---|---|
hidden_layer_sizes=(100, ) | 隠れ層のノード数(多層化可能) |
activation=’relu’ | 活性化関数(identify, logistic, tanh, relu) |
solver=’adam’ | 最適化手法(lbfgs, sgd, adam) |
alpha | L2ペナルティ(正則化の項) |
batch_size=’auto’ | 最適化のバッチサイズ(sgd、adam用) |
learning_rate | 重み更新のための学習率スケジュール(’定数’、 ‘invscaling’、 ‘adaptive’) |
max_iter=200 | 反復の最大回数 |
shuffle | 反復する度にサンプルをシャッフルするか(solverが’sgd’か’adam’の時に使用) |
random_state | 乱数生成の状態 or シード(int、RandomState) |
tol | 最適化の許容誤差 |
power_t | スケーリング学習率の指数 |
verbose | 進捗メッセージを標準出力するかどうか |
warm_start | 以前の呼び出しの解を再利用して初期化するかどうか |
momentum | 勾配降下更新のモメンタム |
nesterovs_momentum | 訓練データの10%が妥当性検査として自動設定され、2つの連続したエポックで少なくとも妥当性スコアが改善していない場合は訓練終了(solver = ‘sgd’または ‘adam’で有効) |
early_stopping | 検証スコアが改善されていないとき訓練中止のために早期停止を使用するかどうか |
validation_fractionv | 早期停止のための妥当性確認として設定される訓練データの割合 |
beta_1 | adamの第1モーメントベクトルの推定値に対する指数関数的減衰率 |
beta_2 | adamの第2モーメントベクトルの推定値に対する指数関数的減衰率 |
epsilon | adamの数値安定性の値(solver = ‘adam’で使用) |
※他の方式は以下のクラスに実装されているそうです。
sklearn.neural_network.BernoulliRBM sklearn.neural_network.MLPRegressor
ソースコード
サンプルプログラムのソースコードは下記の通りです。
# -*- coding: utf-8 -*- import pandas as pd import numpy as np from sklearn.neural_network import MLPClassifier from sklearn.externals import joblib def main(): # 学習用のデータを読み込み data = pd.read_csv("train.csv", sep=",") # 説明変数:x1, x2 X = data.loc[:, ['x1', 'x2']].as_matrix() # 目的変数:x3 y = data['x3'].as_matrix() # 学習 clf = MLPClassifier(solver="sgd",random_state=0,max_iter=10000) clf.fit(X, y) # テスト用データの読み込み data = pd.read_csv("test.csv", sep=",") # 学習結果の検証(テスト用データx1, x2を入力) X_test = data.loc[:, ['x1', 'x2']].as_matrix() y_predict = clf.predict(X_test) # 検証結果の表示 print("検証結果:", y_predict) # 学習結果を出力 joblib.dump(clf, 'train.learn') if __name__ == "__main__": main()
学習用データ
train.csv
"x1","x2","x3" 3,2,0 1,2,0 5,6,1 6,7,1 5,5,1 4,5,0 3,6,0 8,0,0 9,6,1 6,2,0 7,8,1
x1とx2の和が1以上・・・x3は1
x1とx2の和が1未満・・・x3は0
テスト用データ
"x1","x2" 4,2 6,7 8,5 3,3
実行結果
サンプルプログラムの実行結果です。
検証結果: [0 1 1 0]
検証結果をみると、「x1とx2の和が1以上・・・x3は1、x1とx2の和が1未満・・・x3は0」と判別していることがわかります。
– | 関連記事 |
---|---|
1 | Scikit-learn入門・使い方 |
2 | Scikit-learnをインストールする方法 |
3 | Python入門 基本文法 |
コメント