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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

1836閲覧

統計モデル(一般化線形モデル)に未知のデータを当てはめて予測値を出力すると有り得ない値になってしまいます。 (交差検証:cross variation)

masabassii94

総合スコア13

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2020/07/10 12:49

前提・実現したいこと

Python、統計学初心者の者です。
仕事の関係で、下記のことをPythonで実現したいと考えております。

① あるデータをtrainデータとtestデータに分割する
② trainデータを用いて、GLM(一般化線形モデル)によるポアソン回帰モデルを作成する。
③ 上記のモデルにtestデータを代入し、testデータの実測値とモデルによる予測値を比較する
(交差検証:cross variation)

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

まず、お弁当の需要予測(https://signate.jp/competitions/24)のデータを用いて、
上記の手法をトライしました。
Python初心者で思い通りのコードを書くことはできないので、
インターネットからコードのコピペを組み合わせて試行錯誤しました。
(https://tanuhack.com/statsmodels-multiple-lra/ を参考にしました。)

全データの半分をtrainデータ、半分をtestデータとしました。
気温を説明変数、お弁当の販売数を応答変数とするポアソン回帰モデルを作成しました。

すると③において、モデルによる予測値(Pred)が、eの50乗などと有り得ない数値となってしまいます。
コードに誤りがあれば教えて頂ければ幸甚です。

(出力結果のスクリーンショットを添付しております。)

該当のソースコード

Python

1# 1. 必要なライブラリの読み込み 2import pandas as pd 3import statsmodels.formula.api as smf 4import statsmodels.api as sm 5from matplotlib import pyplot as plt 6 7 8# 2. 使用するデータの読み込み 9df = pd.read_csv("Desktop/Pyhton memo/trainmoji.csv", encoding="shift-jis") 10df.head() 11 12train = df[0:len(df)//2] 13 14test = df.drop(train.index) 15 16# 3. smf.glmで使うformula(線形予測子)とfamily(確率分布)を設定する 17trainY = train['y'] # 目的変数:y 18 19trainX = pd.get_dummies(train[[ 20 'temperature']]) # 説明変数 21family = sm.families.Poisson() 22trainX = sm.add_constant(trainX) 23 24# 4. 先ほどの設定値を使って一般化線形モデルを作成 25model = sm.GLM(trainY, trainX, family=family) 26 27# 5. 作成したモデルを学習させる 28result = model.fit() 29 30# 6. 結果の表示 31result.summary() 32 33# 7. テストデータにモデルを当てはめて予測値を出力 34testX = pd.get_dummies(test[['temperature']]) # 説明変数 35testX['const'] = 1.0 36 37pred = result.predict(testX) 38test['pred'] = pred 39test

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

実際のjupyterの画面のスクリーンショットを添付しております。
イメージ説明
イメージ説明

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

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

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

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

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

guest

回答2

0

データの内容がわからないので、多少憶測になりますがコメントします。

1.pd.get_dummies()について
説明変数に気温を使いたいということですが、気温は通常連続値です。get_dummies()はカテゴリーデータをダミー変数に変換するためのものなので、使用する関数が違うのではないでしょうか。仮にそのまま連続値のまま説明変数として使いたいのであれば、このコードは不要です。
なお、このままget_dummiesを使う場合、記載を以下のしないと変換しません。

pd.get_dummies(train['temperature'])

2.ポアソン回帰を使う場合の約束事
ポアソン分布の期待値はマイナスを取ることはありません。よって期待値を計算するモデルの核になる部分(a×気温+b)は必ずマイナスにならないようにする必要があります。これをリンク関数と呼びますが、今のコードにはリンク関数の考慮がありません。このあたりをいちいち実装するのは面倒なので、たいていはkeisuke0919さんが紹介するサイトを参考に実装を改めたほうがいいでしょう。

3.結果がおかしな理由
一番致命的な部分はポアソン回帰の約束事が実装されていないことのように思われます。ただ、その前に気温という連続値をどのように扱いたいのかをご自身で意識しないと思ったようになりません。
加えていうと、お弁当販売数が気温によって決定される、という仮説が可視化を通じて確認できていないとやはり思った結果にはなりません。

投稿2020/07/11 03:22

R.Shigemori

総合スコア3376

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

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

masabassii94

2020/07/12 01:30

ありがとうございます。 データの内容は下記のサイトのものを使っております https://signate.jp/competitions/24 1. 以下のサイトを参照すると、pd.get_dummies()は、質的変数をダミー変数に変換するが、量的変数はそのまま量的変数として扱う関数のようですので、これにより結果が変わることはないと考えております。 Python初心者なので的外れなことでしたら申し訳ございません。 https://tanuhack.com/statsmodels-multiple-lra/#StatsModels-2 2 下記のサイトによると、ポアソン分布の場合リンク関数はデフォルトで対数関数に設定されているとのことなので、設定いたしませんでした。 https://tech-diary.net/generalized-linear-model-with-python/ 結果の予測値の桁数がおかしくなる原因としてほかにございましたらご教授いただければ幸いです。 よろしくお願い申し上げます。
guest

0

ベストアンサー

解説を書こうと思ったのですが、ここに、ほぼ答えに近い内容が書かれていましたので、参考になるかと思います。

投稿2020/07/10 14:22

keisuke0919

総合スコア34

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

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

masabassii94

2020/07/10 22:43

ご回答ありがとうございます。 ご添付頂いたサイトには、GLMを用いてポアソン回帰モデルを作成するところまで記載されております。 ポアソン回帰モデルの作成は既に成功しているのですが、未知のデータをそのモデルに当てはめて予測値を出すところで行き詰っております。 質問に添付したスクリーンショットのように、どうしてもPredの値が桁違いに大きくなってしまうのですが、コードのどこを修正すれば良いかご教授頂けるとありがたいです。 よろしくお願い申し上げます。
keisuke0919

2020/07/11 05:24 編集

masabassii94さんのコードを拝見させていただきました。 結論としては、 In[2]の testX['const'] = 1.0 を testX = sm.add_constant(testX) に書き換えましょう。 そうすると適切な予測になりました。
keisuke0919

2020/07/11 05:20

testX['const'] = 1.0とすると、constカラムが右側に追加されてしまい、 モデルが想定するデータと異なってしまいます。 testX = sm.add_constant(testX)とすることで、左側にconstカラムを持ってくることができます。学習に用いたデータ(trainX)の形に合わせたと言うことです。
masabassii94

2020/07/12 01:35

大変ありがとうございます。 keisuke0919様の仰る通りに書き換えたところ、適切な予測となりました。 これで仕事に役立てることができそうです。 親身に御返答頂きありがとうございました。
keisuke0919

2020/07/12 05:23

お役に立ててよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問