人工知能企業のエンジニアの開発記録

人工知能企業のエンジニアの模索の記録です。pythonを基とした開発や、スキルアップのためのライフハックおよびそれらへの挑戦を書き連ねます。

自分が使っているPython開発環境を晒す(3.データサイエンス編前編)

前回の続きです。

自分の中で週一でブログ書くって決めていたのですが、会社の技術ブログの記事 を書いていたので一週間遅れ。ちなみにあっちの記事は「フロントエンド開発環境を晒す」みたいにはなっています。

今回も予告通り、私のpythonデータサイエンス環境についてです。 python使っている人ならばご存知の通りデータ解析や機械学習に長けたライブラリやツールが豊富です。 pythonの華は機械学習にこそありますし、機械学習がしたくてpythonを使っている、勉強している人も多いでしょう。

本記事も例のごとく重く長い記事となり、自分で書いてても辛かったので前編後編に分けました。 前編は機械学習よりかは数値計算やグラフ可視化に重点を置いています。 機械学習に特化した内容は後編で書く予定です。待っていた方は申し訳ないですがもう少しお待ちを。

目次

データサイエンス環境

Jupyter Notebook

pythonデータサイエンティスト必須のインタプリタツールです。 ウェブブラウザ上のリッチなGUIpythonのコードを扱います。 Jupyter NotebookではIPYthon Notebook(.ipynb)という特殊なファイルを使って、pythonのコードがかけます。 中でipythonを使っているのでipythonのコマンドも使えます。 ipythonと比較すると

  • セルという単位に分けてpythonのコードを分けて実行でき、実行処理が追いやすいようなコードの分割ができる
  • セルのコードと実行結果は前述のIPYthon Notebook形式で保存され、プロトタイピングや実験に向いている
  • GUIベースで、読みやすいヘルプ機能、表やグラフの出力、音声ファイルの再生などができる
  • Markdownや数式が書けるセルを作成でき、コードスニペットや実行結果と組み合わせてレポートっぽいのが作れる
  • 環境設定次第では、htmlやlatexベースのpdfに変換できるので本当にレポートが作れる

特に表やグラフの可視化は可視化系で重宝しますし、機械学習においても画像・音声処理などでそのGUI機能は活躍します。 機械学習コンペのkaggleに参加しているデータサイエンティストもjupyterを使ったコードをアップロードしたりもします。

使えばわかると思いますがめっちゃ便利なので、使っていない人はいますぐインストールしましょう

pip install jupyter
jupyter notebook # で実行

グラフ描画・可視化

matplotlib

pythonでグラフ出力をするときに使います。 用途としては、通常の統計出力や、機械学習の学習結果を見る時が多いでしょうか。 具体的には、回帰分析の結果をプロットしたり、ディープラーニングモデルの学習状況を可視化したりですかね。

複数のグラフを書いたり、ラベルを可視化したりと欠かせない機能が多い分、結構操作が大変です。 自分もよく過去のコードを見直したり使いたい機能をググりながら使っています(チートシート欲しい)

pythonデータサイエンティスト必須ライブラリの一つと言いたいところですが、後述するもっと便利な描画ライブラリがあります。

seaborn

matplotlibのラッパーライブラリです。matplotlibで苦労して書いたグラフはseabornで1プロセスかつ綺麗に書けます。 matplotlibの入門を終えたらすぐこっちに移っていいかと。

plotly

最近はplotlyという超リッチなグラフ描画ライブラリがあるそうで、社内でも人気です。 今はこっちの方が主流なんですかね?今日軽く使ってみたところ、簡単にリッチなグラフがかけました。 javascriptも使われておりjupyterで超リッチなグラフ描画機能となっています。seabornより多機能です。

数値計算

numpy

言わずもがな有名な数値計算ライブラリ。python動的言語だから遅いだとか言われがちですが、 numpyはc言語で実装されており(cythonも使っている?)、pythonを通じた型推論により高速な行列演算をしてくれます。 python機械学習を高速で行ってくれる縁の下の力持ちです。 実際に、大抵の機械学習ライブラリでは依存ライブラリとして扱われています。

numpyではarrayという行列オブジェクトを使って計算を行います。 その機能は四則演算や内積外積、n乗、n乗根などといった基本的な数値計算から、 sin関数、cos関数、平均、標準偏差といった関数、行列同士の結合、ゼロ埋め、数値のフィルタリングなど 非常に多くの便利機能を備えています。

