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があったりする

メタ構文変数,意味のない言葉のリスト

参考:http://dev.classmethod.jp/etc/metasyntactic-variables/

メタ構文変数」とは,fooやbar,日本ではhogeやfugaなど,「意味のない」ことを意味する言葉たちです.一時的に何かをしたいときや,読者に対して「意味がない言葉である」ことを示すためにあえて使われたりします.

上記の記事でいろいろな例が挙げられており,また,メタ構文変数に備わっているべき性質も議論されています.それは「順番がわかるべき」「覚えやすく,判別しやすい」「ある程度の量が用意されている」などです.「順番がわかるべき」というのは,fooのあとはbarを使う,のようにメタ構文変数に順位があることです.これがあることで何番目の変数なのか,前にいくつ意味のない変数があるのかの把握が容易になります.また,「覚えやすく,判別しやすい」というのはそのままの意味です.もしもメタ構文変数としてhoge, honge, holge, horge, hodgeを使ったら,自分でもどれがどれかわからなくなる上に,口頭で人に伝えづらくなります.「ある程度の量が用意されている」というのは,意味のないシリーズの単語が3つで終わり,ではなくちゃんと9個10個ありますか?ということです.3個程度では足りなくなることがあります.

以上を踏まえて,次のようなメタ構文変数が上記の記事で挙げられています:

  • foo, bar, baz, qux, quux, corge, grault, garply, waldo, fred, plugh, xyzzy, thud
    • 順番はfoo,bar,bazあたりまでわかる.しかし,baz以降を覚えている人はあまりいないのでは・・・判別性も微妙.
  • hoge, fuga, piyo, (hogehoge, mogera)...
    • 順番はほぼ無い.私が日本人なので,覚えやすさはある.判別性もそこそこ.しかし,日本でしか通じない.
  • spam, ham, eggs, ...
    • 朝食シリーズ.順番は一応ある.Pythonでよく使われるらしい.種類が少なすぎる?
  • Alice, Bob, Eve, ...
    • 人名シリーズ.暗号界隈で使われる.人物AがAlice,人物BがBob,盗聴者(Eavesdropper)がEveなので順番があるし覚えやすい.判別性もよい.ただし,意味がない文字になっているかと言われると微妙.AliceさんもBobさんも存在するし・・・

他にもいろいろ考えてみました.日本でしか通用しそうにないものも混じっていますが・・・(もし他にあったらぜひ教えてください!):

  • 甲・乙・丙・丁・戊・己・庚・辛・壬・癸
    • 十干シリーズ.順番完璧.種類も10個と多い.しかし,おそらく日本(と中国?)でしか通じない.あと,判別性も微妙.庚と癸に至っては,どちらも「き」である.
  • いろはにほへと...
    • いろはシリーズ.順番完璧.種類も多い.日本でしか通じない.あと,あまりにも単語ひとつが短すぎるので微妙.
  • 丑寅卯辰巳午未申酉戌亥
    • 十二支シリーズ.十干シリーズと同じメリットデメリットを抱える.
  • ドレミファソラシ (Do Re Mi Fa Sol La Si)
    • 音階シリーズ.日本以外でも通じそう(ドレミ,じゃなくてCDE,なことも多いけど).ただし,「ソ」だけ3文字で気に食わないのと,「Do」がやばすぎる*1ので非推奨っぽい.
  • 月火水木金土日 (Mon, Tue, Wed, ...)
    • 曜日シリーズ.世界どこでも通じそう.ただ,意味のない言葉かと言われると微妙.
  • H, He, Li, Be,...
  • 水金地火木土天海 (Mercury, Venus, Earth)
    • 太陽系シリーズ.順番良し.判別性よし.ただ,ちょっと単語ひとつが長いかも.ただし,オシャレである.

*1:doは多くのプログラミング言語で意味を持つ単語である

MCMCサンプリングって何をするもの

MCMC (マルコフ連鎖モンテカルロ法)サンプリングが結局何をしているかというと,
サンプリングという名の通り,未知の確率分布のサンプリングをしている.
例えば未知の確率分布\begin{align*}p(x)\end{align*}を推定したいが,
解析的に解けないので数値的に解くことにする.
そういうとき,MCMCサンプリングによって,(十分大きな)標本列\begin{align*}\{x_i\} \sim p(x)\end{align*}を生成することで,その\begin{align*}\{x_i\}\end{align*}ヒストグラムそのもの,あるいは平均・分散・中央値などから擬似的に確率分布を再現できる.

