見出し画像

Pythonで機械学習『レストランのチップ額の予測』003/100

LightGBMに慣れたいので、3記事分くらい、とにかく作業してみる。
1回目の今回は、seabornのデータセットからTIPS。
アメリカのあるレストランでとられたデータから、チップを予測する。

使用するライブラリをインポートして、
df = sns.load_dataset('tips')でデータセットをロード。
df.info()で見てみると、カテゴリ変数が4つ。欠損値はなさそう。
--- ------ -------------- -----
0 total_bill 244 non-null float64
1 tip 244 non-null float64
2 sex 244 non-null category
3 smoker 244 non-null category
4 day 244 non-null category
5 time 244 non-null category
6 size 244 non-null int64
dtypes: category(4), float64(2), int64(1)


データの中身はこんな感じ。

スクリーンショット 2021-11-30 13.01.09

まずは、tipをYというdfに、それ以外をXというdfに入れた。
次に、X内のカテゴリ変数を数字に変換。

from sklearn.preprocessing import LabelEncoder
categories = X.columns[X.dtypes == 'category'].tolist()
print(categories)

['sex', 'smoker', 'day', 'time']のカラムを数字にする。

for cat in categories:
       le = LabelEncoder()
       le = le.fit(X[cat])
       X[cat] = le.transform(X[cat])
       X[cat] = X[cat].astype('category')

その結果が、下記↓

スクリーンショット 2021-11-30 13.02.32

順調だ。

次に、データを分割する。

from sklearn.model_selection import train_test_split

train_x,valid_x,train_y,valid_y = train_test_split(X,Y,random_state=777,test_size=0.2)

知ってる人には当然だと思うんだけど、2行目の前半の順番、大事。順番がおかしいと、エラーになる。僕はこれで30分検索漬けになってしまいました。①学習用の説明変数X、②検証用の説明変数X、③学習用の目的変数Y、④検証用の目的変数Yの順で書く。

次は、モデルを作るための準備。データセットにし、パラメーターを設定する。

import lightgbm as lgb

lgb_train = lgb.Dataset(train_x,train_y)

lgb_eval = lgb.Dataset(valid_x,valid_y,reference = lgb_train)

lgbm_params = {
   "objective":"regression",
   'metric':'rmse',
   "random_seed":777,
}

そして学習。

model_lgb = lgb.train(lgb_params,
   lgb_train,
   valid_sets=lgb_eval,
   categorical_feature = categories,
   num_boost_round=100,
   early_stopping_rounds=10
)

結果はこちら。

スクリーンショット 2021-11-30 13.03.50

指標は、RMSE(2乗平均平方根誤差)。
各変数の重要度はこちら↓

スクリーンショット 2021-11-30 13.27.38

パーセンテージでチップを払う人が多いだろうから、total_billが重要なのはわかる。でも喫煙者ってどういうことだ?調べてみよう。

スクリーンショット 2021-11-30 13.32.45

あれ、喫煙者かどうか別の平均、ほとんど一緒。
というか、重要度ってなんだっけ。単位はなんだ??

Feature Importance

Feature Importanceとは、どの特徴量がこのアルゴリズムにとってどれくらい重要だったかを示す。重要度にも種類があり、LightGBM にはsplitとgainの2種類がある。

splitの場合、その特徴量がモデルで使用された回数。(頻度、とも言われる。デフォルトはこちら。)
gain の場合、その特徴量を使用したスプリットの合計ゲイン。(ゲインとは目的関数の改善幅。いろんなブログでこちらをおすすめされた。)

tipsで試してみた結果はこちら。

スクリーンショット 2021-12-01 12.59.30


今回は以上。はじめてLightGBM触った時より理解が進んだけど、頭がパンパンだー。

途中で知ったのだけど、元データを2つに分ける(学習用と検証用)のではなく、さらに予測用にも分けておいて未知データ予測精度を測っても良いみたい。データ数さえ十分ならそりゃそうだよね!次回やってみる!
あと、特徴量把握した後の次の一手が知りたい。




この記事が気に入ったらサポートをしてみませんか?