【问题标题】:Which data mining algorithm would you suggest for this particular scenario?对于这个特定场景,您会建议哪种数据挖掘算法?
【发布时间】:2011-01-22 09:03:05
【问题描述】:

这不是直接与编程相关的问题,而是关于选择正确的数据挖掘算法的问题。

我想根据人们的名字、他们居住的地区以及他们是否拥有互联网产品来推断他们的年龄。其背后的想法是:

  • 有些名字在特定的十年(名人、政治家等)过时或流行(这在美国可能不成立,但在感兴趣的国家/地区确实如此),
  • 年轻人倾向于生活在人口密集的地区,而老年人更喜欢农村,并且
  • 年轻人比老年人更多地使用互联网。

我不确定这些假设是否成立,但我想测试一下。所以我所拥有的是来自我们客户数据库的 100K 观察结果

  • 大约。 500 个不同的名称(具有太多类的名义输入变量)
  • 20 个不同的区域(名义输入变量)
  • 互联网是/否(二进制输入变量)
  • 91 个不同的出生年份(数值目标变量,范围:1910-1992)

因为我有这么多名义输入,我不认为回归是一个好的选择。因为目标是数字的,所以我认为决策树也不是一个好的选择。谁能建议我一种适用于这种情况的方法?

【问题讨论】:

  • 100k 观察结果只有 500 个不同的名称?
  • 你的第三个假设是有问题的;更好地检查研究
  • @Samuel:是的,500 个名字。人们在这里对婴儿的名字不是很有创意。
  • 无论你做什么,我建议你使用一半的数据库(50k)来处理你的算法,然后在另一半上测试它的输出,看看它是否运行良好。这是一种通用方法,用于尝试对某事物进行建模以查看模型是否正确或只是针对其产生的人群量身定制。
  • @Matthieu:当然,我会使用交叉验证。

标签: algorithm data-mining


【解决方案1】:

新答案

我会尝试使用回归,但以我指定的方式。我会尝试对每个变量进行二值化(如果这是正确的术语)。 Internet 变量是二进制的,但我会将其转换为两个单独的二进制值。我会用一个例子来说明,因为我觉得它会更有启发性。在我的示例中,我将只使用三个名称(Gertrude、Jennifer 和 Mary)和 internet 变量。

我有 4 个女人。以下是他们的数据:

Gertrude, Internet, 57
Jennifer, Internet, 23
Gertrude, No Internet, 60
Mary, No Internet, 35

我会生成一个矩阵 A,如下所示(每一行代表我列表中的相应女性):

[[1,0,0,1,0], 
 [0,1,0,1,0],
 [1,0,0,0,1],
 [0,0,1,0,1]]

前三列表示名称,后两列表示 Internet/No Internet。因此,这些列代表

[Gertrude, Jennifer, Mary, Internet, No Internet]

您可以继续使用更多名称(名称为 500 列)和区域(名称为 20 列)来执行此操作。然后,您将只解决标准线性代数问题 A*x=b,其中上述示例的 b 是

b=[[57],
   [23],
   [60],
   [35]]

您可能担心 A 现在将是一个巨大的矩阵,但它是一个巨大的、极其稀疏的矩阵,因此可以非常有效地以稀疏矩阵形式存储。每行有 3 个 1,其余为 0。然后您可以使用稀疏矩阵求解器解决此问题。您将需要对生成的预测年龄进行某种相关性测试,以了解它的有效性。

【讨论】:

  • 我曾想过,但是是的,我担心矩阵的巨大。但你是对的,使用稀疏矩阵格式肯定会有所帮助。我会试一试的。
  • 考虑到 20 个区域,我将有 521 个输入变量和一个数字目标变量。然后我会将平均误差与测试集与仅使用每个名字的平均年龄的场景进行比较。让我们看看回归模型与简单模型相比是否带来任何显着的好处。如果没有,我会使用 occam 的剃须刀 ;)
  • 如果你像我一样使用互联网变量,那么你会得到 522(互联网和没有互联网的单独列),但这可能无济于事。
