我的数据是分类为商品的描述和标题。例如,标题为“大而优质的键盘”的键盘在办公>计算机>键盘类别中。
现在,我使用“ from sklearn.feature_extraction.text import TfidfVectorizer”表示我的文本数据。但是矩阵的内存太大。 您有什么技巧可以代表大量数据?
我当时正在考虑使用word-2-vec表示数据,然后使用神经网络进行分类。
答案 0 :(得分:0)
如果您想减小Tfidf向量化的大小,我为您提供了两种选择。
假设您具有以下数据:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
X = ["When I wake up in the morning I always eat apples",
"What do you eat in the morning",
"Usually I only drink coffee",
"How awful, I really cannot stand coffee"]
应用Tfidf变换时,您将获得形状为(4,21)的矩阵:
vectorizer = TfidfVectorizer()
vectorized_X = vectorizer.fit_transform(X)
vectorized_X.shape
>>> (4,21)
现在让我们假设21列太多了,我们想减少它。
您可以使用降维。一旦执行了Tfidf,最自然的是使用截断的SVD。这将对tfidf向量化执行线性降维。这样做的好处是您可以指定希望保留的新组件的数量:
svd = TruncatedSVD(n_components=2)
reduced_X = svd.fit_transform(vectorized_X)
reduced_X.shape
>>> (4,2)
Tfidf允许您指定要在向量化中保留的单词数。然后,它返回仅在术语频率方面对前几个单词执行的向量化。
vectorizer_reduction = TfidfVectorizer(max_features = 5)
vectorized_reduced_X = vectorizer_reduction.fit_transform(X)
vectorized_reduced_X.shape
>>> (4,5)
如果我可以在两者之间进行选择,我会选择选项1 ,因为它首先考虑了所有信息,然后对其进行了汇总,而选项2 只是舍弃了从一开始就提供信息。但是我也希望选项1 需要更长的时间...因此,最佳解决方案可能是两者的混合(首先应用限制性Tfidf,然后应用SVD)?
答案 1 :(得分:0)
我找到了一种训练分类器的解决方案,而不必将所有数据存储在内存中。
假设您有2个数据集用于火车1分类器。
#Data 1
X1_text = ["When I wake up in the morning I always eat apples",
"What do you eat in the morning"]
y1 = [1,1] #target 1
#Data 2
X2_text = ["Usually I only drink coffee",
"How awful, I really cannot stand coffee"]
y2 = [2,2] #target 2
我们使用散列对数据进行矢量化
from sklearn.feature_extraction.text import HashingVectorizer
vectorizer = HashingVectorizer(decode_error='ignore', n_features=2 ** 18)
X1 = vectorizer.transform(X1_text)
X2 = vectorizer.transform(X2_text)
我们将使用partial_fit分两步训练SGDClassifier。 https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html
from sklearn.linear_model.stochastic_gradient import SGDClassifier
clf = SGDClassifier()
第一步,对X1 / y1使用partial_fit。参数类别必须包含所有可能的类别才能进行预测。这是1和2。 注意:例如,如果具有所有目标的变量类,则可以使用classes = np.unique(classes)。请参阅文档。
clf.partial_fit(X1, y1, classes = [1,2])
第二步,用其他数据重新训练分类器。不要使用归因类。
clf.partial_fit(X2, y2)