scikit中的k-means向量是否在内部学习规范化或TfidfVectorizer规范化不起作用?

时间:2014-06-14 23:27:19

标签: python scikit-learn k-means tf-idf

scikit-learn Kmeans内部的向量是否在内部标准化为单位L2范数或TfidfVectorizer出错?我对文本数据执行聚类,我使用TF-IDF矢量化器进行矢量化。这里的代码太长了,无法复制,但实际上我从20个新闻组数据集中对数据进行了矢量化和聚类。我将矢量化器实例化为(未标准化):

VectorizerUn = TfidfVectorizer(min_df=10,
                               max_df=0.5,
                               stop_words='english',
                               decode_error='ignore')

或(L2标准化):

VectorizerL2 = TfidfVectorizer(min_df=10,
                               max_df=0.5,
                               stop_words='english',
                               decode_error='ignore',
                               norm=u'l2')

我实例化 k 意味着使用:

km = KMeans(n_clusters=num_clusters, init='random', n_init=1, verbose=0)

然后我继续分割数据以进行交叉验证,矢量化并拟合列车数据集(矢量化器中的X代表' Un'或者' L2')

Vectorized = VectorizerX.fit_transform(TrainData.data)
km.fit(Vectorized)

并将数据分配给火车集中消息的集群

new_msg_vec = VectorizerX.transform([new_msg])
predicted_clust = km_clust.predict(new_msg_vec)[0]

其中new_msg遍历列车数据中的消息。然后,我基于20个新闻组中的消息的已知组标签将群集分配给组(每个群集属于其大多数内容的组),并使用测试数据来表征群集/分类方案的性能。下面是分类错误与没有标准化和L2标准化的矢量化数据的集群数量的关系图:

classification error vs cluster size for k-means on text

误差线是km.fit(Vectorized)步骤10次独立运行后分类错误的标准偏差。这两个结果基本相同。聚类的其他度量(ARI得分,AMI得分,NMI得分)给出了基本相同的图片。

那么,Kmeans是否在内部将向量归一化为L2范数为1,或者TfidfVectorizer norm参数不执行它应该做的事情? (我正在使用scikit-learn 0.14.1)

编辑:我发现这个问题很可能不是Kmeans。如果我使用L1规范化约束进行矢量化(在norm=u'l1'中设置TfidfVectorizer),则聚类错误从45%增加到约80%。我更改了标题以反映这一点。

1 个答案:

答案 0 :(得分:2)

  

Kmeans在内部将向量规范化为L2范数为1,或者TfidfVectorizer范数参数不能达到预期的效果吗?

都不是。正如@ YS-L在评论中所说,TfidfVectorizer的默认行为是对它产生的向量进行L2规范化:

norm : 'l1', 'l2' or None, optional
    Norm used to normalize term vectors. None for no normalization.

,默认值为'l2',因此请将显式norm=None传递给不进行规范化。