はじめに
はじめまして、私は2022年に新卒としてBIPROGY株式会社に入社した高場です。
今回は若手社員の仕事紹介として記事をまとめます。
組織の紹介
私が所属している組織は AI 技術部と言い、主に AI を用いたサービスの検討等を行っています。
また、企業や研究機関と協力して共同研究を行うこともあります。
その中で私は主に自然言語処理や時系列データを扱う案件を主に担当しています。
案件紹介
全体概要
自然言語処理を取り扱っている案件としては、学校教育への支援システム(PoC)などがあり、時系列データの取り扱っている案件としては、 国立研究開発法人科学技術振興機構(JST) と協力して行っている 個人及びグループの属性に適応する群集制御1があります。
今回の記事では、時系列データを取り扱っている群集制御(群集マネジメント)に関する取り組みについて簡単紹介にします。
群集マネジメントとは
群集マネジメントとはざっくり言うと 集まった人々の安全・安心と快適な徒歩移動を支え、人々の満足度を高める予防安全活動 です。
群集事故は世界中で発生しており、日本でも明石花火大会歩道橋事故2など、多くの群集事故が発生しています。
このような群集事故は、人の流れが滞留することで発生します。
群集事故の発生を防ぎ、世界一の安全・安心社会の実現のための本格研究として 個人及びグループの属性に適応する群集制御1 を東京大学 西成 活裕 教授を代表として3大学4社で実施しています。
共同研究では、群集事故が発生するリスクを大幅に低減するため、人の流れの滞留発生メカニズムを解明し、効果的に人の流れを誘導する手法の確立を目指しています。
群集マネジメントにおける役割
群集マネジメント研究における私自身の仕事の役割としては、与えられた時系列データを用いて、n分後の同場所に何人の人がいるかを予測するモデルの作成です。
技術紹介
ここからは、実際にモデルの作成について説明します。
時系列データ
時系列データとして扱ったものはあるエリアにおける1分毎の滞在人数のデータです。
時系列データの例を以下に示します。(実際に扱ったデータとは異なります)
x_train.head(5)
people_count | |
---|---|
0 | 0.0 |
1 | 2.0 |
2 | 2.0 |
3 | 0.0 |
4 | 1.0 |
この時系列データをグラフとして可視化した結果を以下に示します。
可視化には、plotly
を用いました。
import plotly.express as px
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(
go.Scatter(
y = X_train["people_count"],
mode = 'markers+lines',
marker = {'size': 3},
name = "people_count"
)
)
モデルの選定
時系列予測の代表的なモデルとしては Long Short-term Memory(LSTM)3 が挙げられますが、今回は LightGBM4 を用いました。
LightGBM を用いた理由は、近年の時系列コンペティションでは主に LightGBM が使用されていること、LSTM でも時系列予測を行ったが予測がうまくいかなかったこと、が挙げられます。
前処理
前処理として以下の情報を追加しました。
- n 分前のデータ(n = 1 ~ 20)
- n 分前との滞在人数の差分(n = 1 ~ 20)
- 年、月、日、時、分の情報
- 曜日の情報
- 祝日の情報
- 前日の人数情報
- 天気の情報
- 天気の情報
- 気温の情報
- 降水量の情報
前処理を行ったデータを以下に示します。
x_train.head(5)
モデルの学習
モデルの学習時には、Optuna
を用いてハイパーパラメータの調整を行いました。
Optuna
を用いて LightGBM のハイパーパラメータの調整を行う方法は import
の部分を
import lightgbm as lgb
以下のように変更するだけで簡単に行えます。
import optuna.integration.lightgbm as lgb
実際に今回使用したモデルの部分は以下になります。
params = {
"objective" : "regression",
"metric" : "mse",
"boosting_type": "gbdt",
"num_leaves": 63,
"learning_rate": 0.01,
"feature_fraction": 0.8,
"bagging_freq": 1,
"bagging_fraction": 0.8,
"random_state": 0,
"verbose": -1
}
lgb_results = {}
model = lgb.train(
params,
lgb_train,
valid_sets = [lgb_train, lgb_test],
valid_names=['Train', 'Test'],
num_boost_round = 3000,
# プログレスバーの非表示
show_progress_bar=False,
callbacks=[
lgb.record_evaluation(lgb_results)
]
)
best_params = model.params
最終的に得られたパラメータは以下になりました。
{'objective': 'regression',
'metric': 'l2',
'boosting_type': 'gbdt',
'num_leaves': 84,
'learning_rate': 0.01,
'feature_fraction': 0.8999999999999999,
'bagging_freq': 1,
'bagging_fraction': 0.8,
'random_state': 0,
'verbose': -1,
'feature_pre_filter': False,
'lambda_l1': 0.0,
'lambda_l2': 0.0,
'min_child_samples': 20,
'num_iterations': 3000}
予測結果
該当エリアの時系列データにおける 3 分後予測の結果を以下に示します。
赤線が実データで青線が予測結果となっています。
結果としてはおおむね予測がうまくいくような結果でした。
しかし、3 分後の予測だけでは、実社会で何かを対策を行う(混みそうだから警備の人を増員する)ためには時間が足りないため、これよりも長期の未来の予測を行っていく必要があるという結論となりました。
実社会に適用できる AI の開発はこのように一見うまくいくような結果となったとしても実際には課題が残る結果となることはよくあることですが、そこが難しく面白いポイントだと思っています。
We Are Hiring!