機械学習モデルを使用して数十億のデータポイントの性別を予測する方法

機械学習モデルを使用して数十億のデータポイントの性別を予測する方法

[[327734]]

ユーザーポートレートに基づいた広告は、広告効果を最適化し、精密なマーケティングを実現するための基礎であり、人口統計属性における性別や年齢などのラベルは、ユーザーポートレートの基本情報です。では、データをできるだけ正確にラベル付けするにはどうすればよいでしょうか?

ここで機械学習が役に立ちます。この記事では、性別ラベルを例に、人口属性ラベルを予測するための機械学習モデルの構築と最適化について紹介します。

性別ラベル予測プロセス

一般的に、教師なし学習では有用な情報を学習することが難しいだけでなく、学習効果を評価することも難しくなります。したがって、可能であれば、問題を教師あり学習に変換してみます。

性別ラベルについても同様です。TalkingData によって収集された元のデータから抽出された信頼できる性別サンプル データと有用な情報を使用して、性別ラベル生成タスクを教師あり機械学習タスクに変換できます。具体的には、男性/女性が 1/0 ラベル (ラベル、Y 値とも呼ばれ、表現の便宜上、男性/女性をそれぞれ 1/0 ラベルとしてマークします) として使用されるため、性別ラベル付けのタスクはバイナリ分類タスクに変換されます。

性別ラベルの生産フローチャートは次のとおりです。

  • 簡単に言えば、入力は信頼できる性別情報を含むサンプルデータであり、最近のアクティブな生データから有用な特徴が抽出されます。
  • これら 2 つを結合すると、モデリングに直接使用できるデータ セットが得られます。
  • このデータセットに基づいてモデリングを実行し、性別予測モデルを学習します。
  • 次に、モデルを使用してすべてのサンプルを予測し、すべてのサンプルの性別スコアを取得します。この時点で、作品のモデル部分は基本的に完成しています。
  • 最後のステップは、しきい値を決定し、男性/女性のラベルを出力することです。ここでは、しきい値を決定するためにモデルに依存するのではなく、より信頼性の高いサードパーティ ツールを使用して、できるだけ多くのサンプルが期待される精度で呼び出されるようにします。

また、TalkingData では 10 億を超えるデータ量に直面しており、ラベル作成プロセスでの計算を高速化するために、単一のマシンが必要な場合を除き、分散 Spark を使用して計算を高速化することを優先します。

機能とモデルメソッドのバージョン反復

モデルのパフォーマンスを最適化するために、性別ラベル予測モデルを数回反復しました。

01性別予測モデルV1

モデルで最初に使用される機能には、デバイス アプリケーション情報、SDK に埋め込まれたアプリケーション パッケージ名、SDK に埋め込まれたアプリケーション内のカスタム イベント ログ、デバイス モデル情報の 4 つのディメンションが含まれます。

このモデルは Xgboost (バージョン 0.5) を使用し、各次元の特徴に基づいてモデルをトレーニングして 4 つのサブモデルを取得します。各サブモデルは、特徴ディメンションに基づいて、デバイスの男性/女性の向きのスコアを出力します。スコアの範囲は 0 ~ 1 です。スコアが高いということは、デバイスが男性向けであることを意味し、その逆も同様です。モデルコードの例は次のとおりです。

<完全なコードを表示するには左右にスワイプしてください>

  1. com.talkingdata.utils.LibSVM をインポートします。
  2. ml.dmlc.xgboost4j.scala.DMatrix をインポートします。
  3. ml.dmlc.xgboost4j.scala.spark.XGBoost をインポートします //バージョン 0.5
  4.  
  5. //列車ステージ
  6. val trainRDD = LibSVM.loadLibSVMFile(sc, trainPath) // scはSparkContextです
  7. val モデル = XGBoost.train(trainRDD、paramMap、numRound、nWorkers = ワーカー)
  8.  
  9.  
  10. //ステージを予測する
  11. val testSet = LibSVM.loadLibSVMFilePred(sc,testPath,-1,sc.defaultMinPartitions)
  12. val pred = testSet.map(_._2).mapPartitions{ iter =>
  13. モデル.値.予測(新しいDMatrix(iter)).マップ(_.head).toIterator
  14. }.zip(testSet).map{ケース(pred, (tdid, feature)) =>
  15. s "$tdid\t$pred"  
  16. }

