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

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

ただいまの
回答率

89.11%

繰り返し処理のやり方(回帰で同じ特徴量の元で、複数の従属変数への回帰→誤差表示をしたい)

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 85

JMS

score 6

現在以下のようなコードがあります。
解決したい点は、以下のy0~y6といった6つの従属変数ベクトルに対する回帰分析結果(平均二乗誤差)を一度に繰り返し処理により計算するプログラムを作りたいというものです。あまり一つの回帰モデルで、複数の従属変数になり得る数値があるケースは少ないと思いますが、本件ではそのようなケースとなっています。

まず準備プロセスです。念のために掲載します。

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import PolynomialFeatures

data=pd.read_excel('元データ.xlsx')
data=data.drop([0,1]).reset_index(drop=True)
data['date']=pd.to_datetime(data['date'],format='%Y年%m月')
data['POSIX']=data['date'].astype('int64').values//10**9
data['year']=data['date'].dt.year
data['month']=data['date'].dt.month
#上記の数行は、データを取得してからデータを簡単に整形しているのみです。

x=data.iloc[:38,[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,32]] #特徴量は23個
y0=data.iloc[:38,[23]] #0-43
y1=data.iloc[:38,[24]]#0-42
y2=data.iloc[:38,[25]]#0-41
y3=data.iloc[:38,[26]]#0-40
y4=data.iloc[:38,[27]]#0-39
y5=data.iloc[:38,[28]]#0-38
y6=data.iloc[:38,[29]]#0-37


上記は準備プロセスです。ここから実際の計算が始まります。
問題は以下の実際の回帰の計算です。現状は以下の「y0」となっているものを、毎回「y1」に全て変えた上で誤差スコア計算し書き留める、
その後「y2」に全て変えた上で・・・との繰り返しです。一気にy0~y6までの7通りの従属変数による誤差スコアを一気に出す方法を考えているのですが、
どうも繰り返し構文を用いてもうまくいきません。詳しい方、助けていただけませんでしょうか?

x_pos=data['POSIX'].values
N=len(x)
N_train=round(len(x)*0.8)
N_test=N-N_train

x_pos_train,x_pos_test=x_pos[:N_train],x_pos[N_train:]
x_train,y0_train=x[:N_train],y0[:N_train]
x_test,y0_test=x[N_train:],y0[N_train:]

POLY=PolynomialFeatures(degree=2,include_bias=False)#13の特徴量を2次の多項式に変換
x_train_pol=POLY.fit_transform(x_train)
x_test_pol=POLY.transform(x_test)
sc=StandardScaler()#特徴料の標準化を行う
x_train_std=sc.fit_transform(x_train_pol)
x_test_std=sc.transform(x_test_pol)

model=LinearRegression()
model.fit(x_train_std,y0_train)

y_train_pred=model.predict(x_train_std)
y_test_pred=model.predict(x_test_std)
mean_squared_error(y0_train,y_train_pred),mean_squared_error(y0_test,y_test_pred)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

y0~y6を使うならリストか配列で、と思いましたが今のソースコードを極力活用して、実際の計算部分を

for y in [y0, y1, y2, y3, y4, y5, y6]:
    x_pos = data["POSIX"].values
    N = len(x)
    ...


としてループを作ってy0の部分をyに変換すれば良いです。

[追記]
一気に、と言うのはループではなく、と言う事でしたらyを2次元配列にして良いと思います。気をつけるのはmean_squared_errorでしょうか。ループと同じ出力を得るには個別に計算する必要があります。

y = data.iloc[:38, 23:30]

N = len(x)
N_train = round(len(x) * 0.8)
N_test = N - N_train

x_train, y_train = x[:N_train], y[:N_train]
x_test, y_test = x[N_train:], y[N_train:]

POLY = PolynomialFeatures(degree=2, include_bias=False)
x_train_pol = POLY.fit_transform(x_train)
x_test_pol = POLY.transform(x_test)
sc = StandardScaler()  # 特徴料の標準化を行う
x_train_std = sc.fit_transform(x_train_pol)
x_test_std = sc.transform(x_test_pol)

model = LinearRegression()
model.fit(x_train_std, y_train)
y_train_pred = model.predict(x_train_std)
y_test_pred = model.predict(x_test_std)

for i in range(7):
    print(mean_squared_error(y_train.iloc[:, i], y_train_pred[:, i]))
    print(mean_squared_error(y_test.iloc[:, i], y_test_pred[:, i]))

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/01 09:47 編集

    ありがとうございます。こちら上のものを試してみたのですが、どうも動かないようなんです。実行しても実行自体は完了するのですが何もアウトプットがでないんです。下は今からやってみます!

    <追伸>
    なぜか、最後を以下のように変えたらできました!ありがとうございます。
    print(mean_squared_error(y_train,y_train_pred))
    print(mean_squared_error(y_test,y_test_pred))

    なお、ここで、mean_squared_errorを一旦なんらかの変数に格納して、後で一気に出力し、そこで最大値と最小値も計算したいと思い、以下のようなコードを書きました。ただ、「invalid character in identifier」というエラーが出てしまいました。こちら、もしよろしければ連続質問で本当に申し訳ないのですが、アドバイスいただけますと幸いです。

    ※以下、前回投稿コードの「y_test_pred=model.predict(x_test_std)」以下の部分です。

    msetrain[y]=mean_squared_error(y_train,y_train_pred)
    msetest[y]=mean_squared_error(y_test,y_test_pred)

    else:
    for y in msetrain:
    print(msetrain[y],msetest[y])
    print(max(msetrain[y]),max(msetest[y]))

    キャンセル

  • この投稿は削除されました

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

  • ただいまの回答率 89.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Pythonに関する質問
  • 繰り返し処理のやり方(回帰で同じ特徴量の元で、複数の従属変数への回帰→誤差表示をしたい)