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

機械学習

今回は機械学習の自動化が出来るかもしれない
ライブラリを使ってみました。

解説動画はこちら



今回使用するのは
PyCaretというライブラリです。


これはPythonで実装された
オープンソースの機械学習ライブラリーで
機械学習の一連の作業を自動化する
「AutoML」をサポートしています。

つまり
数行で機械学習のコードを
代替できてしまう優れものです。

利用するためには
あらかじめインストールされている必要があります。

pip install pycaret


それでは早速サンプルコード見ていきましょう。


ボストンの住宅価格のデータで
検証してみることにします。

目的変数は
medv : 住宅価格
になります。

最初にライブラリ群を読み込みします。
データもPyCaretの中から読み込みます。

# ライブラリの読み込み
import pandas as pd
from pycaret.regression import *
from pycaret.datasets import get_data
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error

boston_data = get_data('boston')
train, test = train_test_split(boston_data)

次にセットアップです。
ここではデータと目的変数を指定します。
# セットアップ
#データと目的変数を指定する
exp1 = setup(data = train , target = 'medv', ignore_features = None, session_id=1)
たったこれだけで、データの検証が終わってしまいます。
スクリーンショット 2021-12-11 16.48.38



これが終わったら次は
モデルの精度を比較します。

# モデルを比較する
compare_models()
スクリーンショット 2021-12-11 16.48.53
1行実行するだけで複数のモデルを比較して
結果を出してくれます。

今回は回帰のモデルで比較を行いましたが
一番良いのは「et」(Extra Trees Regressor)
というモデルでした。

これを使ってみることにしましょう。
# 精度の良さそうなやつでモデルを作ってみる
model = create_model('モデルのラベル')
スクリーンショット 2021-12-11 16.48.59


クロスバリデーションも自動で行ってくれてるようです。
次はパラメータをチューニングしてみましょう。

これも1行で出来てしまいます。

# モデルのチューニングを行う
tuned_model = tune_model(model , optimize = 'MAE')
スクリーンショット 2021-12-11 16.49.05

パラメータチューニングをした方が
やや精度が落ちている気がしますが
気にしないことにしましょう。

これでモデル作りは終わりなので
形にします。

# 最終的なモデルを作る
final_model = finalize_model(tuned_model)
final_model
スクリーンショット 2021-12-11 16.49.11

はい、モデルが出来上がりました。
早くてあっとゆーまでした。

モデルの評価部分も自動でたくさんの
評価軸を出してくれます。

# モデルの評価
evaluate_model(tuned_model)
スクリーンショット 2021-12-11 16.49.18

UIでいろいろ指標を変更できるようです。

最後にテストデータでの検証を見てみましょう。

#テストデータで検証
result = predict_model(final_model, data = test)
y_true = result['medv']
y_pred = result['Label']

mean_absolute_error(y_true, y_pred)
3.2223362928049464

パラメータチューニングの結果と
遜色ない結果となりました。

さらにアンサンブル学習のモデルを作るのも
簡単です。
モデルを指定したのを引数に加えるだけです。

# アンサンブル学習
model1 = create_model('gbr')
model2 = create_model('et')
model3 = create_model('lightgbm')
ensemble = blend_models([model1, model2,model3])
スクリーンショット 2021-12-11 16.49.30

これもなかなか精度が良さそうな結果になっています。

複数のモデルを使った検証が
10行ほどのコードで出来てしまいます。

いやー
恐ろしい物ですねー


まとめ

あれ?これだけのコードで済むなら
機械学習エンジニア要らなくね?????
と思ってしまいました。

特にこれと似たようなサービスである
DataRobotさんはほぼほぼ要らなく無いですかねー

こういう便利なライブラリが出てくると
機械学習のモデルを作っているエンジニアって
めっちゃくちゃ価値が下がってきますね・・・

要らなくならないように、頑張らないと・・・・

ということで今回は
機械学習の自動化が出来ちゃう
PyCaretのご紹介でした。

それでは。

さて

先日の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

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


このページのトップヘ