フリーランチ食べたい

機械学習/データ解析/フロントエンド/バックエンド/インフラ

【Python】 機械学習の可視化が捗るライブラリ「Yellowbrick」

f:id:ikedaosushi:20190516184158p:plain

機械学習Podcast「TWiML&AI」で先週取り上げられた可視化ライブラリ「Yellowbrick」が非常に便利だったので紹介します!ちなみにPodcastには作者の1人であるRebecca Bilbroさんが出演しているので興味持った方は是非聞いてみてください。

twimlai.com

www.scikit-yb.org

Yellowbrickとは

一言で言うと、機械学習に特化した可視化ライブラリです。実装的な面で言うと(こちらの方がわかりやすいかもしれません)、scikit-learnとmatplotlibをラップして、scikit-learnライクなAPIで使うことができるものです。

例えば相関行列のヒートマップをプロットしたい場合は次のように書くだけでグラフを作ることができます。

visualizer = Rank2D(features=features, algorithm='pearson')
visualizer.fit(X, y)
visualizer.transform(X);

f:id:ikedaosushi:20190516144509p:plain

なんと、たった3行で書くことができてしまいます。

※一応補足ですが、matplotlibやseabornでは相関係数の計算は自分で行う必要があります(seabornで書く場合のコード)。そこをYellowbrickが良い感じにやってくれる、ということですね。

Yellowbrickのモチベーション

Podcast内でYellowbrickを作ったモチベーションについて触れていました。 Rebeccaさんはもともと機械学習を教える教育の現場にいて、そこで機械学習モデルの学習/予測と同じくらい 特徴量や結果を解釈することの重要性 が高いことに気づきました。そこで、機械学習の特徴量や結果の解釈をサポートするライブラリとしてYellowbrickを開発し始めました。

Yellowbrickでできる可視化

Yellowbrickでできる可視化をまとめてみました。 次のような解析を行うことができます。

  • Feature Analysis Visualizers: 特徴量(説明変数)の可視化
    • 共分散行列、相関行列、RadViz、PCA...
  • Target Visualizers: 目的変数の可視化
    • 目的変数分布、説明変数との相関...
  • Regression Visualizers: 回帰モデルの可視化
    • 残差プロット、エラープロット、alpha値選択...
  • Classification Visualizers: 分類モデルの可視化
    • 混同行列、ROCAUC、精度/再現度カーブ...
  • Clustering Visualizers: クラスタリングの可視化
    • Elbow method、Silhouette Visualize...
  • Model Selection Visualizers: モデル選択の可視化
    • Validationカーブ、Learningカーブ、CrossValidation
  • Text Modeling Visualizers: 言語モデリング
    • t-SNE...

一般的な機械学習の問題で行うワークフローは一通り網羅されていると思います。 詳しく知りたい方はドキュメントを参照してください。

Yellowbrickを使ってみる

それでは実際に使いながらYellowbrickでの機能を見ていきたいと思います。 全部は紹介しきれないので一部のみの紹介になります。また使ったコードはすべてGitHubに上げてあります。記事の最後にリンクを貼ってありますので興味ある方はご参照ください。

インストール

インストールはpipで行います。

pip install yellowbrick

データ

サンプルデータとしてUCI Machine Learning Repositoryのものを使います。

archive.ics.uci.edu

実はyellowbrickがこういう用途のためにダウンロードスクリプトを用意してくれているので、ちょっと試したい方はこちらを使うと良いと思います。

$ python -m yellowbrick.download

基本的な使い方

基本的にはscikit-learnと同じAPIで使うことができます。 インスタンスを生成して .fit() .transform() を呼び出す、という流れです。 .poof() という馴染みのないメソッドもありますが、こちらはパスを引数に指定すればファイル出力、しなければ plt.show() してくれるAPIのようです。 また特定のClassについてはlegendなどを表示しているようで基本的に呼び出した方が無難なようです。この記事では必要なものだけ呼び出しています。

visualizer = SomeYellowbrickClass()

visualizer.fit(X, y)
visualizer.transform(X)
# visualizer.poof()  #  `%matplotlib inline` している場合は基本的に不要だが必要なClassもある

Feature Analysis Visualizers: 特徴量の可視化

RadViz

from yellowbrick.features import RadViz
visualizer = RadViz(classes=classes, features=features)
visualizer.fit(X, y)
visualizer.transform(X);

f:id:ikedaosushi:20190516165545p:plain

Regression Visualizers: 回帰モデルの可視化

残差プロット

.score() を使うことでテストデータとの比較を行うことができます。

