好きなFacebookサイトに基づいてユーザーの年齢を推定するための機械学習手法


25

Facebookアプリケーションのデータベースがあり、機械学習を使用して、ユーザーが好きなFacebookサイトに基づいてユーザーの年齢を推定しようとしています。

私のデータベースには3つの重要な特徴があります。

  • 私のトレーニングセットの年齢分布(合計で1万2,000ユーザー)は若いユーザーに偏っています(つまり、27歳の1157ユーザーと65歳の23ユーザー)。

  • 多くのサイトには、5人以下のLikerがあります(5人未満のLikerでFBサイトを除外しました)。

  • サンプルよりも多くの機能があります。

したがって、私の質問は次のとおりです。さらなる分析のためにデータを準備するためにどのような戦略を提案しますか?何らかの次元削減を実行する必要がありますか?この場合、どのMLメソッドを使用するのが最も適切でしょうか?

私は主にPythonを使用しているため、Python固有のヒントをいただければ幸いです。


1
「サンプルよりも多くの機能」と言うとき、いいね!されたサイトの一意の数は>> numユーザーだと思います。それはサイトのルートドメインにも当てはまりますか?すなわち、それらはサイト内の多くのyoutube.comまたはcnn.comのURLですか、それともすでにドメインに由来していますか?可能であれば、特定のページではなくドメインルートにURLを折りたたむことで、ディメンションの削減に傾倒しています。
cwharland

ご回答ありがとうございます。機能(ユニークないいね!サイト)の数は32kで、サンプル(ユーザー)の数は12kです。機能はFacebookページであるため、URLをステミングする必要はありません。ユーザーはfacebook.com/cnnを好む場合も好まない場合もあります。ただし、共有しているリンクに基づいてユーザーの年齢を推定しようとするアイデアが好きです:)
Wojciech Walczak

ああ、私は好きなサイトの説明を読み違えました。説明をありがとう。
cwharland

回答:


16

まず始めに、k-NNを使用します。ここでの考え方は、ユーザー/アイテムマトリックスがあり、一部のユーザーには年齢が報告されているということです。ユーザーアイテムマトリックス内の人物の年齢は、アイテムスペース内のいくつかの最近傍の平均年齢または中央値などによって適切に決定される場合があります。

したがって、各ユーザーはアイテム空間のベクトルとして表現され、k個の最近傍を見つけ、問題のベクトルに最近傍年齢の要約統計量を割り当てます。距離のカットオフでkを選択するか、より現実的に、列車のホールドアウトに年齢を繰り返し割り当て、その割り当てのエラーを最小化するkを選択できます。

次元が問題である場合、グループ全体で最大の分散をキャプチャするm個のベクトルを選択する単一値分解により、このセットアップで簡単に縮小を実行できます。

すべての場合において、各特徴はバイナリであるため、コサインの類似性が距離測定基準になります。

機能スペースの狭い焦点(同じアクションのすべてのバリエーション、好み)を考えると、他のアプローチ(回帰、rfなど)についてもう少し考える必要があります。ユーザー/アイテムアプローチが最適だと思います。

注意点の1つは、電車の年齢が自己申告である場合、その一部を修正する必要がある場合があることです。Facebookの人々は、生まれた10年で年齢を報告する傾向があります。生年月日(年齢から派生)のヒストグラムをプロットし、70年代、80年代、90年代などの数十年でスパイクがあるかどうかを確認します。


こんにちは、あなたの答えは私の実際の戦略に非常に似ています。sklearn.neighbors.KNeighborsRegressorSVD削減空間でコサインメトリックを使用しました(SVDを適用した後、平均推定誤差は〜6年から〜4に低下しました)。私のデータベースのユーザーは18〜65歳(古いユーザーは除外されています)なので、48の可能なクラスがあります。kNNにはクラスが多すぎないのか、それとも回帰問題として扱うのか、分類問題として扱うべきなのか(両方とも当てはまると思います)。
Wojciech Walczak

逸話的に言えば、クラスごとにランダムフォレストを使用して、いくつかのクラスを個別に適合させ、それらのモデルの結果をさまざまな方法で組み合わせたと言えます。この場合、kNNを使用して各ユーザーの年齢に事前確率を割り当ててから、各クラスベースのモデルを実行し、それらのスコアを使用して各クラスの事前確率を更新し、それらの事後確率から最も確率の高いクラスを選択することも考えられます。少し複雑に聞こえるかもしれませんが、最悪の場合はkNNの精度があります。
cwharland

