乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

予測モデル

先日、食べログ関係の裁判結果が
ニュースになっていたので
気になって調べちゃいました。

解説動画はこちら 


さて、最近こんな判決がニュースになっていました。

東京地裁は16日
グルメサイト「食べログ」の運営会社カカクコムに対し
3840万円の損害賠償金の支払いを命じる判決を出した。

気になってしまったので
二年前に作った
食べログの星を予測するモデルを
引っ張り出してきました。

当時の記事はこちら

さて、データも昔のデータが有ったので
そのまま流用してモデル作成です。

RandomForest
MAE :  0.08949504442045006
RMSE :  0.1153333553457383

download

精度としては
3.2と予測したら
実際が3.1 - 3.3くらいに落ち着くような
結果を出すモデルになります。

たまに大きく外れますが
まあ、誤差でしょう・・・。

これを踏まえて
今回の裁判を起こした側のお店のデータを取って
このモデルにかけてみました。

すると
スクリーンショット 2022-06-25 17.45.13

平均で0.18
最大0.4ほどずれる結果となりました。

予測よりも実測が全体的に低くなる
結果となりました。

download-1

誤差を見てみると
高い点を予測した方が
ズレが大きいですねー

download-2

予測モデルの検証では誤差が少ないものが
最頻値でしたが、この店舗のデータだと
結構外れていますね。


ここからは個人的な推測になりますが
この問題は一方的な意見のみを
見るべきではないと思っています。

採点アルゴリズムというのは
いわば企業秘密であり
秘伝のタレもようなものです
コーラの元みたいな。

他者に教える事は出来ないものであるので
いわば生命線となります。

これにいちゃもんつけて来た訳になるので
この際は白黒はっきりしてもらいたい訳です。

この手のアルゴリズムには
不正防止の観点から
有る程度の秘匿性を持って
運営を行う必要があります。

攻略できてしまったら
不正に点を釣り上げようとすることも
出来てしまう訳なので。

というわけで一方的に
食べログが悪いという判断はできません。

考えられる事象としては
・何らかの理由で故意に下げた
・不正の排除の結果下がった

というのが可能性としてあるのかなと思います。



おいしいお店はおいしく採点されるべきだし
おいしくないお店は
低くなっていないとおかしいです。

お店や食べログの利益は二の次
最優先に守るべきは
使うユーザー側の利益です。

ですので、裁判では
この点を白黒はっきりしてもらいたいですね。

今後もおもしろくなっていきそうです。

今回はこれまでです
それでは。



さて、今回は機械学習のお話です。

一応なんちゃって
MLエンジニアなのでねwwwwwww

食べログさんのお店をデータ化したら
星の予測モデルが作れました。

解説動画はこちら





以前の動画では
食べログ分布というものについて触れました。
前回の記事はこちら食べログ分布は有るのか

今回は
実際に星を予測するモデルを作っていきましょう。

さて
こういった機械学習を用いた
予測モデルを作成するには
まずはデータが必要です。


こちらは
みなさん頑張って集めてみて下さい!!!!!

データとしては
こんなデータです。

スクリーンショット 2019-10-26 21.13.18

コメント数、ブックマーク数や価格
コメントを残した人の星の平均などです。

そして予測をするのは
「星」のデータとなります。


予測モデルの作成に使用したコードは
次のようなコードになります。
import warnings
warnings.filterwarnings('ignore')

import pandas as pd
import numpy as np

from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
import xgboost as xgb
import lightgbm as lgm

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error

import matplotlib.pyplot as plt
%matplotlib inline


data_df = pd.read_csv('tabelog_star_data.csv')

data_df = data_df[data_df['星']>2.9]

X = data_df.drop(['星'],axis=1)
Y = data_df['星']
x_train, x_test, y_train, y_test = train_test_split(X,Y, test_size=0.3)

models = []
models.append(("DesicionTree",DecisionTreeRegressor(max_depth=8)))
models.append(("RandomForest",RandomForestRegressor(max_depth=8)))
models.append(("LightGBM",lgm.LGBMRegressor(max_depth=8)))
models.append(("XGBoost",xgb.XGBRegressor(max_depth=8,objective='reg:squarederror')))

