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

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

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

前回の続きです。

最近やりたいこともやるべきことも多くて手をつけづらかったですがようやく完結。 いよいよ機械学習の内容です。理論があまりわからなくても気軽に扱えるものから、 専門知識必須のガチフレームワークもあります。

例のごとくなので、専門的なライブラリほど 「こんなものがあるんだー」と興味を持ってもらえるぐらいでいいかと。

目次

機械学習

scikit-learn

pythonでは最も有名な機械学習ライブラリではないでしょうか。 ディープラーニング以前のアルゴリズムを網羅している他、機械学習の準備や評価に必要なAPIも揃えています。 ディープラーニングの時代になった今でも、scikit-learnにあるモデルが最適となる要件はたくさんありますし、 ディープラーニングを使う場合にも役に立つAPIもありますので、使う人も多いでしょう。

また、こちらも例のごとく裏ではcythonを用いていて、基本計算が早いです。 また、提供しているAPIメソッドもかなり単純に扱えるものとなっていますので、 機械学習の理論の知識が薄くても簡単に扱うことができます。(理解している方がチューニングはしやすいですが)

参考までに、機械学習をする際には前回の記事のグラフ描画ライブラリと一緒に使うと扱いやすくなります。

xgboost

世界中のデータサイエンティストが最強の機械学習モデルを競い合うkaggleで大人気のライブラリです。 kaggle内でも最強格かのような扱われ方をしており、優秀なモデルです。 元となるGradient Boostingというアルゴリズムにハイパフォーマンスなチューニングを加えたライブラリみたいです。

Gradient Boostingのアルゴリズムは正確には理解していませんが、特殊なチューニングを加えた決定木(?)に ブースティングという手法で複数の小さなモデル(弱学習器)を組み合わせて一つのモデルとして扱う(強学習器)アルゴリズムです。 あらゆるパターンを想定した小さなモデルができるため、ブースティングやそれと似たアルゴリズムは大抵良いモデルを作ります。

自分もkaggleを始めた時は好んで使っていました。scikit-learnと同じ要領で簡単に使えるのでこちらもおすすめです。 また、自分は使ったことないですが、LightGBMやcatboostというxgboostを意識してチューニングしたライブラリもあるので、 可能であればそちらも確認してみると良いでしょう。

参考

余談ですが、Rの実装もあるのでRが得意な人でも使えますし、Javaの実装もあるのでHadoopなどとも親和性が高いです。

pymc

自分は使ったことはないので、エアプ目線の解説で申し訳ないです。

ベイジアンモデルを組むためのライブラリです。 自分でベイジアンモデルを組むためのAPIが揃っているため、ベイジアンには嬉しいライブラリです。 理論がわからないと組めそうではないので、初心者向けではないです。 勝手にtensorflow(後述)のベイズ版って捉えていますが解釈合っていますかね?

これってHMMやCRF、LDAの派生モデルを組むのにも使えるのですかね?元自然言語処理専門としては非常に興味があります。

gpyopt

ベイズ最適化というアルゴリズムで、対象の関数の最適解(最大値もしくは最小値)を求めるためのライブラリです。 機械学習モデルをより高性能にするためのチューニングにも扱われますが、探索問題(最短で行き先全てを行くルートを探すなど) を解くための手法の一つとして役立ちます。

先述のscikit-learnでは基本分類(画像が犬か猫か見分けるなど)と回帰(様々な要因からアイスクリームの売り上げを予測するなど) を解くためのライブラリとは違う目的に使われるということで、これも覚えておきたいライブラリですね。

tensorflow

Googleオープンソースで開発したディープラーニングモデルを組むためのライブラリです。 こちらも理論をある程度知らないと扱うには難しいと思います。 ディープラーニングには必須なGPUによる計算を行う機能は当然のこと、有名なモデルをAPIとして提供しています。 ただし、これらの特徴は他のディープラーニングライブラリにも共通で、tensorflowの特徴として、提供するAPIの粒度が小さいことでしょうか。

この特徴はメリットにもデメリットにもなり

  • 新規モデルを組む時に融通が効き、自由にオリジナルモデルを組みやすい
  • 自分で書かなければいけないコード量が必然的に多くなり、気軽に扱いにくい
  • 理論がわかっていないと正しく組めないモデルもあり、上級者向け

といった特徴があります。自分としては理論が好きな人間なので、tensorflowを使うことが多いです。 特に、論文の成果は大抵Githubにtensorflowやpytorchなどで上げられていますので、 論文とコードを照らし合わせながら構造を理解したりチューニングしたりします。

他にも内部でtensorflowを使うがより簡単にディープラーニングモデルの組めるkerasや、 最近人気でわかりやすいコードが書けるpytorchといったライブラリもあるので、 自分にあったディープラーニングライブラリを探すことをお勧めします。

画像処理

ここからはケースによっては、機械学習を行うために必須となるライブラリ群の紹介となります。

opencv

C++で作られた昔からある画像処理ライブラリです。 pythonのラッパーも用意されており、pythonで扱うこともできます。

