【问题标题】:recreating sparse matrix columns for ML model predictions为 ML 模型预测重新创建稀疏矩阵列
【发布时间】:2018-10-06 08:26:03
【问题描述】:

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

例如:

vectorizer = CountVectorizer(max_features=3000)
sparse_matrix = vectorizer.fit_transform(corpus).toarray()

导出模型后,格式化数据的最佳方式是什么?我想创建预测以匹配训练创建的特征名称?我是否也应该导出(通过泡菜?)vectorizer.get_feature_names() 然后使用它?还是有更好的办法?

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

我也可以在这里完全放弃我的方法,因此感谢您提供任何帮助或建议

谢谢!

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    当你输入时

    vectorizer = CountVectorizer(max_features=3000)
    sparse_matrix = vectorizer.fit_transform(corpus).toarray()
    

    vectorizer 用于匹配您在corpus 中的词汇表

    所以,使用相同的vectorizertransform 另一个数据集,您将看到新数据集的单词频率与corpus 的词汇表相对应

    请记住,您执行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 列作为 FEATURES 来预测标签 y。你正在做的就是所谓的向量空间模型

    【讨论】:

    • 感谢您的帮助。这确实有助于我的理解。但是,假设我有两个文件 - train.py 和 predict.py(显然是为了训练模型,然后在输入上创建预测)。目前我的vectorizer 变量将由训练集在train.py 中定义,因此默认情况下无法在predict.py 中访问它。如果我想将我的训练和预测分开,分享vectorizer 的最佳方式是什么,以便我可以对用作 predict.py 中的输入的数据执行转换?
    • 您必须在 predict 数据集上执行 vectorizer.transform。 “嘿 ML 模型。看看这 8 列。为我找到最佳精度的模式/参数!”,因此模型在训练集上进行训练。训练结束后,你会说“现在你已经训练过了,告诉我你如何适应这个测试集!”如果您适合具有不同列的测试集..那么..好吧..您的模型是在 8 列上训练的..您如何期望它理解这个没有 8 列的新测试集?记住!特征提取/工程不同于模型训练!
    • 对,这就是为什么我问是否将vectorizer.get_feature_names() 导出为由 predict.py 加载的泡菜文件是最好的方法。
    • 啊,我明白了。您将“矢量化器”作为一个整体导出。整个东西。不是“vectorizer.get_feature_names”,它将导出词汇表。转储(矢量化器)不转储(矢量化器.get_feature_names())
    • @wannabe 如果您喜欢我的回答,请随时投票并接受
    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2017-03-31
    • 2021-01-20
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2016-07-29
    相关资源
    最近更新 更多