result = {}
for name,model in models:
    print(name)
    model.fit(x_train, y_train)
    y_predict = model.predict(x_test)
    mae  = mean_absolute_error(y_test, y_predict)
    rmse = np.sqrt(mean_squared_error(y_test, y_predict))
    result[name] = [mae,rmse]
    print('  MAE : ',mae)
    print('RMSE : ',rmse)
    print()

少しづつみていきましょう。

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

pd.read_csv()でCSVファイルを読み込みして
データフレームに変換できます。

なおこのデータは
すでに「前処理」と呼ばれる
機械学習用のデータに
整形する工程を終えたデータで
全て数値型のデータになっています。


次に訓練用とテスト用のデータに分けます。

train_test_splitを用いると
簡単に振り分けることができるので楽です。

今回は3割テスト、残りを訓練用としました。

モデルは
今回は自分がよく使っている
決定木,ランダムフォレスト,LightGBM,XGBoost

こちらの4種類を使っていきます。

モデルの作成は
model.fit(x_train, y_train)

これだけで済んでしまいます。
機械学習と言っても
コードはたったこれだけなんですよね・・・

モデルの作成が終わったら
次はテストデータで予測を行い
その精度を検証します。

y_predict = model.predict(x_test)

予測もたったこれ1行だけで済んでしまいます。

あとはこの結果から
どれだけ誤差が出たのかを見て
精度を図ります。

誤差を見るのに
MAE
RMSE
を使います。

今回はざっくり検証なので
どれだけ誤差が出たのかだけを見ることとします。

DesicionTree
  MAE :  0.1047453451900971
RMSE :  0.14276028664764914

RandomForest
  MAE :  0.08806766700129451
RMSE :  0.11329995353232411

LightGBM
  MAE :  0.08365354791749746
RMSE :  0.10874470218772024

XGBoost
  MAE :  0.08733976372263648
RMSE :  0.11181978441280738

MAEはどんだけ誤差が出たかを平均したものです。
MAE0.083なら
+-0.083くらいはズレます。

実際の星が3.5だとして
大体予測が3.4-3.6くらいになるだろうという
モデルができました。

今回一番良かったものは
LightGBMですね。

誤差を可視化してみましょう。
tabe1

平均で0.083ズレですが
大きいところでは0.36くらいはズレてますね

誤差の累積だと
tabe2

80%くらいで0.15以内には収まりそうな感じですね。

予測の精度としては
まあまあなんじゃないでしょうか

これが仕事なら
クロスバリデーションしたり
パラメータいじったり
元々の特徴量作る集計の見直しなど
まだまだやること有ります。

色々すればもう少し
精度は上がるでしょうが
ざっくり検証なのでこれまでです。


さて
このデータのうちで
どれが一番予測に寄与しているでしょうか?

寄与度を出してみました。


191コメント数

181ブックマーク数

1711rate_1000_s_mean

1521rate_100_s_mean

1491rate_5000_s_mean

1341rate_500_s_mean

106夜価格低

1051year_500_s_mean

811rate_2000_s_mean

721year_1000_s_mean

683month_500_s_mean

656month_500_s_mean

631rate_10000_s_mean

55昼価格低

こんな感じでした。

コメント数やブックマークの数
コメントした人の星の平均点
ディナー価格などが
関係しているようです。

実際の星の計算は
もう少し複雑な計算方法で
違うものでは有ると思いますが
近い形の星を算出できたと思います、


これで、ブラックボックスであった
星の計算方法に少し
近づいたんじゃないかなーと思います。

食べログに掲載されているお店さんで
点数を上げたければ
ここら辺がポイントになるのではと
思ってはおりますが・・・

このデータには
お店側が食べログ側に
お金を支払っているかどうか
というデータが含まれておりません。

なので、実はお金を支払っていないから
星が下がったということも
考えられなくは無いので
実際の予測にはこの情報が不可欠です。

どなたか
このフラグ値お持ちでは
無いでしょうかwwwwwwww

今回はここまでです
それでは。


このページのトップヘ