基于用户喜欢的 Facebook 网站估计用户年龄的机器学习技术

数据挖掘 机器学习 降维 Python
2021-09-22 22:26:36

我有一个来自我的 Facebook 应用程序的数据库,我正在尝试使用机器学习根据他们喜欢的 Facebook 网站来估计用户的年龄。

我的数据库有三个关键特征:

  • 我的训练集中的年龄分布(总共 12k 用户)偏向年轻用户(即我有 1157 个 27 岁的用户和 23 个 65 岁的用户);

  • 许多网站的点赞数不超过 5 个(我过滤掉了点赞数少于 5 个的 FB 网站)。

  • 还有比样本更多的功能。

所以,我的问题是:您建议采取什么策略来准备数据以进行进一步分析?我应该执行某种降维吗?在这种情况下,哪种 ML 方法最适合使用?

我主要使用 Python,因此非常感谢 Python 特定的提示。

4个回答

一开始是k-NN。这里的想法是您有一个用户/项目矩阵,并且对于某些用户,您有一个报告的年龄。用户项目矩阵中一个人的年龄可能很好地由项目空间中一些最近邻居的平均或中值年龄确定。

因此,您将每个用户表示为项目空间中的一个向量,找到 k 个最近邻居,并为有问题的向量分配最近邻居年龄的一些摘要统计信息。您可以在距离截止值上选择 k,或者更实际地通过迭代地将年龄分配给火车保持并选择使该分配中的误差最小化的 k 来选择。

如果维度是一个问题,您可以通过单值分解选择捕获组中最大方差的 m 个向量,轻松地在此设置中执行缩减。

在所有情况下,由于每个特征都是二进制的,因此余弦相似度似乎是您的距离度量标准。

考虑到您的特征空间的狭窄焦点(相同动作的所有变体,喜欢),我需要更多地考虑其他方法(回归、rf 等),我认为用户/项目方法可能是最好的。

需要注意的是,如果您的火车年龄是自我报告的,您可能需要更正其中的一些。脸书上的人倾向于报告他们出生十年的年龄。绘制出生日期(来自年龄)的直方图,看看你是否有像 70 年代、80 年代、90 年代这样的几十年的峰值。

我最近在Python中做了一个类似的项目(使用FB之类的数据预测意见),并通过以下基本过程得到了很好的结果:

  1. 通过逐行迭代逗号分隔的类似记录来读取训练集 (n = N),并使用计数器来识别最受欢迎的页面
  2. 对于 K 个最受欢迎的页面中的每一个(我使用了大约 5000 个,但您可以使用不同的值),使用 pandas.DataFrame.isin 来测试训练集中的每个人是否喜欢每个页面,然后制作一个 N x K 数据框结果(我将其称为 xdata_train)
  3. 创建一个系列(我称之为 ydata_train),其中包含所有结果变量(在我的情况下,在你的年龄),其索引与 xdata_train 相同
  4. 通过 scikit-learn 设置随机森林分类器,根据 xdata_train 预测 ydata_train
  5. 使用 scikit-learn 的交叉验证测试来调整参数并提高准确性(调整热门页面的数量、树的数量、最小叶子大小等)
  6. 使用 pickle 输出随机森林分类器和最受欢迎的页面列表(或者如果您一次做所有事情,请保留在内存中)
  7. 加载其余数据,加载热门页面列表(如有必要),然后重复步骤 2 以生成 xdata_new
  8. 加载随机森林分类器(如有必要)并使用它来预测 xdata_new 数据的值
  9. 将预测分数输出为新的 CSV 或您选择的其他输出格式

在您的情况下,您需要将分类器换成回归器(请参阅 参考资料sklearn.ensemble.RandomForestRegressor),否则相同的过程应该可以正常工作。

此外,您应该知道 Python 中随机森林最令人惊奇的特性:即时并行化!我们这些开始在 R 中做这件事然后转行的人总是会感到惊讶,尤其是当您开始在具有几十个内核的机器上工作时。

最后,请注意,如果您拥有朋友和个人本身的数据,这将是一个完美的网络分析应用程序。如果您可以分析用户朋友的年龄,则用户的年龄几乎肯定会在他或她的朋友中的中位数的一两年内,特别是如果用户足够年轻,可以在仍然建立朋友网络的情况下学校(因为大多数将是同学)。该预测可能会胜过您从建模中获得的任何预测——这是一个教科书示例,说明每次正确数据>正确模型的问题。

祝你好运!

另一个建议是测试逻辑回归作为额外的奖励,模型的权重(系数)将使您了解哪些站点具有年龄差异性。

Sklearn 提供了旨在处理稀疏数据的sklearn.linear_model.LogisticRegression包。

正如评论中提到的,在本例中,输入变量多于样本,您需要对模型进行正则化(使用sklearn.linear_model.LogisticRegression参数penalty='l1')。

D. Nguyen 等人的一些研究。尝试根据推文预测推特用户的年龄。也许你觉得它们很有用。他们使用逻辑回归和线性回归。