欠点と最適化の方向性:

  • このモデルは 4 つのサブモデルを融合したもので、構造が複雑で動作効率が低いです。代わりに単一のモデルを使用することを検討してください。
  • SDK に組み込まれたアプリケーションのカスタム イベント ログ機能のカバー率が低く、ETL 処理のリソース消費量が大きいため、この分野のモデルへの貢献度を再評価する必要があります。
  • デバイス名フィールドには男性と女性の区別があるようです。一部のユーザー グループは、自分の名前やニックネームにちなんでデバイスに名前を付けます (たとえば、「哥」や「军」のフィールドは男性である傾向があり、「妹」や「兰」のフィールドは女性である傾向があります)。効果を確認し、このフィールドを追加するかどうかを検討します。

02性別予測モデルV2

モデル使用機能の 4 つの次元が、SDK に埋め込まれたアプリケーション パッケージ名、SDK に埋め込まれたアプリケーション AppKey、デバイス モデル情報、デバイス名に調整されました。

その中で、SDK に埋め込まれているアプリケーション パッケージ名とデバイス名がセグメント化されています。次に、CountVectorizer を使用して上記の 4 種類の特徴をスパース ベクトル (Vector) に処理し、ChiSqSelector を使用して特徴をスクリーニングします。

このモデルは LR (ロジスティック回帰) を使用します。コード例は次のとおりです。

<完全なコードを表示するには左右にスワイプしてください>

  1. org.apache.spark.ml.feature.VectorAssembler をインポートします。
  2. org.apache.spark.ml.PipelineModel をインポートします。
  3. org.apache.spark.ml.classification.LogisticRegression をインポートします。
  4.  
  5. val transformedDF = spark.read .parquet( "/traindata/path" )//単語分割、CountVectorizer、ChiSqSelector 操作後の機能(ベクトル列)
  6.  
  7. val featureCols = Array( "パッケージ名" "アプリキー" "モデル" "デバイス名" )
  8. val ベクターライザー = 新しい VectorAssembler()。
  9. 入力列を設定します(featureCols)。
  10. setOutputCol( "機能" )
  11. val lr = 新しいロジスティック回帰()
  12. val パイプライン = 新しいパイプライン().setStages(Array(vectorizer, lr))
  13. val モデル = pipeline.fit(変換されたDF)
  14.  
  15. //ステージを予測する
  16. val transformedPredictionDF = spark. read .parquet( "/predictData/path" ) //train と同じ、単語分割、CountVectorizer、ChiSqSelector 処理後の機能、ベクトル列
  17. val予測 = model.transform(変換された予測DF)

メリットと改善効果:

単一のモデルを使用することで、共通のモデル評価指標 (ROC-AUC、Precision-Recall など) を使用してモデルを測定でき、後続のバージョン反復のベースラインとして使用して、モデルの観点からバージョンの改善を比較しやすくなります。

欠点と最適化の方向性:

LR モデルは比較的単純で、学習能力が限られています。Xgboost モデルなどのより強力なモデルに置き換えられます。

03性別予測モデルV3

このモデルでは、以前のバージョンに含まれていた 4 つのディメンション (SDK に埋め込まれたアプリケーション パッケージ名、SDK に埋め込まれたアプリケーション AppKey、デバイス モデル情報、デバイス名) に加えて、最近集約されたデバイス アプリケーション情報も追加されています。処理方法は以前のバージョンと同様であるため、ここでは繰り返しません。

モデルは LR から Xgboost (バージョン 0.82) に変更されました。コード例は次のとおりです。

<完全なコードを表示するには左右にスワイプしてください>

  1. org.apache.spark.ml.feature.VectorAssembler をインポートします。
  2. ml.dmlc.xgboost4j.scala.spark.XGBoostClassifier をインポートします //バージョンは 0.82 です
  3.  
  4. val transformedDF = spark.read .parquet( "/trainData/path" )//単語分割とCountVectorizer操作後の機能(ベクトル列)
  5.  
  6. val featureCols = Array( "パッケージ名" "アプリキー" "モデル" "デバイス名" )
  7. val ベクターライザー = 新しい VectorAssembler()。
  8. 入力列を設定します(featureCols)。
  9. setOutputCol( "機能" )
  10. val assembledDF = vectorizer.transform(transformedDF)
  11.  
  12. //列車ステージ
  13. //xgboost パラメータ設定
  14. val xgbParam = Map( "eta" -> xxx,
  15. "最大深度" -> xxx,
  16. 「目的」 -> 「バイナリ:ロジスティック」
  17. "num_round" -> xxx,
  18. 「num_workers」 -> xxx)
  19. val xgbClassifier = 新しい XGBoostClassifier(xgbParam)。
  20. setFeaturesCol( "機能" )。
  21. setLabelCol( "ラベル列名" )
  22.  
  23. モデル = xgbClassifier.fit(組み立てられたDF)
  24.  
  25. //ステージを予測する
  26. val transformedPredictionDF = spark. read .parquet( "/predictData/path" ) //train と同じ、単語分割と CountVectorizer 操作後の機能、ベクトル列
  27. val assembledpredicDF = vectorizer.transform(transformedPredictionDF)
  28. val予測 = model.transform(assembledpredicDF)