7

私は最近、Pythonで同様のプロジェクト(FBのようなデータを使用して意見を予測)を行い、次の基本的なプロセスで良い結果を得ました。

  1. トレーニングセット(n = N)を読み、レコードのようにカンマ区切りで行ごとに繰り返し、カウンターを使用して最も人気のあるページを特定します
  2. K個の最も人気のある各ページ(私は約5000を使用しましたが、異なる値で再生できます)について、pandas.DataFrame.isinを使用して、トレーニングセットの各個人が各ページを気に入っているかどうかをテストし、N x Kデータフレームを作成します結果の(xdata_trainと呼びます)
  3. xdata_trainと同じインデックスを使用して、すべての結果変数(私の場合はあなたの年齢の意見)を含むシリーズ(ydata_trainと呼びます)を作成します。
  4. xdata_trainに基づいてydata_trainを予測するためにscikit-learnを介してランダムフォレスト分類器を設定します
  5. scikit-learnの相互検証テストを使用して、パラメーターを調整し、精度を調整します(人気のあるページの数、ツリーの数、最小リーフサイズなどを調整します)。
  6. ランダムフォレスト分類子と最も人気のあるページのリストをpickleで出力します(またはすべてを一度に行う場合はメモリに保存します)
  7. 残りのデータを読み込み、人気のあるページのリストを読み込み(必要な場合)、ステップ2を繰り返してxdata_newを生成します
  8. ランダムフォレスト分類子を読み込み(必要な場合)、それを使用してxdata_newデータの値を予測します
  9. 予測されたスコアを新しいCSVまたは選択した他の出力形式に出力します