【解决方案2】:

我认为您可以设计离散变量来反映您要确定的拆分。您似乎不需要对他们的确切年龄进行回归。

一种可能性是对年龄进行聚类,然后将这些聚类视为离散变量。如果这不合适,另一种可能性是将年龄划分为均匀分布的箱。

一种可以很好地满足您的目的的技术是,不是直接对年龄进行聚类或划分,而是对每个名字的平均年龄进行聚类或划分。也就是说,生成所有平均年龄的列表,并使用它来代替。 (不过,如果您这里的离散类别过于细粒度,分类器中可能会出现一些统计问题。

但是,最好的情况是,如果您对自己认为适合“年轻”和“年老”的年龄范围有一个清晰的概念。然后,直接使用这些。

【讨论】:

  • 实际上,年龄几乎是高斯分布的。我认为合理的聚类是不可能的。
  • 其实一开始我的想法是“直接取每个名字的平均年龄”。不过,会不会太简单了?我想要一个更现实的模型,它会考虑更多的参数。我能以某种方式将这种简单的方法与更复杂的方法合并吗?
  • 我觉得我说的不够清楚。在设计输出特征时,不是根据实际年龄分布将年龄划分为类别,而是在每个名字的平均年龄分布中将它们划分为集群。然后,您可以使用决策树或任何您喜欢的东西。如果是我,我可能会使用一个感知器,其初始权重由该特征在给定 bin 中的百分比给出。
  • 在这一点上我还没有说太多关于训练与测试之类的东西。当然,这也适用于特征形成!
【解决方案3】:

您可以查看 babynamewizard。它显示了名称频率随时间的变化,应该有助于将您的名称转换为数字输入。此外,您应该能够使用 census.gov 数据中的人口密度来获取与您所在地区相关的数值。关于 DSL 访问的可用性,我会建议一个额外的标志 - 许多农村地区没有 DSL 覆盖。没有覆盖 = 对互联网服务的需求减少。

我的第一个倾向是将您的回答分为两组,一组很可能在学校或工作中使用过计算机,另一组则不太可能。在他们职业生涯或上学的早期接触计算机可能会对他们以后使用计算机的可能性产生一些影响。然后,您可以分别考虑对组进行回归。这应该消除输入的一些自然相关性。

【讨论】:

  • 你推荐的网页真不错,谢谢。但是,感兴趣的国家/地区是德国,而不是美国。
【解决方案4】:

我会使用接受名义属性和数字类的分类算法,例如 M5(用于树或规则)。也许我会将它与 bagging 元分类器结合起来以减少方差。原始算法M5是R. Quinlan发明的,王勇做了改进。

算法在R(库RWeka)中实现

也可以在开源机器学习软件Weka中找到

欲了解更多信息,请参阅:

罗斯·J·昆兰:Learning with Continuous Classes。在:第五届澳大利亚人工智能联合会议,新加坡,343-348,1992。

是的。 Wang, I. H. Witten:Induction of model trees for predicting continuous classes。见:第 9 届欧洲机器学习会议的海报论文,1997 年。

【讨论】:

    【解决方案5】:

    我认为与您略有不同,我认为树是处理名义数据的出色算法,因为它们可以帮助您建立一个模型,您可以轻松解释和识别这些名义变量中的每一个及其不同值的影响. 您还可以使用带有虚拟变量的回归来表示名义属性,这也是一个很好的解决方案。 但您也可以使用其他算法,例如 SVM(smo),之前将名义变量转换为二进制虚拟变量,与回归相同。

    【讨论】:

      猜你喜欢
      • 2015-12-02
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 2016-11-28
      • 2011-08-06
      • 2015-09-11
      • 2011-05-04
      • 1970-01-01
      相关资源
      最近更新 更多