機械学習第6章
二値分類
問題の定義
アイリスデータセットを使用
今回は2種類の花のデータを利用
分類問題は正解値も予測値も0か1の値を取るため精度というわかりやすい基準値がある(正解件数/全体件数)
過学習の対策のため訓練データと検証データの分割を行う
訓練:検証 7:3 6:4にすることが多い
線形回帰のモデルの概念図と比較して異なるのは、シグモイド関数が加わったのみ
予測関数にシグモイド関数利用する
シグモイド関数
出力結果0から1の間の値になる
予測結果が1である確率とみなし、0.5より大きい場合予測結果が1、小さい場合0と解釈する
損失関数
交差エントロピー関数を使う
nn.BCELossというクラスを使用する
実装
1 データ準備
2 データ絞り込み
今回は多値ではなく二値にする
3 訓練データと検証データの分割する
分割には、scikit-learnのtrain_test_split関数を利用
code:pyton
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
x_data, y_data, train_size=70, test_size=30)
4 モデル定義
code:python
#入力次元数(今回は2)
n_input = x_train.shape1
#出力次元数
n_output = 1
#モデルの定義(2入力1出力のロジスティック回帰モデル)
class Net(nn.module):
def __init__(self, n_input, n_output):
super().__init__()
self.l1 = nn.Linear(n_input, n_output)
self.sigmoid = nn.Sigmoid()
#予測関数の定義
def forward(self, x):
#最初に入力値を線形関数にかけた結果を計算する
x1 = self.l1(x)
#計算結果にシグモイド関数をかける
x2 = self.sigmoid(x1)
return x2
5 最適化アルゴリズムと損失関数の定義
code:python
#損失関数 交差エントロピー関数
criterion = nn.BCELoss()
lr = 0.01
optimizer = optim.SGD(net.parameters(), lr=lr)
6 入力データと正解データのテンソル化と損失関数の引数となるデータのshapeを揃える
code:python
inputs = torch.tensor(x_train).float()
labels = torch.tensor(y_train).float()
labels1 = labels.view((-1,1))
inputs_test = torch.tensor(x_test).float()
labels_test = torch.tensor(y_test).float()
labels1_test = labels_test.view((-1,1))
7 繰り返し計算の初期化処理
code:python
lr = 0.01
#初期化
net = Net(n_input, n_output)
#損失関数
criterin = nn.BCELoss()
#最適化関数 勾配降下法
optimizer = optim.SGD(net.parameters(), lr=lr)
#繰り返し計算
num_epochs = 10000
8 繰り返し処理のメインループ
code:python
for epoch in range(num_epochs):
#(訓練フェーズ)
#勾配値初期化
optimizer.zero_grad()
#予測計算
outputs = net(inputs)
#損失関数
loss = criterion(outputs, labels1)
#勾配計算
loss.backward()
#パラメータ修正
optimizer.step()
#予測データ(1 or 0)計算
predicted = torch.where(outputs < 0.5, 0, 1)
#精度計算
train_acc = (predicted == labels1).sum() / len(y_train)
#予測フェーズ
#予測計算
outputs_test = net(inputs_test)
#損失計算
loss_test = criterion(outputs_test, labels1_test)
#予測データ(1 or 0)計算
predicted_test = torch.where(outputs_test < 0.5, 0, 1)
#精度計算
val_acc = (predicted_test == labels1_test).sum() / len(y_test)
BCELossを使ったが、BCEWithLogitsLossを使うとシグモイド関数を内包しているためモデル定義で省略できる
機械学習1章・2章
機械学習3章
機械学習 第4章
機械学習第5章 実践編