質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2004閲覧

機械学習: 作成モデル適応時のオーバーサンプリングについて

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/02/03 09:09

編集2020/02/03 09:10

前提・実現したいこと

不均衡データのケースだったため、オーバーサンプリング分類モデルを生成しました。
その生成分類モデルを別データに使用する際、使用データにもオーバーサンプリングは実施すべきなのでしょうか?実施、未実施だと大きくスコアが異なります。

実現したいことは、「サービスの解約者の予測、解約予備軍を抽出しアプローチをすること」になります。

詳しい方、ご教授いただけましたら幸いです。
よろしくお願いいたします。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

その生成分類モデルを別データに使用する際、使用データにもオーバーサンプリングは実施すべきなのでしょうか?

「別データ・使用データ」というのはつまり性能評価に使うテストデータのことを考えているのでしょうか? だとすればクラス間のサンプル数不均衡で評価指標が変わるという問題に帰着します。

テストデータに擬似的に生成したデータが混ざると、その評価方法が妥当なのかどうかという余計な懸念を産んでしまいます。性能が現実より高く見積もられてしまうのでは、といった懸念ですね。

シンプルに説明が面倒くさくなるので、私ならやらないと思います。


評価指標を使う前には、以下のような手続きを踏みます。データ不均衡を気にする前に、まずはこれがちゃんとできているかを確認してください。

  • まず評価指標を適切に選ぶ

どれか目的にかなったものを選ばないといけません。適合率、再現率、F1のどれにフォーカスするのか。解約予備軍クラスかどうかの二値分類問題として評価指標を算出するのか。多クラスなのか(マクロ平均、マイクロ平均)。など、考えるべきことは多いでしょう。今回のような場合、無難なのは二値分類問題とみなしたときのF1でしょうか。

  • その評価指標を使う

同等のデータで、同等の方法で計算した評価指標同士は比較できます。逆に言うと、データを変えたり計算方法を変えたりした数字の優劣は気にしても意味がありません。要するに、モデル選択以外では評価指標はあまり役に立たないと割り切って、腹をくくることです。

で、どうやったにせよ、ほとんどの方法ではオーバーサンプリングするかどうかで結果は変わります。

投稿2020/02/03 18:12

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/04 00:27

hayataka2049さん ご回答いただきまして、誠にありがとうございます。 おっしゃられる通り、性能評価データについてです。 2019年11月度分でモデルを生成したもの(解約予備軍クラスの二値分類問題として※1ヶ月後に解約しているかどうか)を別の12月分に使用して、1ヶ月後の解約予備軍クラスかどうかを予測して評価指標を算出した結果です。(モデル生成時の評価指標の精度高) 評価指標は、再現率とF1にフォーカスしています。 今回の場合、解約しそうなユーザーにはある施策を行い、 (解約率の高いユーザーの解約を食い止め、継続してサービスを利用してもらうことが目的で あるユーザーを解約すると予測し、解約しなかった人を許容。(FPの許容) したがって今回のモデルは再現率を重視すべきかなと) hayataka2049さんでしたら、今回の場合 どのようなアプローチを考えられますか? bamboo-novaさんの意見も含め、並行して異常値検知の方法でも取り組んでいます。
hayataka2049

2020/02/04 00:44

「解約した」クラスに対して各評価指標を算出しているとします。 オーバーサンプリングしない素データで行った場合、適合率0.24, 再現率0.91という数字になっています。テストデータはクラス間不均衡も含めて現実のデータに近いセッティングだとすると、退会予備軍と判断されたユーザの1/4弱しか実際に退会予備軍ではないということがわかります。施策のコストによっては効率的に厳しいかもしれません。 という判断をするなら、F1で見たほうが良いことになります。無駄玉を許容するなら再現率でも大丈夫です。 また、この辺のことも加味すると現実のデータに近いセッティング(オーバーサンプリングなし)で評価したほうが、現実に使ったときの予測を立てるという観点からすれば意味のある数字にはなるでしょう。
hayataka2049

2020/02/04 00:48 編集

「再現率をとにかく上げたい」なら「解約した」クラスに分類されやすくするように調整します(究極的には全データ「解約した」に分類すれば再現率1)。「F1を気にする」なら、現状は再現率が高すぎて適合率が低すぎるので、「解約しなかった」クラスに分類されやすくするようにします。クラスの重みは大抵の機械学習手法で設定できますから、それを使ってください。 異常値検知として取り組む場合、教師あり異常値検知という枠組みになります。これは普通に機械学習でやるものなので、今のやり方でもぶっちゃけ良いかと。 あとは、使う手法どうこうより特徴量エンジニアリングで努力した方がよっぽど効くことも多く、何にせよデータありきなので人間が直感的に判断できないようなデータを機械学習でどうこうするのは無理という側面もあります。たとえば直近一ヶ月だけで判断していたなら過去数ヶ月分のデータを取り入れて使うようにするだけで0.1上がるとかもありえます。
退会済みユーザー

退会済みユーザー

2020/02/04 01:40

hayataka2049さん 早速詳細に、素晴らしいご説明いただきありがとうございます。 大変参考になります、 >この辺のことも加味すると現実のデータに近いセッティング(オーバーサンプリングなし)で評価したほ>うが、現実に使ったときの予測を立てるという観点からすれば意味のある数字にはなるでしょう。 →オーバーサンプリングしない方が現実的に意味がありますよね。 >「F1を気にする」なら、現状は再現率が高すぎて適合率が低すぎるので、「解約しなかった」クラスに分> 類されやすくするようにします。クラスの重みは大抵の機械学習手法で設定できますから、それを使って> ください。 →色々調べて見ます。やり方としては今の方法で精度を高めていく試行錯誤を繰り返すのが良さそうということですね
guest

0

「サービスの解約者の予測、解約予備軍を抽出しアプローチをすること」

この場合、個人的な意見ですが、オーバーサンプリングして分類問題で解決するよりも異常検知の枠組みで解析した方が良い気がします。異常検知の枠組みであれば正常データ(オーバーサンプリングしてないもの)から閾値を設定して検出できるので、不均衡データの対策を必要としないので良いのではないかと思います。

異常検知の方法としては、例えばですが簡単な定性分析方法として、(どんな特徴量があるのか分かりませんが)昨年と本年度の何らかのログ情報の比率を算出して、設定した閾値を超えたら(例えば、比率の平均+分散を上回るとか、何らかの値をうわま)異常として検出する等のような擬似的な方向点検出のアプローチで大まかな解析などができると思います。

どのような仕様を元にしてアプローチするかによってリリース実装などにおいて実現したいことが変わってくるので一概にこの方法が良いとは言えませんが、良かったら参考にしていただければと思います。

投稿2020/02/03 09:47

bamboo-nova

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/03 10:01

bamboo-nobaさん 素晴らしい回答ありがとうございます。 異常検知の枠組みを考えもしておりませんでしたので、非常に参考になります。 下記、記事での内容に近しいでしょうか? 見当違いでしたら、申し訳ございません、、 ご教授いただけますと幸いです https://qiita.com/Zepprix/items/f6a5de2e3f6689bd2c1f
bamboo-nova

2020/02/03 10:11

そうですね、ホテリングのT2法は統計的な分析手法で、異常検知としては古典的なものですね。 あとは、サンプル数が十分であれば正常データをMLPやSVRで学習して、異常データ込みでテストデータを検証して誤差をプロットして閾値を決め打ちするなどのやり方もあると思います(これもscikit-learnなどで簡単に実装できると思います。) いろんな方法があるので、できるものから試してみるのが良いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問