ユーザーセグメントデータをSageMakerでロジスティック回帰する(第2回)

2019.03.28

こんにちは、データソリューション・ディビジョンの笹沼です。

第1回は「問題を定式化する」と機械学習の結果をご紹介しました。第2回は「前処理をする」と「学習・パラメータチューニング」になります。

 

6.前処理

元データをそのまま使用するとデータ量が膨大であるため、抽出した約5万件のユーザーデータを使用します。また、例にもれず、生データでは学習に使えないため、データの変換を実施しています。

 

データ変換処理

以降の学習工程ではデータをPythonのpandasを使ったDataFrame型にする必要があり、上記のデータ変換後の形式に変換しています。ラベルが目的変数、セグメント番号が説明変数になります。今回のデータでは、およそ5万×2千の行列になりました。

 

変換処理は下記を実施しました。

・1ユーザのセグメント数は可変であるため、ユーザが保持しているセグメントを1、保持していないセグメントを0で表現したスパース行列に変換

・推定したいセグメントをラベルに変更

 

普段なら、Pythonのpandasモジュールのread_csv関数でcsvファイルを読み込みますが、可変長のcsvファイルなので、read_csvではエラーになってしまいます。そのため、一旦カンマ区切りのファイルとしてリストに取り込みます。

セグメントのユニークを求めます。

固定長のスパース行列を作成します。ここももっといい書き方がありそうです。

あとは、DataFrameに変換する際にラベル列を追加し、目的変数にしたいセグメントがあれば1、なければ0を各ユーザのラベルに追加します。その際に、ラベルを1にしたときは説明変数内の目的変数に設定したセグメントIDを削除します。

上記以外には、データの抽出基準をどうするかなど選定しました。ランダムなのか、頻出頻度が高いのか低いのかなどです。機械学習では、使えるデータをなるべく残すという考え方なので、頻出頻度が高いセグメントを持つユーザを残すように抽出しました。

 

7.学習

最初はオンプレでscikit-learnで頑張っていました。苦労したことの話です。

 

まず、モデルの選定です。最初はモデル選定基準がよくわからず、KNNを採用していました。アルゴリズムが簡単だったためです。KNNはオフライン学習です。そのため、データ量が多いのでよくメモリエラーになりました。そこでメモリに乗るようにデータ量を削減していくのですが、そうすると学習するデータが減るので、学習結果が悪くなります。このジレンマに悩みました。この段階でKNNが今回のユーザーセグメントデータの学習には向いてないと判断できず、主成分分析などを駆使して次元圧縮して学習させていましたが、結果は良くなかったです。このあと、バッチ学習の存在を知り解決しました。

 

次に、モデルの検証です。機械学習の結果は正解率、適合率、再現率、F値などを基準にモデルの精度を検証しなければいけません。取り組みの初期のほうでは、このうち正解率のみを見てモデルの良し悪しを判断していました。初歩的なことですが、初心者としては、正解率が90%と出たときは嬉しかったです。後になって、他の指標を算出してみると全然だめ(正解率以外50%くらい)ということがわかり、前の工程から見直しを行いました。

 

上記のようなバッドノウハウを蓄えつつ、クラウドサービスで機械学習の環境が整備されているという話を聞き、AWSに移行しました。

選定の方法はPythonのオープンソース機械学習ライブラリであるscikit-learnのフローチャートを参考にしています。※1

学習モデルにはAmazon SageMaker Built-in Algorithmsのlinear_learnerを使用しました。※2

 

モデル学習のコードは一から作成せず、linear_learnerのサンプルを参考に作成しました。※3

こういった丁寧なサンプルがあることは、AWSを使う理由になるかと思います。

 

モデル作成部分でlinear_learnerのサンプルから修正した点は2点です。一つ目は、train_instance_countを8に修正しています。パラメータを指定するだけで並列化でき、使いやすかったです。二つ目は、feature_dimです。チュートリアルでは、MNISTなので、feature_dimが固定ですが、入力データによって可変になるため、入力データのセグメント数に修正しています。

 

今回のパラメータ

linear_learnerはバッチ学習であるため、mini_batch_sizeで指定することで、データを分割して学習するので、メモリ不足の心配はなくなります。

学習時には学習の進捗状況が表示されます。

学習結果は第1回に記載した通りです。学習後に下記のような結果が出ますので、この値から検証しました。

AWSなどの機械学習サービスを使ったほうが、さくっと機械学習を体感したい人にはお勧めです。コスト面でも今回かかった費用は100円未満です。

DataCurrentよりAWSのSageMakerの紹介になってしまいましたが、今後は、今回のような研究開発を通じてDataCurrentのサービス向上に貢献していければと考えています。

※1 https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html

※2 https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html

※3 https://github.com/awslabs/amazon-sagemaker-examples/blob/master/introduction_to_amazon_algorithms/linear_learner_mnist/linear_learner_mnist.ipynb