哪些关键词最能区分两组人?

时间:2011-08-27 00:10:48

标签: python algorithm statistics machine-learning

我有一个关键词数据库,供不同群体的人使用。 类似的东西:

group1person1: x, y, z
group1person2: x, z, d
...
group2person1: z, d, l
...

等等

我想看看哪个关键字最适合特定群体。我正在尝试做OkCupid在博客中所做的事情:http://blog.okcupid.com/index.php/the-real-stuff-white-people-like/

有人可以就此任务推荐合适的算法/术语/建议吗?

(我将在Python中这样做)

提前致谢!

3 个答案:

答案 0 :(得分:5)

您的问题或多或少地叙述了 ID3算法的核心用例。

ID3的输出是一个分类器,它具有二叉树结构(ID3,C4.5等通常被称为决策树)。 Decision Tree Learning的维基百科条目实际上具有ID3的合适摘要(在算法级别)。

ID3中的两个常用度量标准,用于确定给定节点上该部分数据应如何拆分,称为 信息熵 。 (较小的使用度量是 Gini Impurity 。)ID3算法只是一个递归下降解析器,它测试变量/值的所有组合,并在组合上拆分给出最低加权平均熵的节点。 / p>

直观地,信息熵试图识别该变量中的变量(列)和值,该数据将数据“最佳”分割。 “最佳分裂”与我们的直觉一致。这比散文描述要容易得多。考虑一下这个数据集:

Height      Weight      Age     90 min aerobics/wk?     completed 5 mile run?
 155         45          31           Yes                      True
 160         51          33           No                       False
 168         52          28           No                       False
 155         61          25           Yes                      True
 169         57          52           Yes                      True
 172         81          35           No                       False
 164         70          23           Yes                      False

如果数据在第4列分开(该人每周至少进行90分钟的有氧运动吗?)那么得到的两组班级标签看起来像这样:

是组:[真,真,真,假]

没有组:[假,假,假]

两组之间几乎但并非完全异质性。因此,显然第4列是分割此数据的“最佳”变量。

ID3算法中用于确定最佳分割的度量标准只是这种直觉的数学形式主义。

这不是一个完美的(数学上精确的)类比,但粗略地说,你可以认为信息熵与分类变量(离散值)有关,因为方差与连续变量(浮点数)有关。换句话说 - 信息熵(粗略地)表示离散数据的方差(或标准偏差)。

这是一个用于计算熵的 python函数(使用 NumPy ):

def entropy(arr1) :
    import numpy as NP
    ue = NP.unique(x)
    p, entropy = 0., 0.
    for itm in ue :
        ndx = arr1 == itm
        p += NP.size(x[ndx]) / float(x.size)
        entropy -= p * NP.log2(p)
    return entropy

上面的熵函数只是将这两个表达式组合起来并简化为代码:

p(i) = frequency(outcome) = count(outcome) / count(total_rows)

entropy = sum of p(i) x log2(p(i))

完美异质性具有熵= 0,因此最“区别”的变量/值是这样的:当您在该变量和值上分割数据时,加权平均熵最低。接近1的熵值几乎完全“混合”或接近随机。

# simulate a data set with three class labels (0 1, 2)
# for your problem, the class labels are the keywords, 
# so just map each unique keyword to an integer value (e.g., { 'keyword1' : 0, 'keyword2' : 1}
>>> x = NP.random.randint(0, 3, 20)
>>> x
   array([1, 0, 0, 0, 1, 1, 2, 1, 1, 1, 2, 2, 0, 2, 0, 1, 1, 1, 1, 1])

>>> print("{0:.3f}".format(entropy(x)))
   0.758

总而言之,对于您的特定问题,要确定最“区分”的关键字,请为两个类标签列表中的每一个计算熵,然后计算其加权平均值(按每个列表中的项目数加权)。导致具有最低加权平均值熵的分割的关键字就是您所追求的。

答案 1 :(得分:2)

基本上,他们所做的是计算的是术语频率乘以逆文档频率。 tf–idf

答案 2 :(得分:0)

我认为最好的选择是Chi ^ 2,infogain,tfidf,条件可支持性。为什么因为所有这些都需要liniear的复杂性。当我们谈论文本数据库时,所有决策树都不是很可扩展。但是对于计算这样的属性,我们可以使用任何索引工具,如Lucene。所以我的建议是计算每个单词的信息增益并选择最佳。 http://en.wikipedia.org/wiki/Information_gain_in_decision_trees