メリットと改善効果:

  • 以前のバージョンと比較すると、AUC は 6.5% 向上し、最終的な性別ラベル生成におけるリコール率は 26% 向上しました。 TalkingData のデータ量は 10 億を超えているため、この数字は依然としてかなりの量です。

04性別予測モデルV4

TalkingData では、以前のバージョンに含まれていた 5 つの特徴ディメンションに加えて、3 つの広告カテゴリ ディメンションの特徴も追加しました。広告カテゴリの特徴のカバー率はわずか 20% ですが、最終ラベルのリコール率の向上にも大きな影響を与えています。

モデルは Xgboost の DNN に置き換えられ、トレーニング エポックの最大数は 40 に設定され、早期停止パラメータが設定されました。ニューラル ネットワークはビッグ データに基づいてのみ機能することを考慮し、ニューラル ネットワークの学習を確実にするために、トレーニングに使用するサンプル サイズを 2 倍にしました。

DNN の構造は次のとおりです。

<完全なコードを表示するには左右にスワイプしてください>

  1. パイソン
  2. ジェンダーネット_VLen(
  3. (embeddings_appKey): 埋め込み(xxx, 64, padding_idx=0)
  4. (embeddings_packageName): 埋め込み(xxx, 32, padding_idx=0)
  5. (embeddings_model): 埋め込み(xxx, 32, padding_idx=0)
  6. (embeddings_app): 埋め込み(xxx, 512, padding_idx=0)
  7. (embeddings_deviceName): 埋め込み(xxx, 32, padding_idx=0)
  8. (embeddings_adt1): 埋め込み(xxx, 16, padding_idx=0)
  9. (embeddings_adt2): 埋め込み(xxx, 16, padding_idx=0)
  10. (embeddings_adt3): 埋め込み(xxx, 16, padding_idx=0)
  11. (fc): シーケンシャル(
  12. (0): 線形(in_features=720, out_features=64, バイアス= True )
  13. (1): BatchNorm1d(64, eps=1e-05, momentum=0.1, affine= True , track_running_stats= True )
  14. (2): ReLU()
  15. (3)脱落者(p=0.6)
  16. (4): 線形(in_features=64, out_features=32, バイアス= True )
  17. (5): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine= True , track_running_stats= True )
  18. (6): ReLU()
  19. (7):脱落者(p=0.6)
  20. (8): 線形(in_features=32, out_features=16, バイアス= True )
  21. (9): BatchNorm1d(16, eps=1e-05, momentum=0.1, affine= True , track_running_stats= True )
  22. (10): ReLU()
  23. (11):脱落者(p=0.6)
  24. (12): 線形(in_features=16, out_features=2, バイアス= True )

メリットと改善効果:

  • 以前のバージョンと比較すると、AUC は 1.5% しか増加していませんが、最終的な性別ラベル生成におけるリコール率は 13% 増加しています。データ量と既存のラベル量を考慮すると、この改善は依然として良好です。このことから、バージョン反復の効果を検証する際には、モデルの AUC という単一の指標だけで測定するべきではないことがわかります。これは、バージョン反復の効果の改善度合いを測定するのに十分正確ではないためです。最終的な真の指標の改善、つまり性別ラベル予測において、期待される精度(精度)内で再現されたサンプルの数を検証する必要があります。ただし、バージョンを最適化するときに、AUC などのモデル関連の指標を使用して、制御変数の実験効果をすばやく検証することはできます。結局のところ、これらの指標は計算が簡単です。

モデル探索のヒント

生のログからフィールドを抽出し、それらを情報に集約するには、多くの ETL ステップが必要であり、多くの最適化手法が関係します。この部分は専用の ETL チームによって処理されるため、ここでは詳細に説明しません。

モデル チームは、時間集約後のフィールドをモデリング タスクに直接使用できます。ただし、ETL と機能生成に費やされる時間は、モデルの最適化と反復処理にかかる時間の大部分を占めます。

以下では、皆様の参考になればと思い、2 つの最適化の落とし穴と解決策をまとめました。

1. 性別ラベル予測の場合、入力特徴のほとんどは、最近収集されたデバイスアプリケーション情報などの配列型です。このタイプのフィールドの場合、モデルをトレーニングする前に、通常は CountVectorizer を呼び出して配列をベクトルに変換し、それをモデルの入力として使用します。ただし、CountVectorizer のこの手順は非常に時間がかかるため、バージョンの反復中に実験を迅速に実行することができません。

この問題に対処するには、この変換手順を事前に完了し、生成された Vector 列を保存します。こうすることで、各実験で CountVectorizer が消費する時間を節約できます。

実際の生産では、多くのタグの生産で同じフィールドが使用されるため、配列はベクターに変換され、事前に保存されます。後続のさまざまなタスクはベクター列を直接呼び出すことができるため、多くの時間を節約できます。

2. 最初の方法は多くの時間を節約できますが、実稼働環境では Spark の方がより多く使用されています。実際、モデルの初期段階の調査では、最初に Spark を使用してトレーニング セットを生成することもできます。通常、実際のサンプルはそれほど多くないため、生成されるトレーニング セットはそれほど大きくないことが多く、単一のマシンを使用して迅速な実験を行うことができます。

単一のマシン上で、Python を使用してより便利に図を描き、データをより直感的に理解し、機能のスクリーニングをより速く実行し、アイデアをより速く検証することができます。データとモデルを深く理解した後、実験から得られた結論をすぐに生産に適用できます。

著者について: TalkingData のデータ サイエンティストである Zhang Xiaoyan は、現在、エンタープライズ レベルのユーザー ポートレート プラットフォームの構築と、効率的なマーケティング配信アルゴリズムの研究開発を担当しています。彼女は長年、インターネット広告、ユーザー ポートレート、不正検出などの分野に関心を持ってきました。

<<:  AIの次の目的地:リアルタイムサービス

>>:  適切な機械学習アルゴリズムを簡単に選択する方法を教えます。

推薦する

大学入試の願書記入や学校選びの際、人工知能を専攻するならこれらの学校を選ばなければなりません!

すでに非常に人気がある人工知能は、大学入試の願書が記入されるにつれて、間違いなく人気が続くでしょう。...

ポストエピデミック時代:医療業界で成功するには?

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

IoTとAIが出会うとき: テクノロジーの未来

人工知能(AI)は驚異的な進歩を遂げ、一般に応用可能な技術として社会に影響を与えています。しかし、初...

中国移動研究所のチャン・ヤオビン氏:AI時代の技術マネージャーとして、戦闘能力とは何でしょうか?

[[260907]] [[260908]] AIはさまざまな産業に大きな変化をもたらします。よりイ...

React と DOM - ノード削除アルゴリズム

[[378076]]これは、React DOM 操作を詳細に説明した最初の記事です。記事の内容はコミ...

将来、人工知能技術は動物実験に取って代わる可能性を秘めているのでしょうか?

動物実験は動物に対して行われる最も残酷な行為の一つと考えられています。研究によると、マウス、カエル、...

優れた LLM アプリケーションを構築するための 4 つの重要なポイントのうち、どれを見つけましたか?

これらの提案により、LLM 申請の精度が向上し、適切な LLM を選択する方法についての考慮事項も含...

認知AIの台頭:2025年にAIは質的に飛躍する

[[441939]] AIの概念が初めて提唱されたのは1956年なので、60年以上の歴史があります。...

人類の未来における人工知能の重要性

人工知能(AI)は私たちが住む世界を急速に変えています。医療から金融まで、人工知能は産業を変革し、私...

人材管理を改善する人工知能の可能性

AI は人間の従業員の努力を補完し、彼らの時間を解放することができます。人事担当者はこの機会を利用し...

ドローン技術がモバイルIoTの範囲を拡大

無人航空機(口語では「ドローン」と呼ばれる)は、航空業界に無人航空機を導入することで、ライト兄弟の有...

...