環境構築はじめにこの記事を読むことで、scikit-learnの中身のコードに改変を加えることができるようになることを期待している。改変に必要な知識も学習できるようリンクを用意してある。改変を加えたコードをpipで管理する方法も示した。最後には具体例として、決定木のfeature_importances_を可視化するメソッドをDecisionTreeClassifierに組み込む。本記事をおすすめしない人Pythonのリスト、タプル、辞書の違いは?と聞かれて答えられない方。前半(6章まで)だけでいいのでPythonのチュートリアルをやりましょう。https://docs.python.org/ja/3/tutorial/自分のPythonの環境をすぐに切り替えられない方まずは仮想環境の作り方やpyenvの使い方を覚えましょう属性(attribute,メンバ)、メソッド、継承と言われてさっぱりな方Pythonのクラスについて勉強しましょうhttps://docs.python.org/ja/3/tutorial/classes.htmlPythonの基礎がわかっていればこの記事を読むのに苦労することは全くない。機械学習アルゴリズムに精通している方でもおすすめしない人に当てはまる方は苦労するかもしれない。本記事をより良く理解するためには、実際に仮想環境(もしくはpyenvで環境ごと切り替え)を作り、実際にやってみることである。既存のアルゴリズムに改変を加える研究をするぜ!と意気込む大学生の手助けになることを祈っている。(オライリー本的な導入になってしまった。)scikit-learnのディレクトリ構造の俯瞰まずは、scikit-learnのディレクトリ構造を俯瞰してみよう。githubのページはこちらだ。github.com./には、README.mdをはじめとする書類系のファイルとsetup.pyをはじめとするinstallに必要なファイルがある。ディレクトリの方を見てみるとdoc/やeaxmples/などユーザーにとってありがたいファイルが入っているであろうディレクトリがある。学習器が実際に記述されているのはsklearn/の中だ。こちらの中を見ていこう。クリックするとこちらのページに飛ぶはずだ。大枠としてのアルゴリズムの名称、もしくは処理の名称がディレクトリの名称としてつけられている。この一覧の中から自分が手を加えたいものをファイルを探して改変するわけである。Treeの中を見てみよう。中身はこういう構造になっている。tree.pyすぐに_から始まっているファイル名があるのに気がつくだろう。scikit-learnではユーザーが直接使わないファイルは_から始まっている。この法則は一部のファイルに記載されている関数にも適応される。(例えばforest.pyの冒頭で定義されている関数を見ればわかるだろう。この関数はユーザーが直接使うことを想定していない。)また、.py以外の拡張子も存在することに気がつくだろう。.pyxはCythonのファイルである。.pxdはCythonの補助ファイルである。Cythonについては後述する。編集を始める前に、環境を整えて置こう。編集したscikit-learnをimportしたときに編集が反映されるようにしておこう。開発環境を整える今の自分の環境が壊れないように、別の環境で作業をしよう。ここではpythonや環境の切り替えツールの導入方法は説明しない。各自使いこなせるものを持っていることを前提とする。筆者はpyenvを使用している。pyenvを用いているならば、仮想環境を用意するよりバージョンを切り替えたほうが手っ取り早いだろう。installでAnacondaを用いることはおすすめしない。venvを用いた方法Python3ではvenvで仮想環境を構築することができる。pyenvを用いていないかたはこちらの方法で作成可能だろう。この方法でなくても慣れている方法で全然構わない。#ここも適切なものに変えてくださいで切り替え可能。deactivateで終了。編集した内容が反映されるようにインストールするさぁ、いよいよscikit-learnをインストールしよう。環境の確認まずは今の環境にscikit-learnが入っていないことを確認したい。scikit-learnと表示されなければ問題ない。インストールされていた場合は、一旦アンインストールしよう。scikit-learnそして、いま、作業ディレクトリにいることを確認しよう。--editableここからは公式の手順で導入することにする。scikit-learn.orgまずはソースコードのダウンロードからだ。#すこし時間がかかります。git://github.com/scikit-learn/scikit-learn.git次にscikit-learnに必要な依存パッケージをインストールする。pandasそして、いよいよinstallする。Cppへのコンパイル、さらにそれらから実行ファイルへのコンパイル等があるので時間がかかります。トラブルシューティングCをコンパイルする工程でエラーが発生しinstallが終了する可能性がある。自分の計算機にgccがインストールされていてパスが問題ないか確認しよう。Macを使っている人だと、コンパイラの関係でエラーが出てインストールに苦労するかもしれない。Clangが--openmpという引数をサポートしていないのが原因だ。#gccを導入gccを導入して、コンパイルにはこれを使うように指定する。bashをお使いならば、.bashrcに以下のようなエイリアスを書き込む。overflowで質問をしよう。準備完了ここまで来たら、もう準備は完了である。clone'したscikit-learnをいじれば、いじった内容が即時で反映される。(jupyterを起動しているときはカーネルを一回シャットダウンする必要がある。)Cythonファイルを編集した場合には、コンパイルの必要がある。--inplaceとしてもokだ。好きなようにscikit-learnを改変しよう。研究に使うもよし、バグを修正してOSSに貢献するもよしだ。編集に必要な知識を身に着けるときに役立つサイトをまとめた。Pythonの知識がんばろう公式日本語ドキュメントdocs.python.orgscikit-learn引数の意味とかはソースコードよりもドキュメントのほうが早く探せる。scikit-learn.orgscikit-learn準拠モデル自分で書いたモデルをscikit-learnとともに使うためにいくつかルールがある。scikit-learnに実装されているモデルももちろんそのルールにしたがっているので知っておくと良いだろう。それが継承されてる?という疑問も少なくなる。実行時、速度のボトルネックになる部分はCythonを用いて実装されている。改変したい部分がCythonにある場合、知識が必要だろう。223,491Amazon.co.jpで詳細を見るfeature_importances_の可視化をscikit-learnに組み込む具体例としてやっていく。モデルは決定木、データはiris(楽なので)。いう可視化か実際に組み込む前に、どういう風に可視化するのか追っていこう。モデルを学習するところまで。splitter='best')はい、モデルの学習が終わった。0.42261071])とすればよいが、これをみてどの特徴量の重要度がどれぐらいと即座に分かる人は少ないだろう(特徴量の順番を覚えている超人は除く)。特徴量の数が多くなったときは、表示が省略され見にくくなる。そこで重要度を可視化して、見やすくしたい。そのために以下のようなコードを書いた。index=iris.feature_names)importance=importance.sort_values()importance.plot.barh()重要な特徴量から表示するような横向きの棒グラフである。何回もこれ呼び出そうとすると面倒だ。そこでscikit-learnのDecisionTreeClassifierにメソッドとして組み込んでしまおうというわけである。DecisionTreeClassifierの改変DecisionTreeClassifierはこの場所で記述されている897行目に以下のコードを挿入してあげよう。importance.plot.barh(**kwarg)さて、もうすでにscikit-learnは改変された。.でインストールしたscikit-learnであるば、.pyへの編集は即時適応される。--inplaceを実行することも必要だ。可視化をやりなおしてみよう。先程と同じく訓練終了まで実行する。iris.target)可視化clf.show_importances(iris.feature_names)終わりである。自作関数をクラスのメソッドとしてきれいにまとめる事ができた。この具体例なら俺はもっと楽なやり方を知ってるぞ!という方もいると思う(実際ある)。既存のアルゴリズムを改変する、という作業はこの具体例で流れがつかめたことだろう。まとめscikit-learnに改変を加えて使うため、必要な導入手順や知識の鱗片を紹介した。最後には具体例として、feature_importances_の可視化をメソッドとしてDecisionTreeClassifierに追加した。まとめようとすると、また長くなってしまいそうだ。読者がもう一回目次を読んで、どんなことを行ったかを思い出すことをまとめとしよう。出力が若干違いますが気にしないでください。github.com改変したtree.pyこの部分にメソッドを追加したので、自分の環境のtree.pyにはりつければ使えるようになります。お問い合わせはてなブログをはじめよう!aotamasakiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。