Logistic Regression(論理回帰)


Logistic Regressionとは?
一般化線形モデル(Generalized Linear Model)の一種で、独立変数の線形結合を利用してイベント発生の可能性を予測する確率モデルである.

  • 論理回帰モデルの作成方法について


    複数の変数xの行列から,dサイズを有するm個のサンプルデータと重み行列の積をsigmoid関数により0と1でバイナリ分類するモデルを生成する.
    このとき損失関数は以下のようになります.


  • Pythonで実施



  • 勉強する



  • 庫:トーチ、トーチ.nn, torch.nn.functional, torch.optim
    DataSet:以前と同様に、torch.FloatTensor()を使用してデータ値を格納します.データが大きい場合はmini-batchでデータセットを分類できます.
    signoid関数の作成:torch.exp()を使用して、次のsignoid関数の指数計算、直接関数の実装、またはtorch.Sigmoid関数を使用して、数式に指数の演算値を直接代入できます.
    nn.module: nn.継承モジュールは、クラスで線形関数とSigmoid関数を定義し、オブジェクトとして学習できるようにします.

    損失関数:torch.nn.functionalのF.binary_cross_entropy()関数を用いてCost関数を簡単に計算できる.

  • 評価


    predictive:少数の値を1に近い値を1、0に近い値を0とする予測値
    Correct prediction:実際のトレーニングの値と同じかどうかを確認し、真/偽の値を返します.この値の平均値から精度を算出する.
  • コード
  • import torch
    import torch.nn as nn
    import torch.nn.functional as F
    import torch.optim as optim
    
    # For reproducibility
    torch.manual_seed(1)
    
    x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]]
    y_data = [[0], [0], [0], [1], [1], [1]]
    
    x_train = torch.FloatTensor(x_data)
    y_train = torch.FloatTensor(y_data)
    
    class BinaryClassifier(nn.Module):
        def __init__(self):
            super().__init__()
            self.linear = nn.Linear(8, 1)
            self.sigmoid = nn.Sigmoid()
    
        def forward(self, x):
            return self.sigmoid(self.linear(x))
            
    model = BinaryClassifier()
    
    # optimizer 설정
    optimizer = optim.SGD(model.parameters(), lr=1)
    
    nb_epochs = 100
    for epoch in range(nb_epochs + 1):
    
        # H(x) 계산
        hypothesis = model(x_train)
    
        # cost 계산
        cost = F.binary_cross_entropy(hypothesis, y_train)
    
        # cost로 H(x) 개선
        optimizer.zero_grad()
        cost.backward()
        optimizer.step()
        
        # 20번마다 로그 출력
        if epoch % 10 == 0:
            prediction = hypothesis >= torch.FloatTensor([0.5])
            correct_prediction = prediction.float() == y_train
            accuracy = correct_prediction.sum().item() / len(correct_prediction)
            print('Epoch {:4d}/{} Cost: {:.6f} Accuracy {:2.2f}%'.format(
                epoch, nb_epochs, cost.item(), accuracy * 100,
            ))