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

機械学習

さて

先日のM-1グランプリみなさん見ましたか?

自分は「かまいたち」を優勝予想したのですが
見事に外れました!!!!

見事王者に輝いたのは
初出場の精鋭

ミルクボーイ

このネタが優秀すぎたので
判別モデルを作ってみました。

解説動画はこちら




まずはデータです。

ミルクボーイのネタをみて文字起こし!!
データ化します。

かどうか説明文
コーンフレーク甘くてカリカリしてて牛乳とかかけて食べるやつ
違う死ぬ前の最後のご飯もそれでいい
コーンフレークまだ寿命に余裕があるから食べてられんねん
コーンフレーク最期のごはんに任命されたら荷が重いよ
コーンフレークなんであんなに、栄養バランスの五角形が広いんかわからん
コーンフレークパッケージに書いてる五角形めちゃくちゃでかいんやから
コーンフレーク自分の得意な項目だけで勝負してる
コーンフレーク牛乳の栄養素を含んだうえでの五角形
違う晩御飯ででてきても全然いい
コーンフレーク晩飯で出てきたらちゃぶ台ひっくり返す
コーンフレークまだ朝の寝ぼけてるときやから食べてられる
コーンフレーク食べてるうちにだんだん目が覚めてくるから、最後にちょっとだけ残してまう
コーンフレーク子どもの頃、なぜかみんな憧れたらしい
コーンフレークミロとフルーチェは憧れた
コーンフレークトランシーバーも憧れました
違うお坊さんが修行も時に食べてる
違う精進料理にカタカナのメニューなんかでえへん
コーンフレーク朝から楽して腹を満たしたいという煩悩の塊
コーンフレークあれみんな煩悩に牛乳かけてる
コーンフレークパフェとかの傘増しに使われているらしい
コーンフレークあれは法律スレスレぐらいはいっとる
違うジャンルでいうなら中華
違う中華だけではない
コーンフレーク回るテーブルの上においたら回したとき全部飛び散る
コーンフレーク食べてるときに誰に感謝したらええかわからん
コーンフレークコーンフレークは生産者さんの顔がうかばへん
コーンフレーク浮かんでくるのは腕組んでるトラの顔だけ
コーンフレーク赤いスカーフのトラの顔だけ
違うおかんがではないと言えばちゃう
こいつをそのままコピーしてcsvファイル化してもらえば
できると思います。


できたらモデル作りに入ります。

まずはライブラリのインポート
import codecs
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix

import warnings
warnings.simplefilter('ignore')
from janome.tokenizer import Tokenizer
t = Tokenizer()

お次は
データの読み込みです。
df = pd.read_table('corn_model_data.csv')
df.head()
mb1



データが読めたら次は
辞書を作ります。

このモデルは形態素解析を用いて
文章を単語化し、その単語をモデル用に使います。

単語辞書を先に作ります。
word_dict = {}
for i,v in df.iterrows():
    for token in t.tokenize(v[1]):
        h = token.part_of_speech.split(',')[0]
        if any([h=='名詞',h=='動詞',h=='形容詞']):
            key = token.surface
            word_dict[key]=0

さて用意ができたら
学習データの作成に入ります。
df['y'] = df['かどうか'].replace({'コーンフレーク':1,'違う':0})

目的変数は0,1でないといけないので
コーンフレークを1,違えば0にして設定します。

次に元のデータの文章を形態素解析して
単語が有れば1,なければ0と言うデータフレームを作り
元のデータフレームに結合します。

columns = [k for k,v in sorted(word_dict.items())]
tf_df = pd.DataFrame(columns=columns)
for i,v in df.iterrows():
    tmp = word_dict.copy()
    for token in t.tokenize(v[1]):
        h = token.part_of_speech.split(',')[0]
        if any([h=='名詞',h=='動詞',h=='形容詞']):
            key = token.surface
            if key in tmp:
                tmp[key]=1
    tmp_list = [v for k,v in sorted(tmp.items())]
    tmp_df = pd.DataFrame(data=np.array(tmp_list).reshape(1,len(tmp_list)),columns=columns)
    tf_df = tf_df.append(tmp_df)

tf_df = tf_df.reset_index(drop=True)
data_df = pd.concat([df,tf_df],axis=1)

これでデータは揃いました。

学習用には
説明変数と目的変数が必要なので
いらないものを除外して設定します。
x = data_df.iloc[0:,3:]
y = data_df['y']

次は学習ですね

機械学習史上最も雑な判別モデルの作成です。

とにかく全部データ使ってモデルを作ります。
model = LogisticRegression(fit_intercept = False)
model.fit(x,y)