画像処理ライブラリの名の通り、プログラム上で画像を扱ったり加工したりするAPIが実装されています。 画像を機械学習可能な形式で読み込める他、画像の特徴(勾配、エッジ、コーナー)を抽出することもできます。 加工機能に関しては、抽出した特徴を画像で可視化したり、機械学習で検知した画像上の人などを囲うことにも扱えます。

pythonで扱う場合はpipでインストールできます。 opencvを直接ダウンロードしてコンパイルする方法もありますが、pipの方が断然簡単です。

pip install opencv-python
pip install opencv-contrib-python # 追加機能もあるが商用利用じには注意!

pillow

こちらはpythonでのみ提供されているライブラリで、opencvよりも気軽に使えるかと思います。 opencvとは異なり機械学習向けの機能は少ないですが、画像をプログラム上で読み込んだり加工するために使えます。 画像を機械学習可能な形式で読み込む機能もあり、jupyterとの親和性も高いので、画像処理関連でこちらを使う人もいます。

大した画像処理を使わない場合にはこちらを使うと良いでしょう。

自然言語処理

mecab

かなり有名だと思いますが、形態素解析(文中の単語を分けて、単語ごとの品詞などを抽出する)ライブラリです。 文章を機械学習モデルに使うときは大抵、単語レベルで扱うので自然言語処理にはほぼ必須です。 他にも、mecabを使って、係り受け解析や固有表現抽出を行うcabochaといものもあり、特徴を抽出する際にも扱います。

ただし、pythonで扱う際にはmecabをインストールしてからmecab-pythonというラッパーをインストールするなど、 少し面倒です。また、mecabを扱えない条件の場合には後述のjanomeを扱うといいでしょう。

また、neologdという現代語にも対応した辞書がありますので、そちらと一緒に使うと高性能になります。

janome

こちらもmecabと同様に形態素解析を行うライブラリですが、python純正のライブラリです。 自分が使う機会があまりないですが、mecabに依存していると困るって場合に使われることが多いみたいです。 機能は基本的にmecabと同じなので、拘る理由がない場合にはmecabで良いと思います。

ちなみに、janomeでもneologdを扱うこともできるらしいです(Githubwikiページ参照)

gensim

自然言語処理モデルがいくつか入っているライブラリです。 HDPやLDAといったクラスタリング(文書分類など)にも使える次元圧縮や word2vecやfasttextといった単語の意味を文脈で理解するword embedding手法が揃っているため、 単語や文章の特徴を抽出するために使えるものだと思っています。

特にword2vecとfasttextはいくつか学習済みのものがありますので、ケース次第でといったところでしょうか。

spacy

日本語には非対応ですが、英語、フランス語、スペイン語など欧米圏の言語処理に対して強いです。個人としてkaggleで使っていました。 形態素解析や固有表現抽出の機能を持つほか、

  • 単語の原型の情報( goes なら go に該当するとか)
  • 係り受け解析
  • テキスト分類
  • 単語や文の意味を示すベクトルへの変換をする

など現在までの自然言語処理技術がAPIとなっております。 また、ディープラーニングAPI(CNN、RNN)の機能もいつの間にか実装されていました。 ドキュメントを読んだだけですが、既存の機械学習および深層学習ライブラリと親和性が高いようです。

音声処理

ffmepg

こちらはpythonではなく、CLIツールです。動画や音声を加工する機能を持ち、 機械学習に使う場合にはデータを前処理する段階で音声や動画の切り出しやコマ分けをするのに使うことになるでしょう。 自分は音声処理をする時に使っていましたが、時間で切り出したり、無音部分を排除したりという機能があるので、 pythonのコードを書く前に軽く音声処理を試したい時に使っています。

librosa

音声処理のpythonライブラリです。 音声を波の時系列データ(一定時間ごとの音の大きさ)とサンプリング周波数(音を取る間隔) に分けて、音声を加工したり音声を可視化したりします。音声処理の理論をわかっていた方が扱いやすいですが、 知識が少なくても割と扱えます。音声処理はあまり知識がないですが、機械学習を行う際によく使われる処理がAPI となっていますので、音声処理屋には必須のpythonライブラリとなるでしょう。

AutoML

おまけとして書き加えました。この項もタイトルとは異なり使ったことはないですが気になったので。

最近Googleが公開した機械学習を行うSaaSです。 界隈ではすごく話題になっていますが、 データを投げるだけで勝手に機械学習をしてくれます。 このモデルを使ったり、精度を上げるためにチューニングしたりということは 全部向こうが勝手にやります。 前から機械学習を自動でやるAIを作る研究をGoogleで行われていたそうですが(参考記事は以下)、 いよいよ実用化といったところですね。

以下のqiitaの参考記事にもありますが現在はalpha版で画像分類だけみたいです。ゆくゆくは音声処理も実装されるとか。

このことを受けたのか以下のツイートも見かけました。

現状、評価に関しては人の目で行う必要があり、やはり基礎理論は必要ですが、 上記ツイートのようにプロフェッショナルの知識を持たない限りは、 AutoMLのようなプラットフォーム使った方が断然いい結果がでる未来はすぐ近くにあります。

機械学習を使ってみたい初心者もこっちの波に乗った方が良いでしょう。要注目です。

参考: