読者です 読者をやめる 読者になる 読者になる

From Pure Math to Applied Math

Stat/ML from a pure mathematical perspective.

ラーメン屋の名前からラーメン屋の食べログスコアを推定出来ると思って頑張ったがやっぱり無理だった話

Deep Learning データ解析 実験

「うわっこのラーメン屋不味そう」

「変な名前だしやめとこ」


みたいな感覚、誰しもあると思います。(僕だけ…?)



と言うわけで、ハヤシくんはやしくんさん (@tree0_0tree) | Twitter全面協力の元

日本中のラーメン屋のデータを集め

ラーメン屋の名前から食べログスコアを推定に挑戦してみました、と言う報告です。

§1. データセット

今回はスーパーエンジニアハヤシくんがデータを猿のようにかき集めて、

Columnsが
1列目: ラーメン屋の名前
2列目: 食べログスコア
3列目以降 : ラーメン屋の名前をmecab分かち書きした各単語

で構成されるcsvファイルを都道府県毎に用意してくれました。

感謝感激。

§2. w2vのモデル作成

まず、すべてのラーメン屋の名前をramen_name.txtファイルに書き出しました。
そこからコーパスを作りw2vのモデルを作成しました:

from gensim.models import word2vec
data = word2vec.Text8Corpus('ramen_models/ramen_name.txt')
model = word2vec.Word2Vec(data, size=50, min_count=1, window=3)
model.save("ramen_models/w2v_models/ramen_word2vec_size_50_min_1.model")

size=50,100,200
min_count = 1,2,3

で計9個のモデルを作りました。

§3. 前処理

◯ターゲットについて

本来であれば

ラーメン屋の名前の単語系列 --> 食べログスコア(スカラー)

と言う回帰モデルを構築したかったのですが、非自明なモデルが全く作れなかったため、

ターゲットとベクトルは食べログスコア(2.8ぐらい〜4.3ぐらいの区間)を4分割に

離散化して分類タスクにすることにしました。*1

◯特徴量について

w2vのモデルを使って

ラーメン屋の名前 --> 単語数 × w2vのモデルの出力次元

と言う時系列データに変換、そして、最大の単語数を算出し、0ベクトルを追加して系列の長さを整えました。

§4. モデル

前処理によって得られたのは

◯shape = (全国のラーメン屋の数) x (全国のラーメン屋の名前の最大単語数(系列の長さ)) x (w2vモデルの出力次元) のテンソル

◯大きさが全国のラーメン屋の数の、離散化(4分割)された食べログスコアクラスに値を持つベクトル

です。

これを学習させるためにKerasでRNNを構築しました。

より具体的に以下の図のようなモデル*2

f:id:mathetake:20170205205740p:plain

を実装しました。図ではAverageのPoolingレイヤーが入っていますが、結果的にはMaxPoolingしたほうが精度が良かったです。

コードは以下のようです:

model = Sequential()
model.add(SimpleRNN(hidden_neurons, batch_input_shape=(None,length_of_sequences, in_neurons),activation="tanh", return_sequences=True))  
model.add(MaxPooling1D(pool_length=length_of_sequences)) #出力は (None,1,hiden_neuraons)
model.add(Reshape((hidden_neurons,))) #出力を (None,hiden_neuraons)に直す
model.add(Dense(out_neurons,W_regularizer=l2(0.01)))
model.add(Activation("softmax"))
model.compile(loss="categorical_crossentropy", optimizer="RMSprop")
model.fit(x_train, y_train, batch_size=batch_size, nb_epoch=nb_epoch, validation_split=0.05)

§5. 結果

どんなに頑張ってチューニングしたりモデルチェンジしても、学習に使っていない、全データの中の20%(約6000件)に対するテストで

31±0.35%

の精度は超えられませんでした。(§4のモデルが一番精度良かったやつです。)


4値分類タスクなので、ランダムに選ぶ(25%)よりは6%ほど精度がよいので非自明っちゃ非自明ですが……。



おもしろいもの作ってウェブサービスにしましょ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜!


って意気込んでいた二人の落胆たるや、お分かりいただけますでしょうか。


いいですか皆さん


ラーメン屋さんは名前で選んではいけません。

*1:区間のサンプルの数が均一になるようにpandasのqcutで離散化しました。

*2:LSTM Networks for Sentiment Analysis — DeepLearning 0.1 documentation