読者です 読者をやめる 読者になる 読者になる

学習アルゴリズム以外のscikit-learn便利機能と連携ライブラリ

Python機械学習を使う場合、scikit-learnには何かとお世話になる。 豊富な学習アルゴリズムの実装を利用できるのが長所だが、実はアルゴリズムそのもの以外にも、前処理や評価のための様々な便利機能を有している。 これらを知らずに使っていると,車輪の再発明をしてしまうことになる。

また、機械学習関連のPythonライブラリはscikit-learnと連携できるAPIをもつものも多い。 scikit-learnを中心とするエコシステムが成立しているとも言える。 中にはコードをほとんど書かずに簡単なモデリングができるようなツールまである。

この記事では個々の学習アルゴリズムではなく、scikit-learnに予め用意されている便利機能やscikit-learnと連携できるライブラリなどを紹介する。

便利モジュール・パッケージ

前処理や評価で使われる一般的なテクニックの多くは既に実装されているので、自分で実装する前にまずは API Reference を眺めてみるとよい。 たいていの道具は見つかると思う。

自分がよく使うモジュール・パッケージをいくつか紹介する。

feature_extraction

画像やテキストなどの生データからの特徴抽出・ベクトル化を提供する。 自分の場合、テキストをよく扱うので次のようなクラスをよく使う。

  • DictVectorizer: dictをarrayに変換
  • FeatureHasher: feature hashingによってdictをarrayに変換(テキストデータのオンライン学習等で使う)
  • CountVectorizer: テキストを語の出現回数でBoWベクトル化
  • TfidfVectorizer: テキストをTF-IDFでBoWベクトル化

preprocessing

特徴ベクトルに対して前処理を適用する。

cross_validation

(k-fold) cross validationを手軽に扱う。

metrics

各種評価指標の実装。

grid_search

グリッドサーチによるパラメータを最適化する。

  • GridSearchCV: 与えられたグリッドから最適なパラメータを自動で選ぶモデルを生成

外部ライブラリ

外部ライブラリは細かく挙げていくとキリがないので、主なものだけ紹介する。 もっと調べたい場合は以下のドキュメントを参照。

Related Projects — scikit-learn 0.17.1 documentation

Scikit-Learn Laboratory(SKLL)

用意した設定ファイルに基づいて、モデルの学習や評価などを自動実行する。 簡単な評価程度ならPythonコードを全く書かなくてもいいほど。

設定ファイルはPython configuration file形式で記述する。 以下はTitanicデータセットに対してRandomForest, 決定木, SVM, 等で学習を行い評価するタスクの設定ファイル一例(ここから引用)。

[General]
experiment_name = Titanic_Evaluate_Tuned
task = evaluate

[Input]
train_directory = train
test_directory = dev
featuresets = [["family.csv", "misc.csv", "socioeconomic.csv", "vitals.csv"]]
learners = ["RandomForestClassifier", "DecisionTreeClassifier", "SVC", "MultinomialNB"]
label_col = Survived
id_col = PassengerId

[Tuning]
grid_search = true
objective = accuracy

タスクの実行はCLIで行う。

$ run_experiment evaluate.cfg

結果は次のように出力される。

Fold:
Model Parameters: {"max_depth": 10, "compute_importances": null, "min_density": null, "bootstrap": true, "n_estimators": 500, "verbose": 0, "min_samples_split": 2, "max_features": "auto", "min_samples_leaf": 1, "criterion": "gini", "random_state": 123456789, "max_leaf_nodes": null, "n_jobs": 1, "oob_score": false}
Grid Objective Score (Train) = 0.8089887640449438
+---+-------+------+-----------+--------+-----------+
|   |     0 |    1 | Precision | Recall | F-measure |
+---+-------+------+-----------+--------+-----------+
| 0 | [101] |   14 |     0.871 |  0.878 |     0.874 |
+---+-------+------+-----------+--------+-----------+
| 1 |    15 | [49] |     0.778 |  0.766 |     0.772 |
+---+-------+------+-----------+--------+-----------+
(row = reference; column = predicted)
Accuracy = 0.8379888268156425
Objective Function Score (Test) = 0.8379888268156425

sklearn-pandas

pandasのDataFrameを上記のsklearn.preprocessing等を用いて学習用の入力データに変換する。

これを

data = pd.DataFrame({
    'pet':      ['cat', 'dog', 'dog', 'fish', 'cat', 'dog', 'cat', 'fish'],
    'children': [4., 6, 3, 3, 2, 3, 5, 4],
    'salary':   [90, 24, 44, 27, 32, 59, 36, 27]
})

こうして

mapper = DataFrameMapper([
    ('pet', sklearn.preprocessing.LabelBinarizer()),
    (['children'], sklearn.preprocessing.StandardScaler())
])
np.round(mapper.fit_transform(data.copy()), 2)

こうじゃ!

array([[ 1.  ,  0.  ,  0.  ,  0.21],
       [ 0.  ,  1.  ,  0.  ,  1.88],
       [ 0.  ,  1.  ,  0.  , -0.63],
       [ 0.  ,  0.  ,  1.  , -0.63],
       [ 1.  ,  0.  ,  0.  , -1.46],
       [ 0.  ,  1.  ,  0.  , -0.63],
       [ 1.  ,  0.  ,  0.  ,  1.04],
       [ 0.  ,  0.  ,  1.  ,  0.21]])

ここから引用)。

auto-sklearn

データを与えるだけでアルゴリズム選択・パラメータチューニングを全自動で行い、適切なモデルを生成してくれる。 サンプルコードにあるとおり、人間がやるのは AutoSklearnClassifierインスタンスを生成して fit するだけという便利なのか乱暴なのかよくわからない代物。 手っ取り早くベースラインのモデルを作るにはいいかもしれない。

その他

scikit-learnにはないトピックモデルや構造化学習などのアルゴリズム実装もいろいろある。 自分ではあまり使ったことのないライブラリも含んでるので参考程度にどうぞ。

追記

2016-02-26: scikit-learnにもトピックモデルの実装は含まれているとのこと。 id:another16javac さん、ご指摘ありがとうございます。

学習アルゴリズム以外のscikit-learn便利機能と連携ライブラリ - yubessy.hatenablog.com

実はscikit-learnにもトピックモデルあります http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.LatentDirichletAllocation.html

2016/02/25 01:56