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