lightgbmをoptunaで楽にチューニングしたい

optunaは下準備にコードを書く必要がありますが、lightgbmが対象の場合は、より簡単なコードで処理することができます。 コード lightbgmでtrainしていたところを、optuna.integration.lightgbmに変えるだけです。 ▼lightgbmに関してはこちら esu-ko.hatenab…

ベイズ最適でハイパラチューニングをしたい(optunaを使う)

ハイパーパラメータのチューニングをする場合、グリッドサーチでは非常に時間がかかることがあります。 対して、ベイズを用いたハイパーパラメータチューニングは非常に早く実行できます。 今回はそのためにoptunaを使用します。 基本的な使い方 最大化、最…

予測の解釈がしたい(SHAPを使う)

Limeでレコード単位での予測の把握をすることはできますが、それを全体化したものを見てみたい場合があります。 そうした時はSHAPを使うと便利です。 コード セットアップ import shap shap.initjs() #ランダムフォレストなどのモデルを渡す ex = shap.TreeE…

レコード単位の予測の解釈がしたい(Limeを使う)

木構造モデルを作った後、変数のモデル内での影響度は簡単に出すことができます。 ただし、lm,glmと異なり、実際に各レコードの予測値に各変数が影響しているのかを確認するのはデフォルト機能では難しいです。 そこでLimeを使うことで、実際にレコード単位…

PythonでCatboostを使いたい

Catboostはboosting系の中で、やや重いですが。カテゴリをそのまま扱えるといった特徴があります。 xgboost,lightgbm同様に専用のパッケージをインストールします。 コード catboostは、Poolという形でデータをできるかぎり扱うようにすると楽です。 今回も…

Pythonでxgboostを使う

xgboostはlightgbmに比べると、やや重い印象があります。 ただし、ケースによってはlightgbm以上の精度が出ることもあります。 lightgbm同様、sklearnには導入されていません。 コード xgboostもsklearnライクな使い方もありますが、デフォルトの方で使って…

Pythonでlightgbmを使う

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

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

機械学習でパラメータを変えて実験したいときなど、yamlで管理しておくと便利です。 読み込んだパラメータをアンパック(**)でモデルに渡すことができます。 コード yamlファイルの読み込みは、safe_loadを持ちます。 jsonモジュールなどとは異なるので注意…

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

ここまでモデルの改善を進めてきたのですが、目で予測値と実測値を比較して行ってきました。 これはもう少し機械的にしたくなります。 そこでProphetに用意されている、クロスバリデーション/評価指標のメソッドが使用します。 コード from fbprophet.diagno…

pythonでProphetを使いたい(6:ノイズと別の時系列データ)

前回は、トレンド + 周期性 + その他のその他部分から祝日効果を取り出しました。 今回は、ここからさらに他の時系列データから推定し、残りをノイズとすることにします。 コード 他の時系列データはadd_regressorでモデルに追加できます。これもmodeを足す…

pythonでProphetを使いたい(5:祝日効果を追加したい)

