Python 将特征稀疏矩阵与sklearn混合的正确方法是什么?
前几天,我正在处理一项机器学习任务,需要提取几种类型的特征矩阵。我将此特征矩阵保存为磁盘中的numpy数组,以便以后在某些估计器中使用它们(这是一项分类任务)。毕竟,当我想使用所有的特征时,我只是将矩阵串联起来,以获得一个大的特征矩阵。当我得到这个大的特征矩阵时,我把它交给了一个估计器 我不知道这是否是处理包含大量模式(计数)的特征矩阵的正确方法我应该使用哪些其他方法来正确混合几种类型的功能?。然而,通过查看文档,我发现它似乎可以完成这项任务 例如,假设我想创建一个包含3种矢量化方法的大型特征矩阵Python 将特征稀疏矩阵与sklearn混合的正确方法是什么?,python,numpy,pandas,scikit-learn,Python,Numpy,Pandas,Scikit Learn,前几天,我正在处理一项机器学习任务,需要提取几种类型的特征矩阵。我将此特征矩阵保存为磁盘中的numpy数组,以便以后在某些估计器中使用它们(这是一项分类任务)。毕竟,当我想使用所有的特征时,我只是将矩阵串联起来,以获得一个大的特征矩阵。当我得到这个大的特征矩阵时,我把它交给了一个估计器 我不知道这是否是处理包含大量模式(计数)的特征矩阵的正确方法我应该使用哪些其他方法来正确混合几种类型的功能?。然而,通过查看文档,我发现它似乎可以完成这项任务 例如,假设我想创建一个包含3种矢量化方法的大型特征矩
TfidfVectorizer
,CountVectorizer
和HashingVectorizer
,这是我在以下方面尝试的:
然后:
拆分数据:
from sklearn import cross_validation
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X_combined_features,y, test_size=0.33)
所以我有几个问题:
这是混合多个特征提取器以生成大型特征矩阵的正确方法吗?和假设我创建了自己的“矢量器”,它们返回稀疏矩阵,我如何正确使用FeatureUnion接口将它们与上述3个特征混合?
更新
假设我有这样一个矩阵:
矩阵A((152,33)
)
然后使用返回a的矢量器,我得到以下特征矩阵:
矩阵B((152,10)
)
矩阵C((152,46)
)
如何将A、B和C与numpy.hstack
、scipy.sparse.hstack
或FeatureUnion
正确合并。你们认为对于任何机器学习任务来说,这是一种正确的管道方法吗
为了生成一个大的特征矩阵,混合使用多个特征提取器是正确的方法吗
就结果的正确性而言,您的方法是正确的,因为FeatureUnion
在输入数据上运行每个单独的转换器,并水平连接结果矩阵。然而,这不是唯一的方法,哪种方法在效率方面更好将取决于您的用例(稍后将对此进行详细介绍)
假设我创建了自己的“矢量器”,它们返回稀疏矩阵,我如何正确使用FeatureUnion接口将它们与上述3个功能混合
使用FeatureUnion
,您只需将新变压器附加到变压器列表中:
custom_vect = YourCustomVectorizer()
combined_features = FeatureUnion([("tfidf_vect", tfidf_vect),
("bow", bow),
("hash", hash_vect),
("custom", custom_vect])
但是,如果您的输入数据和大多数变压器是固定的(例如,当您尝试包含新变压器时),上述方法将导致许多重新计算。在这种情况下,另一种方法是预计算存储转换器的中间结果(矩阵或稀疏矩阵),并在需要时使用numpy.hstack
或scipy.sparse.hstack
手动连接它们
如果您的输入数据总是在变化,但变压器列表是固定的,FeatureUnion
提供了更多的便利。它的另一个优点是可以选择n_jobs
,这有助于您并行化装配过程
旁注:将哈希向量器与其他向量器混合使用似乎有点奇怪,因为哈希向量器通常在您无法使用确切版本时使用。谢谢您的帮助。我想到的一件事是尺寸如何?。我如何合并矩阵来考虑维度?你能详细解释一下你所说的“考虑”维度是什么意思吗?在numpy/scipy中使用适当的堆叠函数,合并维度(X.shape[1])是各个特征矩阵维度的总和。感谢支持,我用一个例子编辑了这个问题。我认为您必须在
FeatureUnion
和hstack
之间进行选择。本质上,hstack
方法与手动执行FeatureUnion
的工作相同。选择其中一个,但不能同时选择两个。最后,你能提供一个例子,以便更好地了解这个问题吗?。谢谢你的帮助!
from sklearn import cross_validation
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X_combined_features,y, test_size=0.33)
[[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
...,
[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]]
[[4210 228 25 ..., 0 0 0]
[4490 180 96 ..., 10 4 6]
[4795 139 8 ..., 0 0 1]
...,
[1475 58 3 ..., 0 0 0]
[4668 256 25 ..., 0 0 0]
[1955 111 10 ..., 0 0 0]]
[[ 0 0 0 ..., 0 0 0]
[ 0 0 0 ..., 0 0 17]
[ 0 0 0 ..., 0 0 0]
...,
[ 0 0 0 ..., 0 0 0]
[ 0 0 0 ..., 0 0 0]
[ 0 0 0 ..., 0 0 0]]
custom_vect = YourCustomVectorizer()
combined_features = FeatureUnion([("tfidf_vect", tfidf_vect),
("bow", bow),
("hash", hash_vect),
("custom", custom_vect])