データサイエンス&サイバーセキュリティ備忘録

Python, Data Science, Kaggle, Cyber Security, CTF, などなど

PythonのMLライブラリ、PyCaretを使ってみた

はじめに

よく、TwitterやLinkedInでデータサイエンスや機械学習の情報収集をしているのですが、こんなものを見つけました。


Announcing PyCaret 1.0.0
https://towardsdatascience.com/announcing-pycaret-an-open-source-low-code-machine-learning-library-in-python-4a1f1aad8d46


とりあえずどんなライブラリなのかサーっと記事を読んでみると、コードを全然書かなくてもモデルを作ることができる、AutoMLみたいなものだと思いました。

私も使用してみたいと思い、ライブラリをインストールしようとしましたがうまくいかなかったため、インストール方法も含めて使い方をメモとして残すことにしました。

私がPyCaretを動かした環境は、WindowsのローカルのJupyter Notebookです。

今回は、Macのパソコンでも同じ方法でできそうな気がします。

と、その前にまずはPyCaretが何かをもう少し詳しくまとめたいと思います。

PyCaretとは?

上記のサイトの記事のハイライト部分をそのまま翻訳すると...

(PyCaretは、)教師あり学習教師なし学習のモデルをローコードで学習とデプロイするための、オープンソースPython機械学習ライブラリ

とのことです。

ローコードという言葉をこのとき初めて見たのですが、最小限のソースコードまたはソースコードなしでソフトウェア開発を高速化するためのITツールのことだそうです。 *1

コードの見本を見てみると、モデルの作成やパラメーターチューニングといった各工程で作成するコードは、たった1行でできます。

公式サイトがあるので、URLのリンクを紹介します。

pycaret.org


インストール方法

Anaconda Promptを開き、以下のコマンドを入力します。

pip install pycaret 

一度このコマンドを実行すると分かると思いますが、たくさんのライブラリをインストールします。

途中でエラーが起きずに全てインストールできたならば問題ないですが、先に書いた通り、私の環境ではうまくいきませんでした。

最初に上記のコマンドを入力すると、私の環境ではいくつかのライブラリで以下のエラーが起きました。

Cannot uninstall '{library name}'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

新しいバージョンをインストールするときに古いバージョンのものを一度消しますが、その時にどのファイルがアンインストールするためのものかの判断がつかないため、アンインストールができないというエラーみたいです。

解決方法を探してみると、以下のブログを見つけました。

!Warning!:
この方法でもできるのかもしれませんが、私の環境ではうまくいかず、Anacondaの環境が死にました笑

なので、エラーが起きた場合は他の方法で解決することを推奨します。

後ほど紹介する方法の方が無難だと思うので、この段落の最後にURLだけ紹介します。

www.smartbowwow.com

いくつかのライブラリは、上記のサイトの方法で解決しましたが、1つ問題が起きました。

tbbのライブラリを消したら自分の環境を破壊させてしまったようで、動かなくなってしまいました。

原因を調べてみると、tbbのライブラリを消したときにpandasのmetadataも消えたようです。

pandasを再インストールしてもKernelに接続できず、結局Anacondaの環境を一から作り直しました...笑

解決した後に他の方法も探したところ、環境によりますが以下の方法で解決できるみたいなので、URLだけ貼ります。

https://github.com/tensorflow/tensorflow/issues/30191

次回、同じエラーが起きたら上記のサイトにある方法で試してみようと思います。

使い方

このライブラリにはサンプルのデータセットがあるので、そのデータを使用しました。

まず、データの読み込みをします。

from pycaret.datasets import get_data

# get_dataの引数が、用意されているデータセット
# ちなみに、diabetesは日本語で糖尿病
diabetes = get_data('diabetes')

このデータはpandas.Dataframeであり、自分が用意したデータフレームももちろん読み込めるとのことです。

データを読み込んだら、次はデータの前処理です。

コードは以下の通りです。

# 今回のタスクは二値分類(分類問題)なので
# こちらのモジュールをインポート
from pycaret.classification import *

# 回帰問題の場合は、代わりに以下の1行をインポート
# from pycaret.regression import *

# クラスタリングをしたい場合はこちらのモジュールを使用
# from pycaret.clustering import *

# setupの第一引数はデータフレーム、第二引数は目的変数
exp1 = setup(diabetes, target = 'Class variable')

コード内のコメントで、何種類かのモジュールを紹介しましたが、公式ドキュメントを読んでみると、自然言語処理用や異常検知用のモジュールもあります。(凄すぎる...!)

