tum*_*eed 5 python numpy pandas scikit-learn
前几天,我正在处理一项需要提取多种类型特征矩阵的机器学习任务。我将此特征矩阵保存为磁盘中的 numpy 数组,以便稍后在某些估计器中使用它们(这是一项分类任务)。毕竟,当我想使用所有特征时,我只是将矩阵连接起来以获得一个大的特征矩阵。当我获得这个大的特征矩阵时,我将它提交给了一个估算器。
我不知道这是否是处理包含大量模式(计数)的特征矩阵的正确方法。我应该使用哪些其他方法来正确混合多种类型的功能?. 但是,通过查看文档,我发现FeatureUnion似乎可以完成此任务。
例如,比方说,我想创建的3矢量化接近一大特征矩阵TfidfVectorizer,CountVectorizer并且HashingVectorizer这是我尝试下面的文档例子:
#Read the .csv file
import pandas as pd
df = pd.read_csv('file.csv',
header=0, sep=',', names=['id', 'text', 'labels'])
#vectorizer 1
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vect = TfidfVectorizer(use_idf=True, smooth_idf=True,
sublinear_tf=False, ngram_range=(2,2))
#vectorizer 2
from sklearn.feature_extraction.text import CountVectorizer
bow = CountVectorizer(ngram_range=(2,2))
#vectorizer 3
from sklearn.feature_extraction.text import HashingVectorizer
hash_vect = HashingVectorizer(ngram_range=(2,2))
#Combine the above vectorizers in one single feature matrix:
from sklearn.pipeline import FeatureUnion
combined_features = FeatureUnion([("tfidf_vect", tfidf_vect),
("bow", bow),
("hash",hash_vect)])
X_combined_features = combined_features.fit_transform(df['text'].values)
y = df['labels'].values
#Check the matrix
print X_combined_features.toarray()
Run Code Online (Sandbox Code Playgroud)
然后:
[[ 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.]]
Run Code Online (Sandbox Code Playgroud)
拆分数据:
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)
Run Code Online (Sandbox Code Playgroud)
所以我有几个问题: 这是混合多个特征提取器以产生大特征矩阵的正确方法吗?并假设我创建了自己的“向量化器”并且它们返回稀疏矩阵,我如何正确使用 FeatureUnion 接口将它们与上述 3 个特征混合?.
更新
假设我有一个这样的矩阵:
矩阵 A ( (152, 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.]]
Run Code Online (Sandbox Code Playgroud)
然后使用返回一个numpy 数组的向量化器,我得到这个特征矩阵:
矩阵 B ( (152, 10))
[[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]]
Run Code Online (Sandbox Code Playgroud)
矩阵 C ( (152, 46))
[[ 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]]
Run Code Online (Sandbox Code Playgroud)
如何将 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])
Run Code Online (Sandbox Code Playgroud)
但是,如果您的输入数据和大多数变压器是固定的(例如,当您尝试包含新变压器时),上述方法将导致许多重新计算。在这种情况下,另一种方法是预先计算存储变换器的中间结果(矩阵或稀疏矩阵),并使用numpy.hstack或scipy.sparse.hstack在需要时手动连接它们。
如果您的输入数据总是在变化但转换器列表是固定的,则FeatureUnion提供更多便利。它的另一个优点是它具有 选项n_jobs,可帮助您并行化拟合过程。
旁注:将散列向量化器与其他向量化器混合使用似乎有点奇怪,因为散列向量化器通常在您无法负担使用精确版本时使用。
| 归档时间: |
|
| 查看次数: |
3017 次 |
| 最近记录: |