将 Sklearn TFIDF 与其他数据相结合

Posted

技术标签:

【中文标题】将 Sklearn TFIDF 与其他数据相结合【英文标题】:Combine Sklearn TFIDF with Additional Data 【发布时间】:2017-03-27 00:00:46 【问题描述】:

我正在尝试为监督学习准备数据。我有我的 Tfidf 数据,它是从我的数据框中名为“合并”的列生成的

vect = TfidfVectorizer(stop_words='english', use_idf=True, min_df=50, ngram_range=(1,2))
X = vect.fit_transform(merged['kws_name_desc'])
print X.shape
print type(X)

(57629, 11947)
<class 'scipy.sparse.csr.csr_matrix'>

但我还需要在这个矩阵中添加额外的列。对于 TFIDF 矩阵中的每个文档,我都有一个附加数字特征的列表。每个列表的长度为 40,它由浮点数组成。

为了澄清,我有 57,629 个长度为 40 的列表,我想将它们附加到我的 TDIDF 结果中。

目前,我在 DataFrame 中有这个,示例数据:merged["other_data"]。下面是来自合并的 ["other_data"]

的示例行
0.4329597715,0.3637511039,0.4893141843,0.35840...   

如何将我的数据框列的 57,629 行附加到 TF-IDF 矩阵?老实说,我不知道从哪里开始,并希望得到任何指示/指导。

【问题讨论】:

这能回答你的问题吗? use Featureunion in scikit-learn to combine two pandas columns for tfidf 【参考方案1】:

这样就可以了。

`df1 = pd.DataFrame(X.toarray())   //Convert sparse matrix to array
 df2 = YOUR_DF of size 57k x 40

 newDf = pd.concat([df1, df2], axis = 1)`//newDf is the required dataframe

【讨论】:

【参考方案2】:

我想通了:

首先:遍历我的 pandas 列并创建一个列表列表

for_np = []

for x in merged['other_data']:
    row = x.split(",")
    row2 = map(float, row)
    for_np.append(row2)

然后创建一个np数组:

n = np.array(for_np)

然后在 X 上使用 scipy.sparse.hstack(我的原始 tfidf 稀疏矩阵和我的新矩阵。如果它们不能改善分类结果,我可能最终会重新加权这些 40 维向量,但这种方法有效!

import scipy.sparse

X = scipy.sparse.hstack([X, n])

【讨论】:

我确信我环顾四周,忽略了尝试添加列时遗漏的内容。有人在另一个问题上说得很清楚,但它只是点击了上面的这一行。 oups 命中返回,hstack(X_train_tfidf,X_shp) 不起作用,但 hstack([X_train_tfidf,X_shp]) 起作用,区别在于 [ ]。 这真是一个有趣的问题和解决方案。如果您缩放额外的列或按原样使用它们,您能否补充一些想法? @IU5er - 如果我没记错的话,我尝试了 tfidf 功能的各种权重,但它们并没有太大改善我的结果,所以我放弃了它们。我可能会附加一个 PCA 的降级版本的结果,但结果可能是相同的。我认为将 NLP 风格特征与更通用的特征相结合仍然是一个非常开放的问题/问题。在最近的一个问题中,我创建了二进制特征,基于训练观察是否包含一个单词,或者包含多个单词中的一个,从而避免了大量的新特征。【参考方案3】:

你可以看看这个问题的答案:

use Featureunion in scikit-learn to combine two pandas columns for tfidf

显然,给出的答案应该有效,但是一旦您希望分类器进行预测,您肯定希望使用管道和特征联合。

【讨论】:

以上是关于将 Sklearn TFIDF 与其他数据相结合的主要内容,如果未能解决你的问题,请参考以下文章

如何将训练集特定的学习参数与 sklearn 在线(核外)学习相结合

如何将 tfidf 特征与自制特征结合起来

SKLEARN // 将 GridsearchCV 与列变换和管道相结合

使用 sklearn 计算两个不同列的单独 tfidf 分数

向 Sklearn 分类器添加功能

如何从管道中的 sklearn TFIDF Vectorizer 返回数据帧?