上記のコードを入力してしばらく経つと、以下のアウトプットが出てきます。

f:id:a7xche:20200429164631p:plain

ここで一度、各カラムのデータ型が正しく読み込めているかを確認します。

問題がなければエンターキーを押し、データ型を変えたい場合は画像の一番下にあるテキストボックスにquitと入力します。

エンターキーを押すと、前処理の結果が表示されます。

f:id:a7xche:20200429171540p:plain

実際は、40くらいの項目で表示されますが、上から15の項目を抜粋しました。

画像の通り、最初の項目はデータフレームに関する情報で、欠損値の有無、数値型データの種類数などがあります。

その下の別の項目には、数値型データの欠損の補完方法、正規化したかが表示されています。

全ての項目を紹介しきれないので、ぜひ一度触って確認してみてください。

前処理が終わったら、どのモデルで予測するか決めます。

このとき、とても便利な関数を使用します。

compare_models()

この関数を使うと、各モデルで出したそれぞれの評価指数のスコアを、Accuracyが高い順に表示されます。

f:id:a7xche:20200429203406p:plain

これらのスコアはK-foldで交差検証を行ったスコアで、デフォルトのfoldの数は10です。

関数の中に引数を入力することによって、foldの数を変えたり、優先して見る評価指数を指定することができます。

例えば、K-foldの数を5にして、優先して見たい評価指数をAUCとしたい場合は以下のようになります。

compare_models(fold=5, sort="AUC")

スコアを見比べて使用するモデルが決まったら、次はモデルの作成です。

今回は、LightGBMを使用してモデルを作成しました。

コードは以下の通りで、実行するとcompare_model()のときと同様に各評価指数のスコアが表示されます。

# 引数で使用するモデルを指定する
lgbm = create_model('lightgbm')

もちろん他のモデルでも作成できるので、作成方法を一部まとめます。

# Logistic Regression
logistic = create_model('lr')

# Naives Bayes
bayes = create_model('nb')

# CatBoost
catboost = create_model('catboost')

モデルを作成したら、以下のコードでモデルのチューニングを行います。

tuned_lgbm = tune_model('lightgbm')

モデルをチューニングした後にアウトプットとして評価指数の表が表示され、モデルを作成したときより精度が良くなっているのを確認することができます。

作成したモデルをアンサンブルしたり、スタッキングすることもできます。

# まずはモデルの作成
lgbm = create_model('lightgbm')
catboost = create_model('catboost')

# アンサンブル
ensemble_models = blend_models(estimator_list = [lgbm, catboost])

# スタッキング
# メタモデルを引数で指定しない場合、ロジスティック回帰モデルになる
stacked_models = stack_models(estimator_list= lgbm, meta_model = catboost)

モデルが完成したら、モデルの評価を行います。

先ほどチューニングしたLGBMの評価をしたいと思います。

evaluate_model(tuned_lgbm)

上記のコードを実行すると画像のように15のボタンが表示され、見たい項目をクリックすると画面が切り替わります。

f:id:a7xche:20200429224801p:plain

また、モデルの解釈をまとめたサマリーもプロットすることができます。

# こちらも先ほどチューニングしたモデルを使用
interpret_model(tuned_lgbm)

モデルの評価を確認したら、いよいよ予測です。

長々とブログの文章が続いていますが、ここまで書いた実行するのに必要なコードは10行未満です...!

では、モデルを使用して予測したいと思います。

# チューニングしたモデルを使用
# データは指定しなくても、setup()で前処理したものを使用
predictions = predict_model(tuned_lgbm)

# 結果を出力
predictions

コードを実行すると、LabelとScoreという列が右側に増えたデータフレームが出力されます。

f:id:a7xche:20200429235435p:plain

Labelは予測したラベルで、Scoreは予測値です。

以上で、基本的な使い方の説明は終わりですが、作成したモデルをクラウド上にデプロイしたり、モデルの保存もできるようです。

まとめ

データの読込みから予測まで、10行前後のコードでできました(恐るべし、PyCaret...!)

簡単に予測できるだけでなく、UIのデザインも良くて使いやすいです。

ただし、使用するモデルや評価指数の選択は知識が問われるので、なぜそのモデルを使用したのか、なぜその評価指数を採用したのかが重要になります。

また、最後に出力したデータフレームを見てみると、どうやらそんなに特徴量エンジニアリングはしていないようです。

なので、データサイエンティストという職はまだまだ必要とされそうです(安堵の表情)