20723


`sklearn`でKMeansを利用しようと考えています。  
<https://github.com/luispedro/BuildingMachineLearningSystemsWithPython/blob/master/ch03/rel_post_20news.py>  
上記のサンプルを参考にしています。  
上記サンプルの[L58](https://github.com/luispedro/BuildingMachineLearningSystemsWithPython/blob/master/ch03/rel_post_20news.py#L58)で`TfidfVectorizer.fit_transform()`で学習データをベクトル化し、[L91](https://github.com/luispedro/BuildingMachineLearningSystemsWithPython/blob/master/ch03/rel_post_20news.py#L91)で新しいクラスタリング対象のデータを`TfidfVectorizer.transform()`でベクトル化しています。

これは、必ず`fit_transform()`を呼び出してから`transform()`を呼びださなければならないのでしょうか。  
もしそうなら、`fit_transform()`した状態を保存しておき新しい対象に対しては`fit_transform()`を省略することはできるでしょうか。


CC BY-SA 3.0
2016-01-02T22:12:55.560
20549
2016-01-07T19:28:31.120
2016-01-03T14:09:25.580
3639
7232
question
python 機械学習 scikit-learn
sklearnのTfidfVectorizerについて


学習データのベクトル化と、新しいデータのベクトル化は独立した操作なので、必ずしもfit_transform()を呼び出してからtransform()を呼びなさないといけないわけではありません。fit_transform()で作られたベクトルをディスクに保存しておけば、後からロードすることができます。

`vectorized`の型は`scipy.sparse.csr.csr_matrix`なので`.toarray()`でnumpyの形式に変換してから保存すればいいと思います。復元はその逆の操作になります。

[code]

    import numpy
    import scipy.sparse.csr
    
    # vectorizedはgithubの例にあるようにvectorizer.fit_transform(...)で得られたもの
    
    # 保存
    numpy.save('my_vector', vectorized.toarray())
    
    # 復元 なぜかファイル名は拡張子をつけないとロードできない
    vectorized2 = scipy.sparse.csr.csr_matrix(numpy.load('my_vector.npy'))
    
    # 値の同一性の確認
    print (vectorized.toarray() == vectorized2.toarray()).all()
    
[/code]


CC BY-SA 3.0
2016-01-07T19:28:31.120
20723
2016-01-07T19:28:31.120
7837
20549
answer