あなたの場合、リグレッサの分類子を交換する必要があります(ここを参照してください:http : //scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html)、それ以外は同じプロセス多くのトラブルなしで動作するはずです。

また、Pythonのランダムフォレストの最も驚くべき機能であるインスタント並列化にも注意してください。Rでこれを始めてから移動した私たちは、特に数十個のコアを持つマシンで作業するときはいつも驚かされます(http://blog.yhathq.com/posts/comparing- random-forests-in-python-and-r.html)。

最後に、友人と個人自身のデータがある場合、これはネットワーク分析に最適なアプリケーションになることに注意してください。ユーザーの友達の年齢を分析できる場合、ユーザーの年齢はほぼ確実に1年か2年以内に彼または彼女の友達の中央値になります。学校(ほとんどがクラスメートになるため)。この予測は、モデリングから得られるものよりも勝りそうです。これは、毎回正しいデータが正しいモデルであるという問題の教科書の例です。

がんばろう!


2
上位5000サイトを使用する1つの興味深い側面は、年齢に応じてユーザーをセグメント化するのが得意ではないという事実です。建設中のトップサイトは、誰もが訪れるサイトです。したがって、すべての可能な分類(年齢)がそれらのサイトに関与しているため、ユーザーのセグメント化はあまり得意ではありません。これは、tf-idfのidf部分と同様の概念です。idfは、「誰もがこの機能を持っている」ノイズを除去するのに役立ちます。最も訪問されたサイトは、RFの変数重要度プロットの特徴としてどのようにランク付けされますか?
cwharland

1
いい視点ね。これを簡単に修正するには、トレーニングデータセットをJ年齢ビン(13〜16、17〜20、21〜24など)に階層化し、各グループのトップ(K / J)ページを取得します。これにより、各グループの重要な代表者を確保できます。グループ間で確かに重複が生じるので、本当にうるさい場合は、各グループのトップ(K / J)の一意のページを取得したいかもしれませんが、それはやり過ぎだと思います。
Therriault

5

もう1つの提案は、ロジスティック回帰をテストすることです。追加のボーナスとして、モデルの重み(係数)により、どのサイトが年齢差別的であるかがわかります。

Sklearnは、スパースデータも処理するように設計されたsklearn.linear_model.LogisticRegressionパッケージを提供します。

コメントで言及したように、今回の場合、サンプルよりも多くの入力変数を使用して、モデルを正規化する必要があります(sklearn.linear_model.LogisticRegressionではpenalty='l1'引数を使用します)。


1
LRでは、年齢ビンのモデルを複数作成する必要があります。ユーザーの包含に関する同じ問題を予測する異なる年齢ビンの2つのモデルをどのように比較しますか?
cwharland

1
観測値よりも多くの変数がある場合、LRは失敗し、モデルの仮定が満たされない場合はパフォーマンスが低下することに注意してください。これを使用するには、次元削減を最初のステップにする必要があります。
クリストファールーデン

1
@cwharlandは、応答変数が本質的に連続的であり、問​​題定義によって離散化されているため、応答変数をカテゴリカルであると見なすべきではありません。カテゴリを考慮すると、実際に17歳のときに16歳を予測することは、実際に17歳のときに30歳を予測することと同じくらい重大なエラーであるとアルゴリズムに伝えることを意味します。 30対17)は大きいと見なされます。この場合、ロジスティック回帰を使用して、連続値を予測し、事後確率を推定しません。
damienfrancois

@ChristopherLoudenバニラバージョンのロジスティック回帰は「大きなp小さなn」の場合には適していないことは確かです。この場合、正則化が重要であることを述べたはずです。回答を更新します。ただし、L1で正規化されたLRは一種の機能選択であるため、予備のFSステップは必要ないと考えています。
damienfrancois

@damienfrancois:私は間違いなく同意します。この場合、LRが中間値に厳しすぎるペナルティを課すことを少し心配しています。極端な年齢の値に特に興味がないのであれば、シグモイドのような曲線にマッピングする動機はないようです。おそらく、私は使用を誤って解釈しています。
cwharland

4

D. Nguyen等からのいくつかの研究ツイートに基づいてtwitterユーザーの年齢を予測してください。たぶんあなたはそれらを便利だと思うでしょう。ロジスティック回帰と線形回帰を使用します。


3

より手の込んだ方法とは別に、ベイズ式を試すことができます

P(I | p1 ... pn)= P(p1 ... pn | I)P(I)/ sum_i(P(p1 ... pn | i)P(i))

P(I | p1 ... pn)は、ユーザーがp1、..、pnを気に入った場合に、ユーザーが年齢グループIに属する確率です。

P(i)は、ユーザーが年齢グループiに属する確率です。

P(p1 .. pn | i)は、ユーザーが年齢グループiに属している場合、ユーザーがp1、..、pnを気に入った確率です。

  • データからP(i)の推定値が既にあります。これは、年齢グループIのユーザーの割合にすぎません。
  • P(p1 ... pn | i)を推定するために、年齢グループiごとに、ページjが好きになる確率(頻度)p_ijを推定します。すべてのjに対してp_ijをゼロ以外にするには、母集団全体の頻度を小さな重みで混合します。

  • 次に、P(p1 ... pn | i)= sum(log p_ij、i = p1、..、pn)を記録します。これは、新しいユーザーが好きなすべてのページの合計です。この式は、ユーザーが自分の年齢グループのページを独立して気に入っていると仮定すると、ほぼ正しいでしょう。

  • 理論的には、彼が気に入らないすべてのiのログ(1-p_ij)も追加する必要がありますが、実際には、ログ(1-p_ij)の合計は無関係に小さいため、あまり必要ありません。多くのメモリ。

あなたまたは他の誰かがこれを試みた場合、結果についてコメントしてください。


2

これは非常に興味深い問題です。

ユーザーがソーシャルネットワークにアップロードした写真を分析して、似たような問題に直面しました。私は次のアプローチをしました:

  • 年齢(15歳、27歳、...)にデータを関連付けるのではなく、さまざまな年齢グループを設定します:18歳未満、18歳から30歳、30歳を超えています(これは特定の問題によるものです)直面しているが、あなたが望む任意の間隔を選択することができます)。この分割は、問題の解決に大いに役立ちます。
  • その後、階層型クラスタリング(分割型または集約型)を作成しました。次に、既知の年齢(またはグループ年齢)のユーザーがいたブランチを選択し、そのブランチに対して同じ年齢をそのグループに延長しました。

このアプローチは半教師あり学習であり、ラベル付けされたデータのみがある場合に推奨します。

ソーシャルネットワークでは、人々は通常年齢についてうそをつくことに注意してください(ただの楽しみのため、またはソーシャルネット上で自分自身をカムフレートしたいためです)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.