numpyもpythonデータサイエンティスト必須のライブラリです。

また、blaslapackという数値計算ライブラリに頼った計算もでき、導入すると更に速くなります。

pandas

こちらも有名で、表計算ライブラリとなります。 基本的にはDataFrameと呼ばれる表のオブジェクトを使ってデータ処理を行うものとなっています。

統計可視化や機械学習のための事前データ処理に優れており、中でnumpyが使われているため、 numpyの機能の一部をpandasで使えたり、numpyの要領で数値計算ができたりします。 列(データ)ごとで平均・標準偏差の計算といったnumpyの基本から、欠損値(データが無い場所)埋め、 自分で書く必要はあるもののlambda関数を使った列ごとの独自定義の演算や文字列の数値id化などができます。

また、DataFrameの表は基本的にラベルを持っており、Jupyter Notebookでは表として出力できたり、 seabornにそのままDataFrameの表を突っ込んでグラフ統計の出力ができたりと表計算ライブラリとして非常に優秀です。

csv、エクセル、hdf5といった表形式ファイルとも互換性がありインポート・エクスポートをする機能もあります。

これもpythonデータサイエンティスト必須のライブラリです。

SQL(NoSQL)

pythonではないですが、よくデータサイエンスに必要なスキルとして挙げられます。 小さいデータであれば前述のpandasでどうにでもなりますが、大きなデータはメモリに乗らず、データ処理ができません。 一方、SQLならばデータベースとしてHDD・SSD上で読み書きをするため大規模でもあまり考慮する必要がないです。

ただし、自分は業務でもビッグデータを扱った経験がなく、pandasで処理ができなかったり、逐次処理(バッチ処理)をしたいときに使うぐらいです。 ビッグデータを扱う場合にはHadoop、Hive、Sparkと組み合わせて使うのでしょうかね。

ちなみに自分がよく使うのはsqliteとmongodbです。前者は一つのファイルとして扱え共有しやすいから、 後者はいちいちデータ構造を定義しなくても良くリストや文字列が扱いやすい&ビルトインでmap-reduceが使えるからです。 webアプリケーションを作る場合には流石にMySQLPostgresql、elasticsearchを使います。

高速化・並列分散化

numba

関数にデコレータをつけるだけで、実行時に関数をコンパイルし、c言語並みの計算速度を出すことができます。 条件が限られますが、主にfor文内の数値計算を爆速にしてくれます。そのfor文の中にif文が入っていると高速化しづらいです。

自分の書いたコードが遅いと感じた時にこいつを使ってやると魔法のように爆速な計算ができるかもしれません。

cupy

有名な日本のディープラーニングライブラリであるChainerの内部で使われています。 その名の通り、cuda+numpyといった感じで、GPUを使って計算するnumpyです。 機能としてはnumpyと同じ関数やメソッドが実装されており、GPUを使ったより爆速な数値計算ができます。 自分の知る限りですと、基本的にはchainer内で使われているくらいのようです。 自分もchainer以外でも使ってみたい思って、なかなか実行に移せていないぐらいです。 ニッチな用途ですと、従来の機械学習のコードでnumpyをこいつに置き換えると遅い学習も早くできるだとかいう話があったような。

ただし使用する分にはGPUとcudaドライバが必須となります。

dask

並列処理のpandasという位置付けのライブラリです。中でpandasを使っており、pandas感覚で扱うことができます。 pandasの差異としては

  • 実行する計算は何個かのDataFrameに分割して並列で計算する
  • 分割して計算を行うのでメモリ効率がよく、メモリエラーを起こすような巨大なデータに対しても使える
  • 計算はすぐに実行はせず、各計算やメソッドの実行はタスクを登録するだけ。computeというメソッドを実行すると、登録したタスクを実行する
  • 登録したタスクは図として可視化できる

といったところです。並列処理の強みであるメモリ効率や単純な高速化に目が行きますね。

cython

pythonc言語に変換してコンパイルする特殊な言語です。こちらもnumba同様pythonコードの高速化に使います。 pythonのコードをまんまコンパイルできますが、cythonの型宣言を使うことでc言語並みのスピードを出すことができます。 用途としては、高速化というのが普通で、機械学習ライブラリにcythonが使われることもあります。 cythonさえインストールしていれば、ipythonやjupyter notebook上でコードをすぐにcythonコンパイルすることができ、 numbaと同様簡単な高速化が実現できます。