2016-11-02 4 views
1

私はPandas Dataframeにあるトレーニングデータセットを持っています。私はTfIdf Vectorizationを使って機能を取得し、Kmeansを実行しました。ここに関連するコードは次のとおりです。ScikitでTfidfVectorizerと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] 

、私はエラーを取得するテストデータを実行しようとします。ここにテストデータ用に実行しているコードがあります。私は基本的にパンダのテストデータフレームから各行を取り出し、上記の同じベクトル化ツールに適合させています。私はそれを間違っているのですか? rowX = vectorizer.fit(testVectorizerArray)行で

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)) 

、私は次のエラーを取得しています:

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

私はStackOverflowの通過を検索し、私が1次元配列としてtest_data配列をフォーマットする必要があると思われます。私はチェックし、test_dataは(n,)の形式です。しかし、私はまだエラーが発生しています。私のアプローチに何か問題はありますか?あなたは、テスト段階でベクトライザーを再装着すべきではない

答えて

2

あなたはパイプラインでベクトライザーと分類器を組み合わせた場合、あなたのコードがきれいになります:

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)) 
+0

しかし '行[6]'文字列です。したがって、トレーニングデータ全体に関してTfIdfを取得して、選択したフィーチャの得点を確認する必要があります。あなたのソリューションは機能します。しかし、私のアプローチの問題は何でしたか? –

+1

トレーニングデータと初めてフィットすると、ベクタライザは用語頻度と語彙を保存し、後で予測を呼び出すときにこれらの格納された値を使用します。 – maxymoo

+0

はい、それは私がやりたかったことです。 'test_data'の' vectorizer'で内部的に呼び出す関数を知っていますか?ところで、ありがとうございました。私はこれを非常に理解することに苦労していました。 –

関連する問題