from sklearn.linear_model import Ridge
from yellowbrick.regressor import ResidualsPlot

model = Ridge()
visualizer = ResidualsPlot(model)

visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test) # テストデータとの比較
visualizer.poof(); # ResidualsPlotは.poof()を呼び出さないと完全にplotされませんでした(汗)

f:id:ikedaosushi:20190516171756p:plain

AlphaSelection

アルファ値の探索を可視化することができます。

from sklearn.linear_model import LassoCV
from yellowbrick.regressor import AlphaSelection

alphas = np.logspace(-10, 1, 400)

model = LassoCV(alphas=alphas)
visualizer = AlphaSelection(model)

visualizer.fit(X, y)
visualizer.poof()

f:id:ikedaosushi:20190516172037p:plain

Classification Visualizers: 分類モデルの可視化

混合行列

from yellowbrick.classifier import ConfusionMatrix
from sklearn.svm import SVC

svc = SVC()
visualizer = ConfusionMatrix(svc, classes=classes)

visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test)
visualizer.poof();

f:id:ikedaosushi:20190516172829p:plain

色が濃い方が数が多いことを表しています。

ROCカーブとAUC

ROCカーブも簡単に書くことができます。

from yellowbrick.classifier import ROCAUC
from sklearn.linear_model import LogisticRegression 

logistic = LogisticRegression()
visualizer = ROCAUC(logistic)

visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test)
visualizer.poof();

f:id:ikedaosushi:20190516173352p:plain

Text Modeling Visualizers: 言語モデリングの可視化

長くなってきたので最後に言語モデリングの可視化をして終わりにしたいと思います。 個人的に言語モデリングの分析をやることが多いのですが、分析の度に定型化された処理を何回も書いているので、とてもありがたいです!

from sklearn.feature_extraction.text import TfidfVectorizer
from yellowbrick.text import TSNEVisualizer

tfidf = TfidfVectorizer()
docs = tfidf.fit_transform(corpus.data)
labels = corpus.target

tsne = TSNEVisualizer()
tsne.fit(docs, labels)
tsne.poof();

f:id:ikedaosushi:20190516174820p:plain

少しのExampleでしたが、どれもよく使うユースケースですね。 Yellowbrickの便利さがわかっていただけたら幸いです!

Yellowbrickの小咄: ユニットテスト

Yellowbrickは可視化ライブラリですが、ユニットテストがちゃんと書かれていることがPodcastで触れられていました。 「可視化をどうやってテストするのだろう」と思ったのですが、その方法が面白く、tests/baseline_images フォルダに出力予定される画像を配置しその画像との差分を見て、テストしているらしいです。

その際に問題になるのが、 「matplotlibが出力する画像のカラースキームがOSやデバイスごとに微妙に異なる」という問題です。この問題を解決するためにpytestを使って「ある程度の差分幅であれば許容する」ということをしているらしいです。開発の事例としても面白いですね。

tests/baseline_images フォルダを見ると実際に比較に使われている画像を見ることができます。

https://github.com/DistrictDataLabs/yellowbrick/tree/develop/tests/baseline_images

Yellowbrickを使ってみた感想

Yellowbrickはscikit-learn、matplotlibなどのライブラリに慣れていない人、慣れている人、両方にとって有用なライブラリだと感じました。

特徴量や結果の可視化をするには、scikit-learnやnumpy、scipyを使って得られたデータをmatplotlib、seabornに対応した形式にしてAPIを呼び出す必要 がありました。これらのAPIに習熟していない人にとっては、それぞれのAPIが受け入れる/出力するデータの形式を理解する必要があり、開発者フレンドリーではなかったと思います。Yellowbrickはその問題を解決してくれるライブラリだと思います。

またこれらのAPI慣れている人にとっても、大きなメリットがあります。 自分もそうなのですが、可視化でよく使う(scikit-learnとmatplotlibを組み合わせた)コードをスニペットとして使っている方も多いと思います。こういったスニペットは便利なのですが、色々なケースで使いまわしていると思わぬバグの原因になります。Yellowbrickを使えばテストされたコードで可視化できるのでより安全に可視化することができます。またシンプルに時間の短縮になります。

さいごに

機械学習の可視化が捗るツール「Yellowbrick」を紹介をしました。すぐに使える実用的なライブラリですね。 開発の活発に行われているようなので、どんどん使ってフィードバック or コントリビューションしていきましょう。

今回使ったコードはGitHubにおいてありますのでご参照ください。 データ読み込みなどこの記事では省略されている部分もすべて残しております。

github.com