scikit-learnで標準化,正規化

標準化の式
f:id:kobakenkken:20170803184555p:plain
{ \displaystyle
μ:平均   ,σ:標準偏差
}
正規化の式
f:id:kobakenkken:20170803184552p:plain
{ \displaystyle
x_{max}:最大値   ,x_{min}:最小値
}

scikit-learn で

sklearn の StandardScaler と MinMaxScaler がそれぞれ 標準化 と 正規化 のモジュールです。主に使うメソッドは次の 3 つです。

fit
パラメータ(平均や標準偏差 etc)計算
transform
パラメータをもとにデータ変換
fit_transform
パラメータ計算とデータ変換をまとめて実行

赤:original data
青:標準化データ(standard)
緑:正規化データ(normalized)
f:id:kobakenkken:20170803185633p:plain



code

# coding:utf-8
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
 
# 元データ
np.random.seed(seed=1)
data = np.random.multivariate_normal( [7, 5],  [[5, 0],[0, 2]],  100 )
 
# 標準化
sc = StandardScaler()
data_std = sc.fit_transform(data)
 
# 正規化
ms = MinMaxScaler()
data_norm = ms.fit_transform(data)
 
# プロット
min_x = min(data[:,0])
max_x = max(data[:,0])
 
min_y = min(data[:,1])
max_y = max(data[:,1])
 
plt.figure(figsize=(5, 6))
plt.subplot(2,1,1)
plt.title('StandardScaler')
plt.xlim([-4, 10])
plt.ylim([-4, 10])
plt.scatter(data[:, 0], data[:, 1], c='red', marker='x', s=30, label='origin')
plt.scatter(data_std[:, 0], data_std[:, 1], c='blue', marker='x', s=30, label='standard ')
plt.legend(loc='upper left')
plt.hlines(0,xmin=-4, xmax=10, colors='#888888', linestyles='dotted')
plt.vlines(0,ymin=-4, ymax=10, colors='#888888', linestyles='dotted')
 
plt.subplot(2,1,2)
plt.title('MinMaxScaler')
plt.xlim([-4, 10])
plt.ylim([-4, 10])
plt.scatter(data[:, 0], data[:, 1], c='red', marker='x', s=30, label='origin')
plt.scatter(data_norm[:, 0], data_norm[:, 1], c='green', marker='x', s=30, label='normalize')
plt.legend(loc='upper left')
plt.hlines(0,xmin=-4, xmax=10, colors='#888888', linestyles='dotted')
plt.vlines(0,ymin=-4, ymax=10, colors='#888888', linestyles='dotted')
plt.show()

keras モデル構築 学習

#ケース1
data = np.random.random((1000, 100))
labels = np.random.randint(10, size=(1000, 1))
# ラベルデータをカテゴリの1-hotベクトルにエンコードする

one_hot_labels = keras.utils.to_categorical(labels, num_classes=10)

# 各イテレーションのバッチサイズを32で学習を行なう
model.fit(data, one_hot_labels, epochs=10, batch_size=32)


#ケース2
# Pima indians datasetをロード
    dataset = np.loadtxt(os.path.join("..", "data", "pima-indians-diabetes.data"), delimiter=',')

    # データとラベルを取得
    X = dataset[:, 0:8]
    Y = dataset[:, 8]

model.fit(X, Y, nb_epoch=150, batch_size=10)


#ケース3
x_train = np.random.random((1000, 20))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10)

model.fit(x_train, y_train,
          epochs=20,
          batch_size=128)

keras モデル構築 コンパイル記述

