将 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 在线(核外)学习相结合
SKLEARN // 将 GridsearchCV 与列变换和管道相结合