質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1162閲覧

ベイジアンネットワーク 条件付き確率が正しく推定されない

hiro_11111111

総合スコア6

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/10/29 06:23

前提

マルチポストです、急用のためご容赦ください。。。
https://qiita.com/ohnomycolapart3/questions/883e11ff0321c11a026f

pythonのライブラリ「pgmpy」を使いベイジアンネットワークを構築しているが、条件付き確率(表)の値が正しく推定されない。

発生している問題・エラーメッセージ

プログラム自体は回る状況だが、推定された条件付き確率の値がすべて同じ値で算出される。
親ノード、子ノードの各変数名は正しく反映できているので、なぜ条件付き確率だけ算出できていないのかが不明。
イメージ説明

該当のソースコード

python

1from pgmpy.models import BayesianModel 2df = pd.read_csv(filename+'_2.csv', encoding="UTF-8") 3model = BayesianModel([('直近OD量レベル','直後OD量レベル'),('時間帯ダミー','直後OD量レベル'),('曜日ダミー','直後OD量レベル'),('①自OD経路時間(ダミー)','直後OD量レベル'), \ 4('②転換OD経路時間(ダミー)','直後OD量レベル'),('③転換OD経路時間(ダミー)','直後OD量レベル'),('①自OD工事ダミー','直後OD量レベル'),('②転換OD工事ダミー','直後OD量レベル'),('③転換OD工事ダミー','直後OD量レベル')]) 5 6model.fit(df) #条件は省略。標準ではオーバーフィットに特に注意 7cpds = model.get_cpds() 8 9# 以下、CSV、TXTに条件付き確率表を吐き出す 10a=str(model.get_cpds('直後OD量レベル')) 11a=a.replace('-', '') 12a=a.replace('+', '') 13a=a.split('|') 14del a[0] 15# a=a.remove('\n') 16 17outlist=[] 18templist=[] 19for cpd in a: 20 if cpd=='\n\n': 21 outlist.append(templist) 22 templist=[] 23 else: 24 templist.append(cpd) 25with open(filename+"cpd.csv", "w", newline="") as f: 26 writer = csv.writer(f) 27 for cpd in outlist: 28 writer.writerow(cpd) 29 30with open(filename+"cpd.txt", "w", newline="") as f: 31 writer = csv.writer(f) 32 for cpd in outlist: 33 writer.writerow(cpd)

試したこと

データフレームのCSVファイルを新しく作り直したら、正しく算出されるときもあったので、おそらくCSVの書式などの問題かとも思いますが、イマイチこれといった原因が掴めずです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/10/30 03:19 編集

お急ぎの様ですので…。 解決策ではありませんが、プログラムの根本的なミスがないことを保証するために、現在のプログラムを 1. 変数X1,X2のように極少ない項目数の変数Xに絞る(検証初期ではダミーの分かりやすい値が望ましい) 2. CSVに保存する前にprint(演算結果)のように結果で様子を見る のように(バックアップを取ったのちに)改修して、「今あるプログラムの全体的な構造は正しい」という言質をとってはいかがでしょうか? ■プログラムの構造がおかしい場合 これがうまくいかなければ、プログラムの構造に問題があります。 ■プログラムの構造は正しいが、データを増やすと推論値が怪しくなる場合 一般論ですが、ハイパーパラメータがあるようでしたら、そこをこねくり回すと大体何とかなります。 ■プログラムの構造は正しいが、項目数を増やしていくとコケる場合 問題がないようであれば、上記1.に書いた変数X1、X2をダミーの値から実際の値に挿げ替えながら1列ずつ増やして、現実的な項目数に増やしながら様子を見ればどの列が原因でコケているかわかるはずです。 ■保存する段階でおかしくなる場合 もしここまでで問題がなく、保存する際に問題があるようであれば、保存する部分のプログラムを改修すればよい話と思います。特にフォーマットにこだわりがなければ、演算結果をデータフレームに突っ込んっで、Pandas上でCSVとして保存するのがスマートな保存方法とおも思います。 これらをやってみてまだ分からないことがあればコメントください。
hiro_11111111

2022/10/30 06:00

色々とアドバイスありがとうございました!! イマイチ理由は謎ですが、自己解決できました。 ご丁寧にありがとうございました。。
guest

回答1

0

自己解決

子ノード(被説明)変数の右側の不要なカラムを削除したら、うまく推定できました。

イメージ説明
親ノード、子ノードの変数はカラム名で指定しているので、子ノードの右列に何の情報が入っていようと関係ないと思うのですが、ひとまずこれで動きました。

投稿2022/10/30 05:58

hiro_11111111

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問