モデルの学習を始める前に,compileメソッドを用いどのような学習処理を行なうかを設定する必要があります.compileメソッドは3つの引数を取ります:

  • 最適化アルゴリズム: 引数として,定義されている最適化手法の識別子を文字列として与える(rmspropやadagradなど),もしくは Optimizerクラスのインスタンスを与えることができます. 参考: 最適化
  • 損失関数: モデルが最小化しようとする目的関数です.引数として,定義されている損失関数の識別子を文字列として与える(categorical_crossentropyやmseなど),もしくは目的関数を関数として与えることができます.参考:損失関数
  • 評価関数のリスト: 分類問題では精度としてmetrics=['accuracy']を指定したくなるでしょう.引数として,定義されている評価関数の識別子を文字列として与える,もしくは自分で定義した関数を関数として与えることができます.
# マルチクラス分類問題の場合
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 2値分類問題の場合
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 平均二乗誤差を最小化する回帰問題の場合
model.compile(optimizer='rmsprop',
              loss='mse')

# 独自定義の評価関数を定義
import keras.backend as K

def mean_pred(y_true, y_pred):
    return K.mean(y_pred)

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy', mean_pred])

keras モデル構築 Sequentialモデルでの構築

Sequentialモデルでの構築

#.addで組む際はこのやり方
model = Sequential()
model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))

#input_dim それぞれの入力blobのdim、各blobはnum, channels, height, widthの4つの次元を持つ。
  • initで層の重みの初期化方法を指定できる
  • uniformだと0~0.05の一様乱数。normalだと正規乱数。Deep Learning Tutorialの初期値重みで使われていたglorot_uniformもある層の活性化関数は、独立した層ではなくDenseのactivation引数でも指定できる
  • 隠れ層の活性化関数にはrelu、出力層の活性化関数にはsigmoidを指定
  • 出力層にsigmoidを使うと0.0から1.0の値が出力されるため入力データのクラスが1である確率とみなせる。0.5を閾値として0.5未満ならクラス0、0.5以上ならクラス1として分類する.

他に例えば
入力層784次元、中間層1024次元、出力層10次元のニューラルネットワークの構築は

model = Sequntial()
model.add(Dense(1024, input_dim=784))
model.add(Activation('sigmoid'))
model.add(Dense(10))
model.add(Activation('softmax'))

モデル:例2

model = Sequential(
model.add(Dense(512, input_shape=(784,)))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(10))
model.add(Activation('softmax'))
return model

f:id:kobakenkken:20170724141139p:plain


KerasのConvolution2Dを使う時にborder_modeという引数があり、'valid'と'same'が選択できるのですが、これが何なのかを調べるとStackExchangeに書いてありました(convnet - border_mode for convolutional layers in keras - Data Science Stack Exchange)。

‘valid’
出力画像は入力画像よりもサイズが小さくなる。
f:id:ni4muraano:20170129144610j:plain

‘same’
ゼロパディングすることで、出力画像は入力画像と同じサイズになる。
f:id:ni4muraano:20170129145937j:plain

ゼロパディングすることのメリットについてはここ(定番のConvolutional Neural Networkをゼロから理解する - DeepAge)に書いてあります。

端のデータに対する畳み込み回数が増えるので端の特徴も考慮されるようになる
畳み込み演算の回数が増えるのでパラメーターの更新が多く実行される
カーネルのサイズや、層の数を調整できる

chainerRLを動かす

 

OpenAI Gym

https://gym.openai.com/docs

インストー

git clone https://github.com/openai/gym.git
cd gym
pip install -e .

 

 

ubuntuの場合

apt-get install -y python-numpy python-dev cmake zlib1g-dev libjpeg-dev xvfb libav-tools xorg-dev python-opengl libboost-all-dev libsdl2-dev swig

Supported systems

brew install boost-python --with-python

ランダムアクションで実行してみる

import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
    env.render()
    env.step(env.action_space.sample()) # take a random action

chainerrl

インストー

git clone https://github.com/pfnet/chainerrl.git
cd chainerrl
sudo python3 setup.py install cd examples/gym

DQNを動かして見る

python train_dqn_gym.py --gpu -1 --monitor

 

ChainerrlでDQNを動かして見た。CartPole-v0 - Qiita