こんにちは。ヤスヤスオンファイヤーです。
今日は、python、もといpandasを使ったデータ分析において、
実務でつかんだノウハウを共有します。
「データが変わったり、試すモデルのパターンが増えても、
メンテに手間をかけることなく使いまわせるか?」という観点で、
押さえておくべきポイントを4つ導きました。
自分の備忘録半分です。pythonを使っておりますが、
汎用的に他の言語でも適用できると思います。
あらゆる「決め打ちの値」を排除する
まず、10日分のデータで前処理、クロスバリデーションをするのが
タスクだとします。
そうしたとき、データ数の「10日分」の10が、コードの中に
表れるのは、限界までなくしておく。
データ数が、20,30、・・・と変わることになった時に、
コードをメンテすることなく、回せるようにしておくという心掛けですね。
データ数については、lenだったりshapeを使って動的に取り出すようにしています。
もちろん、ハイパーパラメータの値だったり、どうやっても固定値からは
変わりえない、異常値の閾値、などもあると思います。
今後の分析で、変化しうるものは、動的な値として仕込んでおくのが
GOODですね。
複数リストで順番を維持するよりも、辞書形式(dic)を活用する
モデルのパラメタだったり、データの前処理のバリエーションを変えて、
パターン1、パターン2、に対応し、モデル1、モデル2、と
保持したいことがあります。
そんな時、[パターン1、パターン2]はリストで定義しつつ、
その他はdic形式を使い、パターン1、パターン2の文字列をキーにする、
というやり方がおすすめです。
まず、複数のリストで実現しようとすると、
片方のリストから、要素を削除したとき、
片一方は2個、片一方は3個というように、対応関係がずれてしまうんですね。
dic形式だと、キーに紐づいてvalueを保持できますから、
確実に、[パターン1、パターン2、・・・]というリストをよりどころにして、
モデルだったり、データフレームを保持することができるんですね。
このやり方を心掛けてから、コードの中で混乱が減りました^^
dicは順番を考慮しないという特性がありますが、キーだけは、リスト形式で
持っているので、[パターン1、パターン2、・・・]によって、
順番はいつでも担保して、for文で取り出して処理ができます。
辞書のキーに対して、さらに辞書オブジェクトを持たせると、
複数のキーパターンでデータを保持できるので、
込み入った組み合わせのときは、重宝しますね。
フラグを使って、処理を分岐する
プログラム上、大きく2通りのモデル生成を試したい時など、
コードの冒頭で、フラグ用の変数を定義してしまいます。
コードの所々で、フラグの有無で、処理を分岐していく。
こうしておくと、フラグの切り替えのみで、2通りのモデル生成が
行えることになります。
途中途中、2モデルを並行に作っていくやり方よりも、
コードがすっきりすることもあります。
pickleを使って、ロードしたDataFrameは保存しておく
大量のエクセルやcsvを読み込んだデータフレームだったりは、
pickle形式で保存してしまうと、次回の実行時はpickleの読み出しだけになり、
時間が削減できます。
フラグによる分岐と組み合わせ、
二回目以降の実行のときは、pickle生成までの処理はスキップし、
読み込む処理のみ行う、というようにしていることが多いです。
前処理のバリエーションによって、データフレームに変更を
加えていくわけですが、バリデーションごとの処理に分かれる前の、
共通で使える段階のデータフレームをpickleにするようにしています。
前処理のバリエーションごと、pickleから読みだしたデータフレームを
コピーし、前述の方法でdicに格納して、処理していきますね。
さいごに
実務で、これは今後も意識して実装に落としていこう、と
感じたポイントの共有でした。
時間がないときは、なかなか余裕がありませんが、
再利用性の高いプログラムを書いておくことで、
後々、急な変更やデータ追加が発生しても、
少ない工数で結果をだせたりします。
ここぞというときの、お客さんの信頼も得られると思います。
長期戦になるぞ、というデータ分析では、
再利用性、ぜひ意識するのがよさそうです。