日立の社内ハッカソン参加者とPyCaretで競ってみた（前編）

# はじめに

こんにちは。(株) 日立製作所の [Lumada Data Science Lab.](https://www.hitachi.co.jp/New/cnews/month/2020/03/0330d.html) の小幡拓也です。

AutoMLの自動化ライブラリとして、PyCaretが2020年4月にリリースされました。オープンソースでありながら高度な機能を持つということで、自動機械学習を気軽に実行できるツールとして注目を集めています。そんな「期待のルーキー」のPyCaret、人間が手動でデータ分析した場合と比べて優れている点はあるのでしょうか？

今回、日立社内で実施したハッカソンで使用したデータを基にPyCaretでモデルを作成し、人がデータ分析した場合と比べて精度にどのような違いが出るのかを比較していきます。なお、データはクレンジング前のものを使用します。PyCaretにそのまま読み込ませると、処理結果にどのような影響が出るのでしょうか。

前編となる今回は、PyCaret のモデリング例を中心に紹介します。後編では、分析結果の精度比較などを中心に紹介します。

# PyCaretとは

PyCaret とは Python のオープンソース機械学習ライブラリで、機械学習モデル開発に必要なデータの前処理や結果の可視化が、たった数行のプログラミングでできてしまいます。

公式ホームページ：[PyCaret](https://pycaret.org/)

# 実施した社内ハッカソンとは？

日立グループ内の技術者が参加して1つのテーマに対して短期間でデータ分析を行い、その成果を競うイベントです。日立グループのデータサイエンティストの育成に向けた取り組みとして開催されています。2020年9月には、**札幌駅前地下歩行空間（通称：チ・カ・ホ）の30分後の歩行者数を予測する**というテーマで第2回目となるハッカソンが開催されました。

ハッカソンのテーマ企画、および使用するデータの準備につきましては[株式会社Mewcket様](https://mewcket.co.jp/)のご協力をいただき、ハッカソンのプラットフォームとして[Peakers](https://peakers.jp/)を使用させていただきました。

## ハッカソンで使用したデータセット

ハッカソンで使用したデータセットは主に次の内容で構成されています。

- 人流データ
  札幌駅前地下歩行通路内に設置されたセンサで検知した現時点および過去の歩行者数のデータです。センサーは５つあり、歩行通路内にほぼ等間隔で設置されています。今回のハッカソンでは、中央に配置されたセンサの値を他４つのセンサの値から予測します。
データは、[札幌市オープンデータポータル](https://ckan.pf-sapporo.jp/dataset/chikaho-jinryu)から入手したものです。
  
- 気象データ
  札幌管区気象台で観測された気象データで、リアルタイムに取得できた場合を仮定しています。データは、[気象庁](https://www.data.jma.go.jp/gmd/risk/obsdl/)から入手したものです。

ハッカソンで使用したこれらのデータセットを基に、PyCaretを使ってモデル作成していきます。

## ハッカソンの開催結果（人による分析）

社内ハッカソンの最終ランキングとスコアは次のとおりです。

今回のハッカソンでは、RMSE (Root Mean Square Error) を評価指標としモデルの精度を競いました。RMSEとは回帰モデルの一般的な性能評価指標であり、以下の計算式で表されます。RMSEの値が小さい、つまり実際の値と予測値のズレが小さいほど、当てはまりの良いモデルだといえます。
 
$$RMSE = \sqrt{\frac{1}{n}\sum_{i=1}^{n}\left( y_i - \hat{y}_i \right)^2}$$

$$y_iはi番目の実測値　\hat{y}_iはi番目の予測値$$

<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698645/f9d01ee6-da46-cf99-0e68-c8b03fb2d5d6.png"/>
</div>

# モデリング（PyCaretによる分析）

## データ読み込みからPyCaretの実行

下記のように実行すると PyCaret がデータを分析して、自動的に必要な前処理を実施してくれます。

**Tips：**下記のコードは汎用的なものを示しています。

```python
import pandas as pd
from pycaret.regression import *
# csvファイル読み込み
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test_Private.csv')

# PyCaret用にデータを準備
setup(train_data, target='目的変数', ignore_features=None, numeric_features=col_list)
```
今回のハッカソンのデータを使用して実施した結果が下記になります。

説明変数の次元が 45 から 666 に増えているのは、カテゴリ変数をダミー変数化した影響です。

![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698645/51a66b61-4197-2f4d-33e3-f6a4a592de69.png)

## モデルの比較

PyCaret はサポートする複数のモデルで学習し、複数の評価指標で評価した結果を出力します。説明変数の次元が 666 に増えていて非常に時間がかかるため、<span style="color: red; ">`catboost`</span>,<span style="color: red; ">`tr`</span>,<span style="color: red; ">`svm`</span>,<span style="color: red; ">`ransac`</span>を<span style="color: red; ">`blacklist`</span>に指定することで除外しています。

**Tips：**ハッカソンと同様、RMSEを評価指標としています。

```python
# Comparing All models
top3 = compare_models(n_select=3, sort='RMSE', blacklist=['catboost', 'tr', 'svm', 'ransac'])
```
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698645/c936c8f5-27db-26b7-1992-b118f7245382.png)

## 性能評価

今回は、最も精度の良いモデル「Extra Trees Regressor」を選択してテストデータを用いて性能評価しました。

```python
et = create_model('et')

# テストデータで評価
pred_data = predict_model(et, data=test_data)
# 評価指標はRMSE
print('RMSE', check_metric(pred_data['目的変数'], pred_data.Label, 'RMSE'))
```

```python
RMSE 223.43
```

# ハッカソン参加者 vs PyCaret

今回、PyCaret による分析結果はデータ分析初心者と同レベルとなりました。ただし、最も精度の高かった単一モデルを選択しただけのため、この結果となっています。

[後編](https://qiita.com/t-shimizume/items/1759c7134c03415d7aa4)では、複数のモデルを組み合わせたアンサンブル学習でどのぐらい分析精度が上がるかを検証します。

![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698645/88fc40c1-6061-d559-59a9-fde6f0a8eef7.png)