機械学習
記事内に商品プロモーションを含む場合があります

PyCaretで回帰・時系列・クラスタリング・異常検知を実践する方法

Aru

PyCaretでのクラス分類の方法については以前の記事で紹介しましたが、この記事では回帰(Regression)、時系列分析(Time Series)、クラスタリング(Clustering)、異常検知(Anomaly Detection)の各タスクについて詳しく解説します。それぞれのタスクの実行方法を具体的なサンプルコードとともに紹介し、実践的な内容を心がけました。

はじめに

PyCaretで回帰を行う必要があったので、以前の記事を見ながら取り組もうと思いましたが、クラス分類の方法しか書いていなかったことに気づきました。そこで、今回の記事では、前回の記事で取り上げなかった回帰(Regression)、時系列分析(Time Series)、クラスタリング(Clustering)、異常検知(Anomaly Detection)の各タスクについてまとめました。

今回もGoogle Colabで実行可能なノートブックをGithubに置いていますのでそちらも参考にしてください。

Google Colabで実行できるコードはこちらです。

インストール方法

前回の記事にも書きましたが、インストールは簡単です。以下のコマンドでインストールできます。

pip install pycaret

scikit-learn、XGBoost、LightGBM、CatBoostなどでの評価も同時に行いたい場合には、これらも同時にインストールしておきます。

pip install scikit-learn
pip install xgboost
pip install lightgbm
pip install catboost

Regression(回帰)

ライブラリのインポート

PyCaretで回帰を行う場合は、pycaret.regressionを読み込みます。

from pycaret.regression import *
from pycaret.datasets import get_data

データセット

データセットは、PyCaretで用意されているデータセットの中からdiamondを利用します。

df = get_data('diamond')

このデータセットを使って、ダイヤモンドの価格を予測します。

diamondデータセットの中身

セットアップ

session_idには、乱数のシードを入れます。ターゲットは価格なので、Priceを設定します。インポートの時に、pycaret.regressionとしているので、ここの部分はクラス分類とほぼ同じです。

seed = 42
reg = setup(df, target = 'Price', session_id=seed)

実行すると、セットアップされた内容が表示されます

セットアップの内容(回帰)

モデル比較

compare_modelsを呼び出してモデルの比較を行います。bestには最も良かったモデルが返されます。

best = compare_models()

なお、以下のようにソートをどの指標で行うかや、上位何個のモデルを選択するかなどを引数で指定できます。

best = compare_models(sort="RMSE", n_select=3)

結果から、CatBoostが全ての指標で良かったことがわかります。

回帰のモデル比較の結果

なお、それぞれの指標の意味は以下の通りです。

指標と説明
指標名説明
MAE誤差の絶対値(Mean Absolute Error)
MSE誤差の2乗(Mean Squared Error)
RMSE平均平方二乗誤差(Root Mean Squared Error)
R2決定係数(1に近いほど良いスコア)
RMSLE対数平均平方二乗誤差(Root Mean Squared Logarithmic Error)
MAPE平均絶対パーセント誤差(Mean Absolute Percentage Error)

結果の可視化

回帰に関しては、結果を可視化してみます。これも用意された関数で簡単に行うことができます。

plot_model(best[0])
plot_model(best[0], plot="error")
plot_model(best[0], plot="feature")

3つのグラフは、上のコードの実行結果です。最初のグラフは、横軸が予測値、縦軸が正解値との誤差です(所謂、Bland-Altmanグラフ)。2つ目は誤差を、3つ目はCatBoostの特徴量への重みです。3つ目のグラフを見ると、カラット数(Carat Weight)の重みが大きいことがわかります。

回帰プロット(1)
回帰プロット(2)
回帰結果プロット(3)

モデルをファイナライズする

最後にモデルをファイナライズしています。ファイナライズでは、全てのデータを使って学習を行いますので、モデルとパラメータが決定したらこれを実行しておきます。

models = finalize_model(best[0])

保存・読み込み・予測のサンプル

モデルの保存、読み込み、予測は以下のようにします。

save_model(models, "models")
loaded = load_model("models")
pred = predict_model(loaded, data=df)

Time Series (時系列)

ライブラリのインポート

時系列データでは、pycaret.time_seriesをインポートします。

from pycaret.time_series import *
from pycaret.datasets import get_data
import pandas as pd
import numpy as np

データセット

利用するデータセットは、airlineです。このデータセットは、米国の航空会社の乗客データセットで、1949 年から 1960 年までの米国の航空会社の乗客数の月次合計のデータです。

data = get_data('airline')
data.plot()

プロットすると以下のようなグラフが表示されます。ノコギリ状の山が右肩あがりで存在することがわかるかと思います。今回は、これの続きを予測してみます。

時系列データ(乗客数)

セットアップ

セットアップのやり方はクラス分類と大体同じです。fhは、予測に使用される予測期間で以下では12ヶ月を指定しています。これを指定することで、最後の1年は予測に使用されます。

seed = 42
ts = setup(data = data, fh = 12, session_id=seed)

なお、指定しない場合は、1が指定されます。また、seasonal_periodを指定することで周期性を設定することができます。乗客数のデータの場合、パッと見で1年周期(12ヶ月周期)があることがわかるのでseasonal_period = 12を指定すれば良いです。指定しなくても自動で設定されるようですが、周期性がわかっている場合には、設定しておいた方が予測精度が向上します。

実行すると以下のような設定結果が表示されます(一部略)

