keisukeのブログ

***乱雑です!自分用のメモです!*** 統計や機械学習の勉強と、読み物を書く練習と、備忘録用のブログ

【scikit-learn】変数やメソッドの命名規則

参考:http://scikit-learn.org/stable/developers/#apis-of-scikit-learn-objects

自分の理解の整理も兼ねて、scikit-learnの公式ドキュメントの、特に
「規則」の部分について日本語でまとめます。
全体的にscikit-learnではAPIや命名が非常によく規則だっており、異なる種類の処理を同じコードで記述するのが容易です。

メソッドAPI

sckit-learnのobjectsは次のメソッドを持つべきである*1

Estimatorのオブジェクト - fit()

データからパラメータの学習をおこなう。
Supervisedの場合

obj.fit(data, targets)

Unsupervisedの場合

obj.fit(data)
Predictorのオブジェクト - predict()

学習したパラメータを使って、新しいデータの処理をおこなう。

obj.predict(new_data)

タスクがClassificationの場合、定量化された値を返すために、

obj.predict_proba(new_data)

が用意されていることがある。この場合、返り値はそれぞれのクラスに属する確率を表すリストとなる。
また、確率ではないような場合、

obj.decision_function(new_data)

でリストを返すこともある。

Transformerのオブジェクト - transform()

フィルタリングをおこなったり、次元の削減をしたりして、データの表現を変換する。

transformed_data = obj.transform(data)

ちなみに、もしもfit()を事前におこなっているなら、fit()を分離して記述するよりも、fit_transform(data)を用いて同時にEstimatorとTransformerに仕事をさせたほうが(基本的に)効率が良い。

Modelのオブジェクト - score()

学習したパラメータがどれだけ新しいデータを表現できているかを測る。

score = obj.score(new_data)

尤度とか二乗誤差の和とか。高いほど良いモデルとなるように正規化されている。つまり、二乗誤差の和の場合、マイナスをかける(または逆数をとる)などしてひっくり返しているので、ユーザは常にscoreが高いモデルを良いモデルだと思えば良い。細かいことはscikit-learnがやってくれる。

初期化(ハイパーパラメータ)

ハイパーパラメータ(学習により決定できないので、事前に決めないといけないパラメータ)*2は、objectsの初期化の時に指定する:

obj = SVC(C=2)

など。ちなみに、obj = SVC(); obj.set_params({'C':2})としても良いが、fit()したあとにハイパーパラメータを変えたりするのは混乱のもとなので初期化の段階でハイパーパラメータは全て指定するのが好ましい。*3

fit()の引数 X, y, kwargs

Estimatorのオブジェクトはfit(X, y, kwargs)というAPIでフィッティングができる(Unsupervisedなら y は省略する。省略する代わりに y = None でも良い。kwargsはオプション)。Xは、[N, D]次元の行列(Nサンプル、D特徴)。yは[N]のリスト*4(Nサンプル)。kwargsはフィッティングのときに指定できるオプション。別になくても良いように設計はされている。特別なことがしたいなら指定する*5

学習したパラメータ

学習したパラメータは、underscore(下線、「_」のこと)を最後につけることで区別する。つまり、fit()によって得られたパラメータはobj.coef_などとして参照できる(obj.coefではない)。

*1:ここでいう「objects」とは、例えば obj = linear_model.LinearRegression()などのこと。

*2:とはいっても交差検定などで候補から(実験的に)最も良さそうなものを選べることが多い

*3:set_params()は交差検定の自動化などで便利

*4:リストというかnumpy.array

*5:Perceptronのfit()などにkwargsがあったりする