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

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

解決済

1回答

1556閲覧

leave one out cross variation(LOOCV)の過程でshapes (1,1) and (2,) not alignedというエラーが出ます

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/12/07 14:59

編集2020/12/08 04:39

前提・実現したいこと

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

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

今回、testデータを1つのみとし、trainデータを残りのすべてとする手法(leave-one-out)を施行したいと考えております。

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

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

まず、0行目のデータ(2013/11/18のデータ)をtestデータ、残りをtrainデータとしてコードを書きました。
(このコードがうまく動けば、i行目のiをfor構文で回して、すべての行に対してこれを行い、評価する予定です。)
気温を説明変数、お弁当の販売数を応答変数とするポアソン回帰モデルを作成しました。
すると、以下のようなエラーメッセージが出現します。

ValueError Traceback (most recent call last) <ipython-input-5-d4fb5ef762d3> in <module> 29 testX = sm.add_constant(testX) 30 ---> 31 pred = result.predict(testX) 32 test['pred'] = pred 33 test ~\anaconda3\lib\site-packages\statsmodels\base\model.py in predict(self, exog, transform, *args, **kwargs) 1098 1099 predict_results = self.model.predict(self.params, exog, *args, -> 1100 **kwargs) 1101 1102 if exog_index is not None and not hasattr(predict_results, ~\anaconda3\lib\site-packages\statsmodels\genmod\generalized_linear_model.py in predict(self, params, exog, exposure, offset, linear) 870 exog = self.exog 871 --> 872 linpred = np.dot(exog, params) + offset + exposure 873 if linear: 874 return linpred <__array_function__ internals> in dot(*args, **kwargs) ValueError: shapes (1,1) and (2,) not aligned: 1 (dim 1) != 2 (dim 0)

該当のソースコード

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 7i = 0 8 9# 2. 使用するデータの読み込み 10df = pd.read_csv("otehon data/trainmoji.csv", encoding="shift-jis") 11 12test = df.iloc[[i]] #i行目をtestデータとする 13train = df.drop(test.index) #残りをtrainデータとする 14 15# 3. smf.glmで使うformula(線形予測子)とfamily(確率分布)を設定する 16trainY = train['y'] # 目的変数:y 17 18trainX = pd.get_dummies(train[['temperature']]) # 説明変数 19family = sm.families.Poisson() 20trainX = sm.add_constant(trainX) 21 22# 4. 先ほどの設定値を使って一般化線形モデルを作成 23model = sm.GLM(trainY, trainX, family=family) 24 25# 5. 作成したモデルを学習させる 26result = model.fit() 27 28# 6. testデータで検証 29testX = pd.get_dummies(test[['temperature']]) # 説明変数 30testX = sm.add_constant(testX) 31 32pred = result.predict(testX) 33test['pred'] = pred 34test

試したこと

いろいろ調べると、配列の要素数があっていないときにこのようなメッセージが出るようですが、
train, testに格納された列数は一致しているはずです。

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

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

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

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

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

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

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

jbpb0

2020/12/08 00:21 編集

質問への直接の回答ではありませんが、質問者さんはCross ValidationやLeave One Outを誤解しているように思えるので、書いておきます https://newtechnologylifestyle.net/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%80%81%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%A7%E3%81%AE%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A8/ を見てください データを予め学習用とテスト用に分けて置くやり方は、Cross ValidationではなくHold-outです
jbpb0

2020/12/08 00:26

https://newtechnologylifestyle.net/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%80%81%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%A7%E3%81%AE%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A8/ の「Leave One Out」の解説を読むとわかるように、Leave One Outとは ・1つ目のデータのみ除外して学習→1つ目のデータでテスト ・2つ目のデータのみ除外して学習→2つ目のデータでテスト :(中略) ・最後のデータのみ除外して学習→最後のデータでテスト をセットでやる方法です 「1個だけ除外」するときの「1個」は特定のデータだけではなく、全部のデータです
masabassii94

2020/12/08 04:44

説明不足で申し訳ございません。 最終的には全部のデータに対し、 i個目のデータのみ除外して学習→i個目のデータでテスト というセットを全データに対し行う予定です。 まず、試しにi=0として動くかどうかをやってみたところです。 これがうまくいけば、iをforループで回してすべてのデータに対し行う予定です。 ValueError: shapes (1,1) and (2,) not aligned: 1 (dim 1) != 2 (dim 0) のエラーの原因をご存じであれば教えて頂ければ幸甚です。 よろしくお願い申し上げます。
jbpb0

2020/12/08 05:48

train, testに分けてからpd.get_dummies()で処理するのは、エラーの原因である上に、ムダの原因でもあります お書きのコードのまま(エラーが出なかったとして) > これがうまくいけば、iをforループで回してすべてのデータに対し行う としたら、iを変える度に毎回pd.get_dummies(), sm.add_constant()を実行することになりますが、それはムダです train, testに分けてない全データに対して先に1回だけ処理しておけば、Leave One Outの際には不要です
masabassii94

2020/12/08 13:26

ありがとうございます。
guest

回答1

0

ベストアンサー

train, testに格納された列数は一致しているはず

train, testの列数は一致してますけど、trainX, testXの列数は一致してません
確認してください

python

1trainX.shape 2testX.shape

その原因は、train, testに分けてからpd.get_dummies()で処理してるからです
testは1行しか無いのだから、pd.get_dummies()の後のダミー変数は1つだけです
一方、trainは'temperature'の種類だけダミー変数ができます

'temperature'が数値なら、pd.get_dummies()で処理しても影響無いので、列数が合わない原因ではないですね
失礼しました
列数が合わない原因は、質問者さんがコメントにお書きになった通り、sm.add_constant()ですね

投稿2020/12/08 05:35

編集2020/12/08 14:23
jbpb0

総合スコア7651

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

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

masabassii94

2020/12/08 13:31

ありがとうございます。 ご指摘の通り、trainX, testXの内容を確認したところ、trainXにはconstの列(sm.add_constantで追加した切片)が追加されているのに対し、testXにはそれがないため、列数が異なっておりました。 testX = sm.add_constant(testX)  ⇒  testX['const'] = 1.0 とすることで、testXにも切片が追加され、列数が一致するようになりました。 誠にありがとうございました。 (上記の問題はクリアしましたが、次にSettingWithCopyWarningというエラーが出現しました。.copy()をつけても解決いたしません。まことに恐縮ですが、こちらについてもご存じであればご教授いただければ幸いです URL:https://teratail.com/questions/309009?modal=q-comp)
jbpb0

2020/12/08 14:03

> trainXにはconstの列(sm.add_constantで追加した切片)が追加されているのに対し、testXにはそれがないため、列数が異なっておりました。 # 6. testデータで検証 の2行下に testX = sm.add_constant(testX) があるから、それは問題無かったはず
jbpb0

2020/12/08 14:16 編集

と思ったら、 testX = sm.add_constant(testX) は機能しないですね 失礼しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問