周期性の設定まで完了したため、その他(ノイズなど)の分析を行っていきます。 まず、あまりフィットしていない日付を見てみます。 future = mdl.make_future_dataframe(periods=0,freq='D') future['cap'] = 6 pred = mdl.predict(future) tmp = pred[['ds'…

PythonでProphetをつかいたい(4:周期性に独自のものを追加)

時系列=トレンド + 周期性 + その他のうちの周期性に独自の周期性を追加していきます。 ▼こちらで作ったデータ、モデルをさらにチューニングしていきます。 esu-ko.hatenablog.com 前回は、曜日の影響を確認しました。 現状のモデルでは、長いトレンドと、短…

PythonでProphetを使いたい(3:デフォルトの周期性)

時系列=トレンド + 周期性 + その他のうちの周期性、さらにその中のデフォルトの周期性の確認とチューニングをします。 ▼こちらで作ったデータ、モデルをさらにチューニングしていきます。 esu-ko.hatenablog.com デフォルトの周期性の確認 デフォルトでは年…

PythonでProphetを使いたい(2:トレンドと転換)

時系列はトレンド + 周期性 + その他に分けて分析します。 今回はProphetのモデルのトレンドに仮定を追加したり、変化点を取り出すことで上記の式のトレンド部分の予測の調整/分析します。 ▼こちらの記事で、Prophetのデフォルト予測まで実施しました。 esu-…

ProphetをPythonで使いたい(1:基本編)

Prophetは時系列モデルを簡単に扱える手法です。 Facebookから発表され、Pythonからも使用することができます。 モデリングでいじれる部分がかなり多いので、何本かの記事に分けて試していきます。 使い方 sklearn-likeな呼び出しになっています。 predict前…

Pythonで日本の祝日と営業日カラムをつくりたい(ついでに中国も)

時系列データを扱っていると曜日はPandasが自前でなんとかしてくれるのですが、祝日などは追加したいことがあります。 そんな時はクローリングやエクセルで作ってもいいのですが、ひとまず以下のパッケージから取得できるようです - 日本祝日:jpholiday - 日…

Pythonでaprioriの結果を可視化したい

aprioriでルールを取得しても数が多すぎると全体が見通せないことがあります。 そこで、netoworkxを使ってルールを可視化することにしました。 描画してみる ルールをつくるところまでは、下記の記事のままです。 esu-ko.hatenablog.com import networkx as …

matplotlibで順位推移を表すグラフを書きたい

タイムラインチャートやランクチャート、スロープチャートなど、順位の推移を表したい時使うグラフです。 散布図と線の組み合わせでかけそうです。 書いてみる データを用意します。 例えば、行がチーム、1列目が一つ前の順位、2列目が今季の順位とします。 …

matplotlibでファンネルチャートを表示したい

プロダクトのデータだと利用の落ち状態をみるのにファンネルごとの観測数や比率を一枚のグラフで表したいことがあります。 棒グラフや折れ線でも一応みえるのですが、matplotlibでファンネルチャートがつくれないか試してみます。 試してみる データの用意 …

PythonでGMMを使う

クラスタリングは、概念としてはわかりやすいのですが、実務の説明責任があった場合、コミュニケーションがめんどくさいことがあります。 その辺りを中心からの分布という形で表現できるGMMは便利です。階層クラスタよりも表現がわかりやすいと個人的には思…

PythonでMDSをしたい

次元縮約する際に、PCAが有名ですが、パラメトリックという前提が辛かったり、各データが類似度/距離/共起などしか取得できないことがあります。 その際でも使えるのがMDSです。 使い方 sklearnの基本的な形のままです。 比率尺度でないときはmetric=Falseに…

PythonでWord2Vecをやりたい

単語や類するデータで、順番性を考慮して扱いたいことがあります。そんなときにWord2Vecを使うと非常に便利です。 データの読み込みとモデル化 1文を単語のリストとし、さらにその分を格納したリストをcorpusとして渡すだけです。 from gensim.models import…

Pandasで文字列を別カラムに分割したり、逆に結合したい

姓名のデータや電話番号など、特定のパターンでカラムを分割したいことがあります。 str.partition str.partitionはデフォルトだとスペースで3つのカラム(一番左、スペース、残り)のデータフレームに分けます。 また、引数で文字列を渡せば、その文字を二番…

Pandasでdate_truncがしたい2(to_period)

▼の記事で、resampleを使ってdate_truncの再現をしました。 esu-ko.hatenablog.com ただし、resampleは制約も多く、年と月を合わせた切り捨てができない状態でした。時間に対しては切り捨て処理ができるround,ceil,floorが存在するのですが、これは日付以上…

Pythonでdbscanでクラスタリングをする

DBSCANは事前にクラスタ数を分けない、距離を用いた分類が可能なアルゴリズムです。sklearnに入っているので使ってみます。 コード from sklearn.datasets import load_wine wine = load_wine() from sklearn.cluster import DBSCAN dbscan= DBSCAN(eps=0.02…

Pythonでtsneで次元圧縮したい(bhtsneを使う)

次元圧縮し、可視化することでクラスタリングがうまくいっているかを目で確認したいことがあります。今回は非線形な関係もとらえ、次元圧縮できる特徴があります。 コード sklearnにもt-sneは実装されているが、あまりお勧めしないという情報が多かったので…

Pandasで値の置き換えをしたい

Pandasでデータを加工する際、特定の条件で値を置き換えたい場合があります。その場合、使えるメソッドが多いので混乱するので整理しました。 範囲を指定して置き換える whereとmaskはある境界条件を与えた場合、それを満たす、または満たさないと特定の値に…

PythonでNMFをしたい

スコアがついたアイテム✖️ユーザーのデータをもとにレコメンドをしたい場合、特異値分解を用いることがあります。 特に非負かつ、スパースなデータの場合、NMFはその情報を強く残すため有用と言われています。 コード import numpy as np from sklearn.decom…

Pandasのindexと仲良くなりたい

Pandasを触ってる時に、おいおいちょっと待てよという挙動をすることが多いのがindexまわり。 備忘としてまとめました。 set_index,reset_index 既にあるカラムをindex化したり、現在のindexをカラムにうつします。 非破壊なので新しいものを残したい時は新…

Pythonで共分散構造分析がしたい(semopy)

変数間の複数の関係性を推定するためにSEMを使いたいことがあります。 データの読み込み RでSEMをするlavaanのデータを読み込みます。 import pandas as pd import pyper r = pyper.R(use_pandas=True) r('library(lavaan) ') df = r.get('PoliticalDemocrac…