名古屋出身ソフトウェアエンジニアのブログ

scikit-learn のロジスティック回帰モデルを自動微分できるよう PyTorch モジュール化

公開:
更新:

scikit-learn で学習したロジスティック回帰モデルに対して、勾配を利用した操作を行いたかったので、PyTorch へのインポートをやってみました。

まず、ロジスティック回帰モデルを nn.Module として再実装します。一般化線形モデルなので、コンパクトに実装できます。

class LogisticRegressionTorchModule(nn.Module):
    def __init__(self, input_size):
        super().__init__()
        self.linear = nn.Linear(input_size, 1)

    def forward(self, x):
        return torch.sigmoid(self.linear(x))

LogisticRegressionTorchModule インスタンスの全結合層に、LogisticRegression モデルの係数と切片を取り込みます。

lr: LogisticRegression = ...

weights = lr.coef_
bias = lr.intercept_
model = LogisticRegressionWithScalingTorchModule(lr.coef_.shape[1])
model.linear.weight = nn.Parameter(torch.tensor(weights, dtype=torch.float32))
model.linear.bias = nn.Parameter(torch.tensor(bias, dtype=torch.float32))

これで勾配を取得したり、他の PyTorch ネットワークと合わせて使ったりできます1


  1. パラメータを float32 精度に変換しているので、元のモデルによっては結果が厳密に一致しないかもです。 ↩︎