Python
scikit-learn

scikit-learnのtutorialをやってみた(Working With Text Data: Exercise 1)

pythonとscikit-learnの勉強を兼ねてscikit-learnのtutorialに取り組んでみたので、メモ書きします。

環境

  • Fedora 25(4.13.16-100.fc25.x86_64)
  • Python 3.5.4(venv)

資料

チュートリアル

今回取り組むエクササイズ1は"text_analytics/data/languages/paragraphs/"に言語別に分けて保存されているデータを学習させ、入力データがどの言語で記述されたテキストか判定するモデルを作成する課題です。

  • 学習データ

"exercise_01_language_train_model.py"に入力データの事前処理と学習部分が穴埋めになっているので適切に処理するコードを記述します。編集する箇所は以下です。

  • TASK: Build a vectorizer that splits strings into sequence of 1 to 3
    データを1文字から3文字に分割する。
  • TASK: Build a vectorizer / classifier pipeline using the previous analyzer
    モデルを選択し、Pipelineインスタンスを作成する。
clfexercise_01_language_train_model.py
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.naive_bayes import MultinomialNB                                      
clf = Pipeline([('vect', CountVectorizer(input='content',max_features=2000, analyzer='char', ngram_range=(1,3))),('tfidf', TfidfTransformer()),('clf',MultinomialNB()),])
  • TASK: Fit the pipeline on the training set
    学習データを使ってモデルを学習させる。
clfexercise_01_language_train_model.py
clf.fit(docs_train, y_train)
  • TASK: Predict the outcome on the testing set in a variable named y_predicte テストデータを使ってモデルの性能を評価する。
clfexercise_01_language_train_model.py
y_predicted = clf.predict(docs_test)

結果

実行結果は以下のような感じ。

(test_venv) [user@localhost workspace]$ python exercise_01_language_train_model.py ../text_analytics/data/languages/paragraphs
/home/user/Workspace/test_venv/lib64/python3.5/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.
  'precision', 'predicted', average, warn_for)
             precision    recall  f1-score   support

     ar       1.00      1.00      1.00        11
     de       0.74      0.99      0.85        81
     en       0.79      1.00      0.88        76
     es       0.82      1.00      0.90        54
     fr       1.00      1.00      1.00        68
     it       1.00      0.67      0.80        42
     ja       1.00      1.00      1.00        38
     nl       0.00      0.00      0.00        23
     pl       1.00      0.05      0.09        21
     pt       1.00      0.96      0.98        50
     ru       1.00      1.00      1.00        26


avg / total       0.86      0.88      0.84       490

[[11  0  0  0  0  0  0  0  0  0  0]
 [ 0 80  1  0  0  0  0  0  0  0  0]
 [ 0  0 76  0  0  0  0  0  0  0  0]
 [ 0  0  0 54  0  0  0  0  0  0  0]
 [ 0  0  0  0 68  0  0  0  0  0  0]
 [ 0  0  2 12  0 28  0  0  0  0  0]
 [ 0  0  0  0  0  0 38  0  0  0  0]
 [ 0 22  1  0  0  0  0  0  0  0  0]
 [ 0  4 16  0  0  0  0  0  1  0  0]
 [ 0  2  0  0  0  0  0  0  0 48  0]
 [ 0  0  0  0  0  0  0  0  0  0 26]]

分割数を1文字から3文字ではなく、3文字から5文字にすると精度が良くなった。
clfexercise_01_language_train_model.py
clf = Pipeline([('vect', CountVectorizer(input='content',max_features=2000, analyzer='char', ngram_range=(3,5))),('tfidf', TfidfTransformer()),('clf',MultinomialNB()),])
(test_venv) [user@localhost workspace]$ python exercise_01_language_train_model.py ../text_analytics/data/languages/paragraphs
             precision    recall  f1-score   support

         ar       1.00      0.86      0.92        14
         de       0.88      0.99      0.93        78
         en       0.92      1.00      0.96        76
         es       1.00      1.00      1.00        64
         fr       1.00      1.00      1.00        72
         it       0.98      1.00      0.99        40
         ja       1.00      0.96      0.98        25
         nl       1.00      0.52      0.69        21
         pl       1.00      0.83      0.91        24
         pt       1.00      0.98      0.99        48
         ru       1.00      1.00      1.00        28

avg / total       0.97      0.96      0.96       490

[[12  0  2  0  0  0  0  0  0  0  0]
 [ 0 77  1  0  0  0  0  0  0  0  0]
 [ 0  0 76  0  0  0  0  0  0  0  0]
 [ 0  0  0 64  0  0  0  0  0  0  0]
 [ 0  0  0  0 72  0  0  0  0  0  0]
 [ 0  0  0  0  0 40  0  0  0  0  0]
 [ 0  0  1  0  0  0 24  0  0  0  0]
 [ 0 10  0  0  0  0  0 11  0  0  0]
 [ 0  1  3  0  0  0  0  0 20  0  0]
 [ 0  0  0  0  0  1  0  0  0 47  0]
 [ 0  0  0  0  0  0  0  0  0  0 28]]

次の課題

そのうち