学習アルゴリズム以外の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
特徴ベクトルに対して前処理を適用する。
- scale: 標準正規分布にスケーリング
- minmax_scale, maxabs_scale:
[0, 1]
[-1, 1]
などの範囲にスケーリング - normalize: 各ベクトルのノルムを正規化
- label_binalize: カテゴリ特徴を二値化
- LabelEncoder: ラベルを数値にエンコード
- PolynomialFeatures: 多項式による組み合わせ特徴を生成
cross_validation
(k-fold) cross validationを手軽に扱う。
- train_test_split: データセットを訓練セットとテストセットに分割
- cross_val_score: k-fold cross validation により各foldの評価スコアを算出
metrics
各種評価指標の実装。
- accuracy_score: 精度
- f1_score: F値
- precision_score, recall_score: 適合率, 再現率
- auc: AUC
- mean_squared_error: MSE
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にはないトピックモデルや構造化学習などのアルゴリズム実装もいろいろある。
自分ではあまり使ったことのないライブラリも含んでるので参考程度にどうぞ。
- https://github.com/ariddell/lda/:lda: LDA
- PyStruct: CRF等の構造化学習
- HMMLearn: 隠れマルコフモデル
- sklearn-compiledtrees: 決定木のアンサンブルモデル(RandomForest, GradientBoostedTree)をコンパイルして高速化
追記
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