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

食べログ

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

一応なんちゃって
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

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


さて
最近話題に上がった

食べログ分布

に関して
そんなものが存在するのかどうか
検証してみました。

解説動画はこちら



食べログ分布を手元で見たい方は
まずは
データを集めてください。

食べログさんのサイトへ行って
コピペしていただければ
集まるかなーと思います。

集めるのは大変だと思うので
こちらで集めてみました。

手元のデータは
東京の店舗で
約36千件です。

これを可視化してみましょう。

評点で3-4だけに絞っていますが
全店舗だとこうなりました。

zenken

縦が店舗数
横は評点です

3.0-3.1あたりがボリュームが多いですね

おそらくですが
加盟したばかりの店舗というのは
3.0から始まるのではないかと思います。

有る程度コメントなどが加味されて
評点が決まっていくのではないかな?
と思われます。

ということで
有る程度コメントがある店舗に絞って
みてみましょう。

コメント100より多い店舗だけに
絞って可視化してみると・・・

100ken

どうでしょうか

分布が変わりましたね。

有る程度
コメント数などで
評点が定まってくるのだと思います。

この場合はボリュームゾーンが
3.6あたりになりますね。

自然界のデータを無作為に抽出すると
正規分布を取ることが多いので
正規分布も重ねてみましょう。

seiki

赤線は平均を3.6とした際の正規分布です。

どうでしょう
正規分布と比べると
ややスカスカしてる部分が有りますね!!!!

seiki2

これがそのスカスカ部分を囲ってみたものですが

評点に対する店舗数は
正規分布に収束するという仮定だと

もう少し3.6-3.7と
3.8-3.85くらいまでの店舗が
存在していてもおかしくはないのですが
少ないんですねーーー

このやや
歪な感じの分布というのが
「食べログ分布」
ということになります。

有りましたね!!

正規分布などに比べると
いびつさが際立つ分布になるという
結果になりました。

さて
いかがでしたでしょうか?

あと余談ですが
色々みてみると
食べログさんは

「3.0から5.0までの20段階評価である」

ということが分かりました。

なので
3.5と言っても20段階で見れば
それほどでも無いのです。

ただし、店舗の大半は
3.5に到達しないので

3.5も有れば相対的には
良く見えるよ、ということなのでしょう。

単純にコメント数の大小などでは
この評点は決まらない仕組みなのでしょうね

そもそも仕組みを公開してないと思いますし

この評点を信じるのか
自分の舌を信じるのかは
あなた次第です!!

このページのトップヘ