あれもPython,これもPython

Pythonメモ※本サイトはアフィリエイトを利用しています

Pythonでlightgbmを使う

lightgbmはboostingの中でも、比較的早く学習でき、精度が高いアルゴリズムです。
sklearnには存在しないため、パッケージを直接インストールします。
私の環境ではpipからインストール可能でした。

コード

sklearnライクな使い方もありますが、デフォルトの方で使ってみます。

パラメータで回帰、分類やハイパーパラメータを指定、Datasetで読み込めるデータの形にします。今回は基本的な動きの確認のため、評価データを作りませんでした。

回帰

import lightgbm as lgb

# 回帰の場合
reg_params = {
    "objective":"regression"
}

# データを用意する
reg_train = lgb.Dataset(
    boston_X,
    boston_y
)

reg_mdl = lgb.train(
    reg_params,
    reg_train,
    #valid_sets = valid_data,
    #valid_setsを用いる際、過程を表示しない
    #verbose_eval=False
)

分類

# 多値分類
mc_params = {
    "objective":"multiclass",
    "num_class": 3 #必須
} 
mc_train = lgb.Dataset(
    iris_X,
    iris_y,
)
mc_mdl =lgb.train(
    mc_params,
    mc_train,
    #valid_sets = valid_data
    
)

特徴重要度の可視化

作成したモデル特徴重要度はfeature_importanceで見ることができます。<br< また、可視化を直接してくれるメソッドも存在します。

mc_mdl.feature_importance()
lgb.plot_importance(mc_mdl)

f:id:esu-ko:20200919221813p:plain

PythonでYamlを扱いたい(pyyamlを使う)

機械学習でパラメータを変えて実験したいときなど、yamlで管理しておくと便利です。
読み込んだパラメータをアンパック(**)でモデルに渡すことができます。

コード

yamlファイルの読み込みは、safe_loadを持ちます。
jsonモジュールなどとは異なるので注意が必要です。

#pipはpyyaml
import yaml

with open('yaml.yml','r') as f:
    obj = yaml.safe_load(f)

#loadsは存在しない
yaml_txt = """
- a
- b
- c
"""

obj = yaml.safe_load(yaml_txt)

書き込む場合

書きこむ場合は、jsonなどと同様にdumpを使います。
あまり使うことはないかもしれませんが、チューニング結果などを書き込みたい場合などに覚えておくと便利です。

obj = {"a":[1,2,3]}

with open('res.yml','r')  as f:
    yaml.dup(obj,f)

その他の読み込み

objをファイル上で---によってわけている場合、safe_load_allで、複数のオブジェクトにすることができます。

objs_txt = """
- a
- b
- c
---
- d
- e
- f
"""

objs = [ obj for obj in yaml.safe_load_all(objs_txt)]

print(objs)
#[['a','b','c'],['d','e','f']]

pythonでProphetを使いたい(7:モデルの評価を行いたい

ここまでモデルの改善を進めてきたのですが、目で予測値と実測値を比較して行ってきました。 これはもう少し機械的にしたくなります。

そこでProphetに用意されている、クロスバリデーション/評価指標のメソッドが使用します。

コード

from fbprophet.diagnostics import cross_validation
from fbprophet.diagnostics import performance_metrics
#開始点、CV
df_cv = cross_validation(mdl, initial='240 days', period='30 days', horizon = '5 days')

モデルとデータを渡すと、cv用の分割と評価用の結果を返してくれます。

パラメータはこんな感じです。

  • initial:学習データの範囲
  • horizon:テストデータの1頻度の範囲
  • period:テストデータを作る頻度

このデータをperformance_metricsに渡すことで、cutoff×horizonごとの評価の平均を算出することができます。

df_p = performance_metrics(df_cv)

#可視化
df_p[['horizon','mse','rmse','mae','mape']].set_index('horizon').T.plot.barh()

f:id:esu-ko:20200913174036p:plain

複数のモデルを評価する

上記とforを用いることで各種モデルの評価を知ることができます。

#一つのデータで複数のモデルを試す場合
params = [
    {
        "yearly_seasonality":False,
        "weekly_seasonality":True,
        "daily_seasonality":False,
    },
    #...
]
mdls = [Prophet(**p) for p in params]

#add_xxx系
for i,m in enumerate(mdls):
    if i >= 3:
        m.add_seasonality(name = '_25',period=25,fourier_order=10)
    #...
        
#フィッティング
preds = []
for m in mdls:
    m.fit(mdl_df)
    future = m.make_future_dataframe(periods=0,freq='D')
    future['cap'] = 2
    pred  = m.predict(future)
    pred.append(pred)
    
# 評価
metrics = []
for m in mdls:
    df_cv = cross_validation(m, initial='120 days', period='30 days', horizon = '30 days')
    df_p = performance_metrics(df_cv)
    tmp = df_p[['mse','rmse','mae','mape']].mean()
    metrics.append(tmp)

#可視化
res = pd.concat(metrics,axis=1)
res.plot.bar()

f:id:esu-ko:20200913174130p:plain