predict = model.predict(x)
print('Accuracy : {0}%'.format(accuracy_score(y, predict)*100))
print(confusion_matrix(y, predict, labels=[0,1]))
Accuracy : 100.0%
[[ 7 0]
[ 0 22]]

判別モデルの検証も適当にしていますが
正解率100%と言うギャグのようなモデルが出来上がります。

最後に
このモデルを使えるようにしましょう!!!

ここでは
widgetを使ってjupyter上で使えるようにしています。
from __future__ import print_function
from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets

def callback(word):

    if len(word)>0:
        data = word_dict.copy()
        for token in t.tokenize(word):
            h = token.part_of_speech.split(',')[0]
            if any([h=='名詞',h=='動詞',h=='形容詞']):
                key = token.surface
                if key in tmp:
                    data[key]=1

        input_list = [v for k,v in sorted(data.items())]
        input_df = pd.DataFrame(data=np.array(input_list).reshape(1,len(input_list)),columns=columns)
        input_predict = model.predict(input_df)

        if input_predict==1:
            print('それはコーンフレークや!!!')
        else:
            print('コーンフレークちゃうやないかい!!')
    else:
        print()

interact(callback,word='')

実行してみると
mb2

入力値に対して判別結果が出力されます。


mb3

mb4


はい
このような判別モデルですが
データさえあれば
なんとかなるもんですね

まあ、学習用のデータに用いたものしかコーンフレーク認定されない
雑な学習モデルですが
初学者の学習用にはなかなか面白いかもしれません。

ミルクボーイのネタはまだまだ沢山あるので
以下のようなものもイケますね!!
・モナカかモナカ違うか
・サイゼかサイゼちゃうか
・俳優か男優か etc


M-1が始まる前までは
個人的には「かまいたち」を 優勝予想していたものの

ミルクボーイのネタの完成度には 正直驚きましたねーーー

その他の細かい予想は当たったので
データからお笑いに関する予測するということも
面白い研究分野の一つになっています。

最後に データからM-1で優勝する方法について
需要が有ればやりたいですねー

芸人の方々、ご連絡くださいませ!!

それでは

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

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

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


はいどうもこんばんは乙pyです。

今日はニコニコ動画さんの
有料会員の推移が気になってしまったので
有料会員数の予測をしてみました。

解説動画はこちら


まずニコニコ動画さんの
最近の有料会員数ですが
決算などで発表されているので
そこからデータ化しました。
年(期) 会員数(万人)
2015-09 253
2015-12 254
2016-03 256
2016-06 256
2016-09 256
2016-12 252
2017-03 243
2017-06 236
2017-09 228
2017-12 214
2018-03 207
2018-06 200
2018-09 194
2018-12 188


さてこれをPythonを使って予測していきます。
最初に必要なライブラリの読み込みです。
from fbprophet import Prophet
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

次の会員数をデータ化します。
データはPandasのデータフレームにします。
df = pd.DataFrame({
    'ds': pd.to_datetime([
        "2015-09-01","2015-12-01","2016-03-01","2016-06-01",
        "2016-09-01","2016-12-01","2017-03-01","2017-06-01",
        "2017-09-01","2017-12-01","2018-03-01","2018-06-01",
        "2018-09-01","2018-12-01"])
    ,'y': [253,254,256,256,256,252,243,236,228,214,207,200,194,188]
} , index=pd.to_datetime([
    "2015-09-01","2015-12-01","2016-03-01","2016-06-01",
    "2016-09-01","2016-12-01","2017-03-01","2017-06-01",
    "2017-09-01","2017-12-01","2018-03-01","2018-06-01",
    "2018-09-01","2018-12-01"
]))
これでデータフレームの完成です。

一旦可視化をして推移を見てみましょう。
plt.figure(figsize=(12, 6))
plt.scatter(df.index, df['y'])
plt.xticks(rotation=70)
plt.show()
nico01

このような会員数の推移ですね。
2015年あたりをピークに
そこからは下降路線をたどっています。

この推移から未来を予測します。

予測にはFacebookの
Propfetというライブラリを用います。

モデルの呼び出しも簡単です。
#モデルの呼び出し
model = Prophet()
学習も1行で終わります。
#学習
model.fit(df)
学習させるにはコツが必要で
時間に該当するものを ts というカラムでTimestampにしておく
数値は y というカラムでデータフレームに定義しておく
必要があります。

ファイルを読み込んでデータフレームを作った際は
カラム名やカラムのデータ型を
Propfet用に合わせる必要があります。

次に予測です。