なぜMCMCベイズ統計学とよく一緒に使われるのかというと,\begin{align*}x\end{align*}がある分布のパラメータだとみなせば,MCMCサンプリングによって得られた標本列\begin{align*}\{x_i\} \sim p(x)\end{align*}で表現できる分布は,パラメータの確率分布だからである.
これがパラメータの確率分布であるということは,まさにベイズ統計でやろうとしていることそのもの.
MCMCベイズ統計学はそれぞれ独自に発達してきた歴史を持つが,現在のところ非常に相性の良い組み合わせと言える.

IPython Notebookの自動カッコ補完を無効にする

http://stackoverflow.com/questions/22843891/turn-off-auto-closing-parentheses-in-ipython

IPython Notebookの自動カッコ補完を無効にするには、
~/.ipython/profile_default/static/custom/custom.js
に次を書き加えば良い:
if (IPython.CodeCell) {
IPython.CodeCell.options_default.cm_config.autoCloseBrackets = false;
}

Windowsにpandocをインストール

うちの環境だけかもしれないけど、pandocをWindowsにインストールしても上手く動いてくれなかった。エラーの内容的に環境変数に追加をミスってるのだと思ってPATHを見てみると、確かに末尾にpandocへのPATHを追加してくれている:

C:\my\existing\pathes;C:\Users\<username>\AppData\Local\Pandoc\

のように。

末尾の"\"を消すと動いた:

C:\my\existing\pathes;C:\Users\<username>\AppData\Local\Pandoc

 

matplotlibのArtistの階層構造

f:id:kaisk:20141201003730p:plain
matplotlibのArtist(ユーザが意識して使っているクラス、FigureとかAxesとかAxisとか)は普通は階層構造を持つことになる。
例えば次のように図を作ると:

>>> fig = plt.figure()
>>> ax1 = fig.add_subplot(211)
>>> line = ax1.plot(np.sin(np.arange(0,10,0.1)))
>>> ax2 = fig.add_subplot(212)
>>> scat = ax2.scatter(*(np.random.rand(2,100)))
>>> fig.show()

次のように階層構造があらわれる:
f:id:kaisk:20141201005510p:plain
f:id:kaisk:20141201005804p:plain

matplotlib.axes.Axesのhelper methodsで作られたArtistsがどのcontainerに格納されるか

参考:Artist tutorial — Matplotlib 1.4.2 documentation

matplotlib.axes.Axes(一番良く使うArtists:subplotとか)のhelper methods(bar, plot, scatterなど)で作られたArtistsがどのcontainerに格納されるか:

Helper method Artist Container
Axes.annotate - text annotations Annotate Axes.texts
Axes.bar - bar charts Rectangle Axes.patches
Axes.errorbar - error bar plots Line2D and Rectangle Axes.lines and Axes.patches
Axes.fill - shared area Polygon Axes.patches
Axes.hist - histograms Rectangle Axes.patches
Axes.imshow - image data AxesImage Axes.images
Axes.legend - axes legends Legend Axes.legends
Axes.plot - xy plots Line2D Axes.lines
Axes.scatter - scatter charts PolygonCollection Axes.collections
Axes.text - text Text Axes.texts

`patches`だけちょっとわかりにくいが、長方形全般を格納するcontainer。


そもそもAxesがどういったcontainer(と属性)を持っているか、代表的なものを挙げると:

Axes attribute Description
Axes.artists A list of Artist instances
Axes.patch Rectangle instance for Axes background
Axes.collections A list of Collection instances
Axes.images A list of AxesImage
Axes.legends A list of Legend instances
Axes.lines A list of Line2D instances
Axes.patches A list of Patch instances
Axes.texts A list of Text instances
Axes.xaxis matplotlib.axis.XAxis instance
Axes.yaxis matplotlib.axis.YAxis instance

特に、`patch`と`patches`が紛らわしいので注意。
`patch`がAxesの背景の長方形(つまりひとつ)、`patches`がAxesが持ってる長方形のcontainer(つまりhist()とかで生成される長方形のリスト)。