設定(一部略)

モデル比較

compare_modelsを使って、モデル比較を行います。比較評価を行わない場合は、create_modelで直接モデルを指定してモデルを作成しても良いですが、せっかくPyCaretを使うので、モデルの選定も自動で行います。

best = compare_models()

実行すると、時系列用のモデルの結果が並びます。

Time Seriesのモデル比較

評価

まず、プロットしてみます。最後の1年の予測結果は、正しい値とほぼ一致しているように見えます。まずまずの予測ができていると言えます。

予測結果(1)

さらに、2年先まで予測を行ってみます

pred = predict_model(best,36)

この結果をグラフにプロットします。まずは、matplotlibで扱いやすいようにデータを変換します。具体的には、indexをタイムスタンプ型に変換してます。

 pred = pred.to_timestamp()
 prev = pd.DataFrame(data).to_timestamp()
 prev.head()

グラフにプロットします。

import matplotlib.pyplot as plt
plt.plot(prev.index, prev['Number of airline passengers'])
plt.plot(pred.index, pred.y_pred, alpha=0.5)

グラフを見る限り、なんとなく予測できてそうな雰囲気です。

2年先まで予測

Clustering(クラスタリング)

ライブラリのインポート

クラスタリングでは、pycaret.clusteringをインポートします。

from pycaret.clustering import *
from pycaret.datasets import get_data

データセット

ここで使うデータはmiceです。このデータは、ネズミのタンパク質のデータです。これをクラスタリングしてみます。

data = get_data('mice')

このデータは1080行×82列のデータとなります。

miceのデータセットの一部

セットアップ

セットアップは、これまでとほぼ同じです。今回は、MouseIDは除外したいので、ignore_featuresを使って除外指定しています。

seed = 42
clust = setup(data, ignore_features = ['MouseID'], session_id = seed)
クラスタリングの設定

モデルの指定(Kmeansでクラスタリング)

調べた限りでは、クラスタリングではcompare_modelsが用意されていないみたいです。ですから、モデルを指定する必要があります。設定できるモデルはmodels()を実行して確認できますが、以下の通りです。

モデル名説明
kmeansK-Means Clustering
apAffinity Propagation
meanshiftMean Shift Clustering
scSpectral Clustering
hclustAgglomerative Clustering
dbscanDensity-Based Spatial Clustering
opticsOPTICS Clustering
birchBirch Clustering

今回は、Kmeansを利用してみます。

kmeans = create_model('kmeans')

結果をグラフで評価

結果をグラフで見てみます。

plot_model(kmeans)
クラスタリングの結果

4つのクラスタに分割されていることがわかります。また、以下のようにグラフプロットをすると適切なクラスタ数を確認することができます。

plot_model(kmeans, plot = 'elbow')
Elbowグラフ(クラスタリング)

予測

新しいデータがどのクラスタに属しているかは、以下のようなコードで予測することができます(今回は既知のデータで行なっています)

predict_model(kmeans, data)[['Cluster']]

Anomaly Detection(異常検知)

ライブラリのインポート

異常検知の場合、pycaret.anomalyをインポートします。

from pycaret.anomaly import *
from pycaret.datasets import get_data

データセット

異常検知でもmiceのデータを使います。

data = get_data('mice')

セットアップ

セットアップのやり方は、クラスタリングと同じです(MouseIDを除外するのも同じ)。

seed = 42
ano = setup(data, ignore_features = ['MouseID'], session_id = seed)

モデルの指定

異常検知もcompare_modelsが使えないようなので、create_modelでモデルを指定して作成します。異常検知で使えるモデルもmodels()でチェックできますが、以下のモデルでした。

モデル名説明
abodAngle-base Outlier Detection
clusterClustering-Based Local Outlier
cofConnectivity-Based Local Outlier
iforestIsolation Forest
histogramHistogram-based Outlier Detection
knnK-Nearest Neighbors Detector
lofLocal Outlier Factor
svmOne-class SVM detector
pcaPrincipal Component Analysis
mcdMinimum Covariance Determinant
sodSubspace Outlier Detection
sosStochastic Outlier Selection

ここでは、iforestを使って予測してみます。

iforest = create_model('iforest')

データを分析

データを分析するには、assign_modelを実行します。

forest_results = assign_model(iforest)
iforest_results.head()

結果をグラフで見てみます。

plot_model(iforest)
異常検知の分析結果

結果は上記のようになります。黄色に近い部分が異常値になります。

予測

予測は、以下のコードになります。今回は、既知のデータを使っていますが、本来は未知のデータを入力して予測します。

pred = predict_model(iforest, data=data.drop(columns=['MouseID']))

異常値判定されたものだけ抜き出すコードと以下のようになりました。

pred[pred['Anomaly'] == 1]
異常値のみ抜き出し

まとめ

PyCaretを使って回帰・時系列データ・クラスタリング・異常検知をやってみました。

クラス分類以外のタスクも色々行うことができるPyCaretdですが、それぞれの使い方をちゃんと調べたことがなかったので良い勉強になりました。

参考になれば幸いです。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
ある/Aru
ある/Aru
IT&機械学習エンジニア/ファイナンシャルプランナー(CFP®)
専門分野は並列処理・画像処理・機械学習・ディープラーニング。プログラミング言語はC, C++, Go, Pythonを中心として色々利用。現在は、Kaggle, 競プロなどをしながら悠々自適に活動中
記事URLをコピーしました