Python 为ML模型预测重新创建稀疏矩阵列

Python 为ML模型预测重新创建稀疏矩阵列,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我一直在使用sklearn开发一个模型,其中很大一部分使用CountVectorizer()函数从训练集中的一组字符串创建稀疏矩阵 例: 导出模型后,我希望创建预测以匹配训练创建的特征名称的数据格式的最佳方式是什么?我是否应该导出(通过pickle?矢量器。同时获取特性名称(),然后使用它?还是有更好的办法 换句话说,如果在我的训练集中矢量器.get_feature_names()=['apple','dog','cat']我想对'hello cat'进行预测,那么我对预测请求的特征提取方法应该

我一直在使用sklearn开发一个模型,其中很大一部分使用
CountVectorizer()
函数从训练集中的一组字符串创建稀疏矩阵

例:

导出模型后,我希望创建预测以匹配训练创建的特征名称的数据格式的最佳方式是什么?我是否应该导出(通过pickle?
矢量器。同时获取特性名称()
,然后使用它?还是有更好的办法

换句话说,如果在我的训练集中
矢量器.get_feature_names()=['apple','dog','cat']
我想对
'hello cat'
进行预测,那么我对预测请求的特征提取方法应该是什么?如果我错了,请纠正我,但特征提取的结果需要是
[0,0,1]
才能匹配模型

我也可以完全放弃我的方法,所以任何帮助或建议都将不胜感激

谢谢

当你打字时

vectorizer = CountVectorizer(max_features=3000)
sparse_matrix = vectorizer.fit_transform(corpus).toarray()
矢量器
用于匹配
语料库

因此,使用相同的
vectorizer
转换另一个数据集,您将看到与
语料库

请记住,您执行
fit_transform(X)
来说“使用
X
的词汇表”,并且只执行一次。然后你只需要做
tranform(Y)
,作为一种表达方式,“无论你对X使用了什么,都将它们作为列,并将
Y
中的术语放入这些
X
列中

from sklearn.feature_extraction.text import CountVectorizer
corpus = ['love dogs, hate cows, and also pigs, actually dogs too']
vectorizer = CountVectorizer(max_features=3000)
sparse_matrix = vectorizer.fit_transform(corpus)
df = pd.DataFrame(sparse_matrix.toarray())
df.columns = vectorizer.get_feature_names()
print(df)
我会给你这个:

   actually  also  and  cows  dogs  hate  love  pigs  too
0         1     1    1     1     2     1     1     1    1
然后:

test = vectorizer.transform(['hello cat']) #Notice how I use transform and not fit_transform
df = pd.DataFrame(test.toarray())
df.columns = vectorizer.get_feature_names()
print(df)

   actually  also  and  cat  cows  dogs  hate  love  pigs  too
0         0     0    0    1     0     0     0     0     0    0
请注意,
hello cat
是如何与调用了
fit_transform
的词汇表相匹配的。因此,在特征提取中,您可以将您的“hello cat”与调用的
fit_transform
词汇表相匹配


现在,使用所有这10列作为特性来预测标签
y
。您所做的被称为向量空间模型

谢谢您的帮助。这确实有助于我的理解。但是,假设我有两个文件-train.py和predict.py(显然是为了训练模型,然后根据输入创建预测)。当前,我的
矢量器
变量将由训练集在train.py中定义,因此默认情况下无法在predict.py中访问它。如果我想将训练和预测分开,共享
矢量器
的最佳方式是什么,以便我可以对predict.py中用作输入的数据执行转换?您必须在
predict
数据集上执行
vectorizer.transform
。“嘿,ML模型。看看这8列。为我找到最佳精度的模式/参数!,所以模型在训练集上训练。训练后,你说“既然你已经训练过了,告诉我你如何适应这个测试集!”!“如果你用不同的列安装测试集..那么..好吧..你的模型是在8列上训练的..你希望它如何理解这个没有8列的新测试集?记住!特征提取/工程与模型训练不同!对,这就是为什么我问是否导出
矢量器。获取特征名称()
作为pickle文件由predict.py加载是实现这一点的最佳方法。啊,我明白了。您将“矢量化器”作为一个整体导出。整个过程。而不是将导出词汇表的“矢量化器。获取特征名称”。dump(矢量化器)而不是dump(矢量化器。获取特征名称()@如果你喜欢我的答案,请随意投票并接受
test = vectorizer.transform(['hello cat']) #Notice how I use transform and not fit_transform
df = pd.DataFrame(test.toarray())
df.columns = vectorizer.get_feature_names()
print(df)

   actually  also  and  cat  cows  dogs  hate  love  pigs  too
0         0     0    0    1     0     0     0     0     0    0