kokokocococo555
今回のコンペの途中、60位くらいから一気に6位まで順位が跳ね上がるという経験をしました。 順位上昇の一番のポイントはtrainデータの水増し戦略だったのかなと思います。 ※「水増し」と言えるのか微妙な気もしてきました。 間違いやさらに詳しい情報等ございましたらコメントください。
------<2020-12-22 追記>------ コメントにて本方法は「pseudo labeling」だと教えていただきました。ありがとうございました。 書籍『Kaggleで勝つデータ分析の技術』p.266にも掲載されていました。 頭のどこかにこの部分の内容だけちらっと残っていたのかもしれません。 ちゃんと知っていればこんなにいろいろ書かなくても「pseudo labelingが効きました」で終わりでした。 --------<追記終わり>--------
概要
具体的には以下の手順でtrainのスパムメールを水増ししました。
データを「濾過」しているようなイメージでしょうか。 1.~4.によって、trainデータでのスパム割合をtestデータでのスパム割合に近づけました (実運用場面ではテストデータでのスパム割合は分かっていないはずなので工夫が必要)。 この「濾過」を複数の閾値(0.7, 0.75, 0.8, ..., 0.95, 0.99)を設定して行いました。
しっかりとした検討はできていませんが、今回4位になれたのはこの水増し戦略がうまく効いたからかなと感じています。
ルール上、trainデータとtestデータで「スパム:非スパム」の割合が大きく異なることが分かっていました。 また、testデータでのスパムの割合も知らされていました。
最初はラベルの偏りへの対処ということで、普通にアンダーサンプリングしてLGBMで予測したりCNNで予測したりしていましたが、上位には遠く及びませんでした。 そもそもtrainデータでのスパムメールが少なすぎたため、アンダーサンプリングを行うと非スパムを大量に捨てることになります。それはもったいないと考えていました。 また、このままでは学習も汎化性能評価も難しいと感じていたため、trainデータのスパムメールを水増しすることを考えました。
画像データの水増し(augmentation)はよく耳にしますが、NLPでの水増し方法は知りませんでした。 そのため、最初はググって目についた「文中の単語を類似単語と入れ替える」方法を試してみました。 結果、この方法はうまくいきませんでした。 ※外部データを使わずに類似単語を持ってくる方法として 「fasttextの学習済み単語分散表現上での類似度の高い単語と入れ替える」 は良い案だと思ったのですが…。 ※この実験の際、同時に5FoldでのCVにコードを変えており、そのCVでの学習がうまくいっていませんでした。 したがって、類似単語との入れ替えの効果は不明なままです。要因を交絡させるとか初歩的で恥ずかしい…。
どうしたものかと悩んでいたとき、手元のモデルによるスパム判定のPrecisionが1.0なのが目を引きました。 これはつまり 「未知データに対して、スパムと判定したメールはすべて実際にスパム (含まれるスパムメールのうちどれだけ漏れなくスパムと判定できるかは置いておいて)」 である可能性が高いと期待されるモデルが手元にあるということかなと考えました。 このモデルでtestデータの予測を行えば、スパム予測確率が1に近いメールはほぼスパムと見て間違いないでしょう。 このほぼスパムなメールを抽出してtrainに加えることで、比較的保守的にデータの水増しができるはずです。
※この方法、NLPにおける水増し方法を調べている際(?)にちらっと見かけたような気もしますが、
当初は「予測を元にtestからtrainにデータを移すなんて、trainデータがおかしくなるのでは?正気か?!」
と感じており、まさか使うことになるとは思わずメモっていませんでした…悲しい…。
<2020-12-22 追記> 先述のとおり、「pseudo labeling」という手法です。
以下の点に鑑みても、抽出したメールがスパムである可能性は高いと踏んでいました。
実際、この水増しによって60位くらいから一気に6位まで跳ね上がりました。
ですので、以下は補足のようなものです。
本来はハイパラチューニングを行ったり、BERTを使用したりするべきでした。 ただ、今回は上述のスパム:非スパムの割合の非対称性への対処を優先+最後までそちらに注力してしまったため、手を回せませんでした。
スパムメール判定は機械学習やNLPの本を読んでいて一番はじめに目にすることの多い事例だと思います。 そのスパムメール判定を自分の手でやってみる機会を得られて興味深かった・楽しかったです。 ありがとうございました。
pop-ketle
いわゆるpesudo labelingってやつだと思います。(水増し手法)
確かに予測の精度が十分に高くて、かつ、不均衡なためデータが足りないのが問題とくれば、まず試すことが頭に浮かぶべき手法な気がします。言われてみるとその通りなのに、なぜコンペ中には気づけないのか、自分の勉強不足を強く感じました。 大変参考になりました。ありがとうございます。