予測は未来3000日分としました。
このライブラリは日で計算されるようで
引数 periods に日数を入れてあげて
model.make_future_dataframe()という関数を
呼んであげます。

そうすると予測用のデータフレームが作られます。

最後にmodel.predict()で作ったデータフレームで
予測結果のデータフレームを作ります。
#予測
future = model.make_future_dataframe(periods=3000)
forecast = model.predict(future)
たったこれだけで未来予測が終わります。

使える変数は日付と数値だけと
変数が少ないので
簡易な予測にはもってこいのライブラリです。


最後に予測の結果を可視化しましょう。
# 可視化
model.plot(forecast) plt.show()
nico02

日での予測の結果はかなり上下動が激しい感じなので
周期性の方を見てみます。

model.plot_components(forecast)
plt.show()
nico03

はい
これだと綺麗に予測の結果が出ますね。

このままの下降ラインをたどると
2026年には有料会員数が0になるという結果がでました。

下振れが激しければ2024年でも
有料会員数が0になる未来もあり得るという予想結果でした。

あくまでも現状の数値を使っての予測のため
そのままの下降線をたどるということは
少ないかもしれませんが

施策次第では
V字回復もあり得るシナリオではあるので
これからのニコニコ動画さんの
巻き返しに注目したいところです。

頑張れニコ動!!!

ディープラーニングを活用した
AIの社会実装事業を展開する株式会社ABEJAの主催する
カンファレンスイベント

ABEJA SIX 2019

こいつに行ってきました。

場所は品川駅徒歩五分くらいのところにある
グランドプリンスホテル新高輪の国際館パミール

会場には12:40分くらいに着いたものの
かなりの人で受付もすっごい並ぶ

基調講演はサテライト会場だったのだが
これもほぼ満員

まず最初は
株式会社ABEJA 緒方 貴紀 氏 

ABEJAのこれまでの振り返りと
今後のロードマップや展望について

2012年のディープラーニングの
ブレイクスルー以降
世界中でDL周りの研究開発が進み

今では主要な大会社では
ほぼほぼ実装が済んで
サービス展開されてる感があるが

様々な会社向けにAIの実装を手助けする
プラットフォームという印象のABEJA PLATFORM
を展開してますよ、ということだそうです。

近年のトピックの話

いくつかのワードが紹介された


イメージネットの分散学習による高速なモデルの生成
分散学習の民主化がなされたとのこと


3億枚の画像と512個のGPUで作られた
敵対的生成ネットワークだとか
生成された画像を見ても
区別がつかないな



2018年10月11日にGoogleからArxiv公開された論文で
汎用言語表現モデルだそう。

文中の単語の穴埋め問題などが解けるとか
自然言語処理の
デファクトスタンダードになるそう。

最近はこういうトピックが
ありましたとのことでした。

ここら辺はgithub にコード類も公開されているらしいので
情報はすぐ手に入りそうですね。

ABEJA PLATFORMでは
1.データ取得
2.データ蓄積
3.データ確認
4.教師データ作成
5.モデル設計
6.学習
7.評価
8.デプロイ
9.推論
10.再学習

ここら辺をサポートするよう
システム化したんだそうです。

いろいろ機械学習をする上では
手間のかかるところ多いですね。

学習はあっちゅうまだけど
データの整備と前処理で
死ぬほど時間かかってますから
それが軽減されると仕事は捗るよねーー。

リリースから6年ほど経つみたいで
現在では

600アカウント
データレイク 10TB
データセット170万
トレーニング 1万ジョブ
モデル500モデル 2千万バージョン
4000を超えるエンドポイントが
存在しているのだとか

うーーん、かなりのボリュームです。

スポンサーに
AWS , GCP , NVIDIA
とあるのでここら辺のクラウドやGPUで
達成されているのでしょう。

気になったのは
アノテーションの部分

ABEJA PLATFORM ANNOTATION

恐らくAI開発にとっては
アルゴリズムは民主化され、誰でも
同じアルゴリズムで学習や推論が行えるようになっているため

AIの差別化がはかられる部分としては
学習データの質とボリュームの部分での競争になる。

ゴミデータが大量に有っても
結果ゴミだし
そうなると質の高い学習データを揃えるのには
それなりのコストがかかる。

それをサポートするツールということで
UIも素早くアノテーションでき使い勝手がすごく良さそう。

これはAI関連サービスの中でも
いい所を突いたサービスだと思われる。

これにより、人間の目で補正をすることで
より質の高いデータを素早く生成できると・・・

画像や動画だけでなく
テキストや単語、文章へも対応と
よく出来ています。

ABEJA インサイト for リテール
店舗内行動のダッシュボード化
行動の定量化とデータドリブンな経営の支援をするためのツール

