はじめに
データが非常に多いときに、サブサンプリングしてデータを少なくしてから機械学習して、確率を予測したいときがあります。
たとえば「広告に対するユーザのアクション(クリックやコンバージョン)」データのように、正例(アクションあり)は普通に扱える量なのに対して、負例(アクションなし)データは膨大だったりします。
こういうとき、負例を100分の1とかにして学習できたら楽ですよね。
この場合、大きく二つの方法があり得るかと思います。
- (サブサンプリングした)負例の重みを100倍にして重み付き学習する。
- 重みなしで学習して、求まった確率を「元のデータでの確率」に戻す。
バッチ学習なら単に重み付き学習すれば良いのですが、オンライン学習では**「負例が来たぞ! 100回更新!」**などと更新するのは悪影響がありそうで、2の方法を学んでおくのも役に立つかと思います。
本稿では、2の場合に「元のデータでの確率」の予測値にどのように戻すのか、について書きます。
一般の機械学習手法に対する方法
ここでは機械学習手法は問わずに任意の機械学習手法で、「元のデータでの確率」に戻す方法について考えます。
負例を$1/r$にサブサンプリングして学習した確率予測器の出力値$q(\boldsymbol{x})$を、元のデータでの確率の予測値$p(\boldsymbol{x})$に変換する方法です。
確率は
\begin{align}
\frac{正例の生起確率}{正例の生起確率+負例の生起確率}
\end{align}
であり
\begin{align}
q(\boldsymbol{x})
&= \frac{q(\boldsymbol{x})}{q(\boldsymbol{x}) + (1-q(\boldsymbol{x}))}
\end{align}
です。
このとき、負例を$1/r$にサブサンプリングして学習した$q(\boldsymbol{x})$を、元のデータでの確率の予測値$p(\boldsymbol{x})$に戻すには「負例の生起確率」に対応する分母の$(1-q(\boldsymbol{x}))$を逆に$r$倍してやればよいですね。
\begin{align}
p(\boldsymbol{x})
&= \frac{q(\boldsymbol{x})}{q(\boldsymbol{x}) + r(1-q(\boldsymbol{x}))} \\
\end{align}
ロジスティック回帰に対する方法
ロジスティック回帰でも、上記のように換算してももちろん「元のデータでの確率」は求まります。
ですが、上記の方法だと元のデータで学習したモデルは得られず、サブサンプリングデータに対する確率予測器の出力はあくまで$q(\boldsymbol{x})$で、これを$p(\boldsymbol{x})$に変換する、というものでした。
ロジスティック回帰を用いる際には係数に興味があることも多いので、出力がダイレクトに$p(\boldsymbol{x})$になるロジスティック回帰の係数が欲しい、ということもあるかと思います。
そしてなんとロジスティック回帰の場合には、重み付き学習をするのでなく、このように$q(\boldsymbol{x})$を出力するモデルを改造して$p(\boldsymbol{x})$を出力するモデルにできます!
\begin{align}
q(\boldsymbol{x}) = \frac{1}{1 + \exp\big( -(b + \boldsymbol{w}^T \boldsymbol{x}) \big)}
\end{align}
とすると、
\begin{align}
\ln \frac{q(\boldsymbol{x})}{(1-q(\boldsymbol{x}))}
= b + \boldsymbol{w}^T \boldsymbol{x}
\end{align}
です。
求めたい$p(\boldsymbol{x})$のロジットは、このロジットの分母$(1-q(\boldsymbol{x}))$を$r$倍したものですね。
\begin{align}
\ln \frac{p(\boldsymbol{x})}{(1-p(\boldsymbol{x}))}
&= \ln \frac{q(\boldsymbol{x})}{r(1-q(\boldsymbol{x}))} \\
&= \ln \frac{1}{r} + \ln \frac{q(\boldsymbol{x})}{(1-q(\boldsymbol{x}))} \\
&= - \ln r + b + \boldsymbol{w}^T \boldsymbol{x}
\end{align}
すなわち、サブサンプリングデータで学習したロジスティック回帰のバイアス項$b$から$\ln r$を引くだけです!
\begin{align}
p(\boldsymbol{x}) = \frac{1}{1 + \exp\big( -(b - \ln r + \boldsymbol{w}^T \boldsymbol{x}) \big)}
\end{align}
[1] の4.7でも同じ結果は導かれているのですが、個人的には上記の導出のほうがわかりやすいのではないかと思います。
以上、本稿では、サブサンプリングデータで学習して「元のデータでの確率」の予測値を得る方法について書きました!
[1] Chapelle, Olivier, Eren Manavoglu, and Romer Rosales. Simple and scalable response prediction for display advertising. ACM Transactions on Intelligent Systems and Technology (TIST), 2015, 5.4: 61, 2015