【问题标题】:How do I do prediction after fitting TfidfVectorizer and KMeans in Scikit learn?在 Scikit 学习中拟合 TfidfVectorizer 和 KMeans 后如何进行预测?
【发布时间】:2017-03-15 05:06:21
【问题描述】:

我有一个训练数据集,它位于 Pandas Dataframe 中。我已经完成了 TfIdf 矢量化以获取功能并运行 Kmeans。以下是相关代码:

vectorizer = TfidfVectorizer(max_df=0.8, max_features=max_feat, norm="l1", analyzer="word",
                                 min_df=0.1,ngram_range=(1,2)
                                 )

X = vectorizer.fit_transform(df['reviews'])
km = KMeans(n_clusters=number, init='k-means++', max_iter=100, n_init=3,
                    verbose=1, n_jobs = -2)
km.fit(X)

我可以通过这个得到质心:

order_centroids = km.cluster_centers_.argsort()[:, ::-1]

现在,当我尝试运行测试数据时出现错误。这是我为测试数据运行的代码。我基本上是从 Panda 的测试数据框中取出每一行,并放入上面的同一个矢量化器中。我做错了吗?

sample = df.tail(int(totalTestRows * lineLimit))

for row in sample.itertuples():
    test_data = np.array([row[6]])
    testVectorizerArray = vectorizer.transform(test_data).toarray()
    rowX = vectorizer.fit(testVectorizerArray)
    print(km.predict(rowX))

在rowX = vectorizer.fit(testVectorizerArray) 行,我收到以下错误:

AttributeError: 'numpy.ndarray' object has no attribute 'lower'

我通过 StackOverflow 进行了搜索,似乎我需要将 test_data 数组格式化为一维数组。我检查过,test_data 的格式为(n,)。但是,我仍然遇到错误。我的方法有什么问题吗?

【问题讨论】:

    标签: python scikit-learn k-means


    【解决方案1】:

    您不应该在测试阶段重新调整矢量化器,如果您将矢量化器和分类器与管道相结合,您的代码会更简洁:

    from sklearn.pipeline import make_pipeline
    vectorizer = TfidfVectorizer(max_df=0.8, max_features=max_feat, norm="l1", analyzer="word",
                                     min_df=0.1,ngram_range=(1,2)
                                     )   
    km = KMeans(n_clusters=number, init='k-means++', max_iter=100, n_init=3,
                        verbose=1, n_jobs = -2)
    clf = make_pipeline(vectorizer, km)
    clf.fit(X)
    
    
    sample = df.tail(int(totalTestRows * lineLimit))
    
    for row in sample.itertuples():
        test_data = np.array([row[6]])
        print(clf.predict(test_data))
    

    【讨论】:

    • 但是row[6] 是一个字符串。因此,我需要获取它相对于整个训练数据的 TfIdf,以查看它对所选特征的评分。您的解决方案有效。但我的方法有什么问题?
    • 当您第一次使用训练数据执行fit 时,矢量化器会存储术语频率和词汇,并在您稍后调用 predict 时使用这些存储的值。
    • 好的。是的,这就是我想做的。你知道它在vectorizer 内部为test_data 调用了哪个函数。顺便说一句,非常感谢你。我很难理解这一点。
    • 不用担心,在管道内部它第一次内部调用fit_transform,然后只是transform 其他时间
    • 好的,但我做了同样的事情。我在vectorizer 上打电话给fit_transform,然后在km 上打电话给predict。但它没有用。你的意思是它在fit_transform 之后再次在vectorizer 上调用transform?我只是想知道手动步骤。我知道您的代码看起来很有条理。
    猜你喜欢
    • 2020-03-24
    • 2017-04-19
    • 2014-12-06
    • 2019-02-07
    • 2013-12-05
    • 1970-01-01
    • 2018-06-03
    • 2020-10-07
    • 2017-07-11
    相关资源
    最近更新 更多