日々10TBトラフィック解析
700店舗のインストール
2億人のビジターを計測ということで
すでに我々もトラッキングされているでしょう。

雑貨、アパレル、商業施設の導入が多い。

顔認証によるリピート推定と
TOFセンサーによる店舗トラッキングの様子が
なかなか印象的だった。
店舗内回遊はこんな風に捕らえられているのね。


今後のロードマップ

データサイエンティストの不足で
初期検証を行えないというニーズに対して
初期検証の支援を行うmlaas
というのを出す?そうです。


あとは
アベコインとかいうものを作って
会場を巡ったりするともらえたりするそう。

深センへのツアーでの
キャッシュレス社会の体験をヒントに
コインを作ったそうで
今後このコインでいろいろ実験するそうです。

ここまでが基調講演



株式会社ディー・エヌ・エー 
AIシステム部 副部長
内田 祐介 氏 


DeNAの事業や組織、AI関連の研究成果の話

DeNAではkaggler制度があり
kaggleの成績が社内にも反映されるそうで
高成績を残せると、労働時間を多くkaggleにさけるそうです。

kaggleのメリットとしては
1 問解くだけで
1案件回した時と同じくらいの学習体験と
様々なお題に対応するために多様な手法、アプロート方法を
学ぶことによるスキルアップの効果が大きいということでした。

まあ、懸賞金付きのやつとかは
リクルーティングにも使われているわけで
kaggleマスターを抱えるているという
ブランディング効果も見込んでいるのだとか。

これはkaggle大好きな皆さんは
DeNA行くしかないですね。

DeNA社内は
データサイエンティスト
MLエンジニア
インフラエンジニア
AIエンジニアがいて
それぞれ作業分担されている組織構造

AIの検証、プロト開発から実装まで
行える体制が整っているのは大分強いですね。

DeNAでは
様々な事業基盤があり
そのなかでもAI開発が進んでいるのが
オートモーティブ事業

交通事故低減に向けた
AI技術活用の取り組みをしているだと。

レーン検出と危険運転察知アルゴリズムの開発
物体検出や消失点の計算
3D地図を用いたパスプランニング

自動運転系の技術は結構奥深いですよね。

次にゲーム事業

「逆転オセロニア」

におけるユーザーの離脱防止策についてのお話

ゲーム初期に離脱してしまう原因として
ゲームのデッキの組み方が分からないとかが有り、
おすすめデッキを導入したら比較的離脱が防げたと。

こういった序盤のサポート機能を追加する部分で
いろいろデータ分析と検証を進めているそうです。

最後が
アニメの生成技術への取り組み

GANを用いて
アニメのコマとコマの間を生成し
ぬるぬる動くように
中間コマを作ったのだとか。

従来のGANでは全身を作るのが難しかったが
パーツごとに少しづつ作ってゆく手法を取り
徐々に小さな画像からつなげるようなアプローチで
画像生成しているそうです。

確かにヌルヌル動きますね。


次の講演は
株式会社サイバーエージェント 
AI Lab Research Scientist
山口 光太 氏 


機械学習による広告クリエイティブの制作支援と生成

まあ同業者なので
同じようなことやってます。

デジタル広告は
マス広告と違って、同じ素材、同じ図柄ではなく
一人一人にカスタマイズした広告であることが求められる。

広告バナーそのものを
どれだけクリックされるのかを
事前予測して作ることができるとか。

手法としては
広告の画像そのものと
広告の配信条件を学習データとして
クリック率を出す単純な回帰のモデルを組む

これにより配信前に
ある程度の品質保証ができ
適切な入稿対象の選択と結果予測が可能になると・・・

まあ
みな考えることは一緒ですね。

面白かったのは配信メディアで
クリックに効く要素が違うということ

FBは画像やテキストの品質
TwitterとLINEは広告の配信設定だったと。

あとは機械学習のモデルも
画像とかを使わないのであればDLを用いずに
デシジョンツリーなどの方が結果が良いとか
逆にDLが効果を発揮するのは
高次元のデータを取り扱う際だとか。

ここら辺も広告業界では
共通認識ですね。

こういう予測を元に
クリエイティブ制作の支援として
ストック素材の画風変換
バナー人物の自動差し替え
レイヤーの配置予測や
キーワードの生成

などを行っているそうで
クリエーターの作業軽減につながっているそうです。

やはり、同じ業界だと
同じデータで同じ手法に収束するのだなーと
改めて感じた1日でした。


明日も開催されますが
行けないかなーー・・

松尾豊先生の講演は聞きたい。

このページのトップヘ