post Image
データの因果関係を探る手法LiNGAMをpythonで書いてみた

統計的因果探索の1つであるLinear non-Gaussian Acyclic Model(LiNGAM)をpython3で書いてみました。githubに置いてます→ICA-LiNGAM code

ちょっと説明

どんなモデル?

LiNGAMでは、データの生成過程を因果と捉える手法で、仮定に沿っているデータであれば理論的には因果関係を一意に推定可能です!(線形関係)

要は、下のような状況で生成されているデータがあったとしたら、
このデータを与えるだけで、”xからyに強さ2の因果効果がある”と分かる手法です。

x = e1
y = 2x + e2

すごさ

何がすごいかというと、重回帰分析とかだとyをxで説明するとか、xをyで説明するとかの方向を自分で決めなければいけなかったのに、LiNGAMではデータから確実に決められるところが画期的です。
他にも仮定の自然さみたいなのが挙げられます。

その仮定は、実データを考えてみると結構自然なもので、
  1. データが連続変数
  2. ノイズ項eが、非ガウス分布(正規分布でない)、
  3. ノイズ項eが、互いに独立
であるということです。ちなみにノイズ項は外生変数とか言われます。

LiNGAMは、非ガウス性に注目してるおかげで、連続変数同士の因果関係を見つけることができる手法です。

実装

内部で独立成分分析(ICA)という信号処理を使っていて、sklearnにFastICAがあったので、割と簡単にできました。
ただ、非ガウス性の尺度として、ネゲントロピー(近似)を扱ってるものしか発見できなかったので、今回は尖度ベースのICAを自分で実装してみました。
コードは全てココにあります。

実行例

Step1

まず、lingam.pyを実行する。jupyterだと%run lingam.pyとかでできる。

Step2

サンプルデータ生成する。この例では、x -> y の向きに2の強さの因果がある。
一様分布で非ガウスなノイズを生成。

import numpy as np
import pandas as pd

size = 10000
np.random.seed(2017)
x = np.random.uniform(size=size)

np.random.seed(1028)
y = 2*x + np.random.uniform(size=size)

X = pd.DataFrame(np.asarray([x,y]).T,columns=["x","y"])

Step3

実行する。fitでできる。

尖度ベース
lingam = LiNGAM()
lingam.fit(X)
ネゲントロピーベース
lingam = LiNGAM()
lingam.fit(X,use_sklearn=True)

で、実行結果。この例ではどっちも同じだった。
ほぼ正しく因果が推定できてる!!

result
x ---|1.991|---> y

array([[ 0.        ,  0.        ],
       [ 1.99149033,  0.        ]])

おわり

3以上変数でもできます。ただ、あんまり多いとすごく時間かかるかも…

尖度使ったICAは、異常値に弱いので、実データならばuse_sklearn=Trueの方がいいと思います笑
質問、ミスなどありましたら、教えてください!

他の因果探索手法も実装してみたい!

LiNGAM code
LiNGAM 論文


『 機械学習 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。