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

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

新規登録して質問してみよう
ただいま回答率
85.35%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Python

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

Q&A

解決済

1回答

1005閲覧

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

JMS

総合スコア7

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Python

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

0グッド

0クリップ

投稿2020/06/30 16:09

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

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

Python

1%matplotlib inline 2import matplotlib.pyplot as plt 3import numpy as np 4import pandas as pd 5from sklearn.linear_model import LinearRegression 6from sklearn.preprocessing import StandardScaler 7from sklearn.model_selection import train_test_split 8from sklearn.metrics import mean_squared_error 9from sklearn.preprocessing import PolynomialFeatures 10 11data=pd.read_excel('元データ.xlsx') 12data=data.drop([0,1]).reset_index(drop=True) 13data['date']=pd.to_datetime(data['date'],format='%Y年%m月') 14data['POSIX']=data['date'].astype('int64').values//10**9 15data['year']=data['date'].dt.year 16data['month']=data['date'].dt.month 17#上記の数行は、データを取得してからデータを簡単に整形しているのみです。 18 19x=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個 20y0=data.iloc[:38,[23]] #0-43 21y1=data.iloc[:38,[24]]#0-42 22y2=data.iloc[:38,[25]]#0-41 23y3=data.iloc[:38,[26]]#0-40 24y4=data.iloc[:38,[27]]#0-39 25y5=data.iloc[:38,[28]]#0-38 26y6=data.iloc[:38,[29]]#0-37

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

Python

1x_pos=data['POSIX'].values 2N=len(x) 3N_train=round(len(x)*0.8) 4N_test=N-N_train 5 6x_pos_train,x_pos_test=x_pos[:N_train],x_pos[N_train:] 7x_train,y0_train=x[:N_train],y0[:N_train] 8x_test,y0_test=x[N_train:],y0[N_train:] 9 10POLY=PolynomialFeatures(degree=2,include_bias=False)#13の特徴量を2次の多項式に変換 11x_train_pol=POLY.fit_transform(x_train) 12x_test_pol=POLY.transform(x_test) 13sc=StandardScaler()#特徴料の標準化を行う 14x_train_std=sc.fit_transform(x_train_pol) 15x_test_std=sc.transform(x_test_pol) 16 17model=LinearRegression() 18model.fit(x_train_std,y0_train) 19 20y_train_pred=model.predict(x_train_std) 21y_test_pred=model.predict(x_test_std) 22mean_squared_error(y0_train,y_train_pred),mean_squared_error(y0_test,y_test_pred) 23

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

python

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

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

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

python

1y = data.iloc[:38, 23:30] 2 3N = len(x) 4N_train = round(len(x) * 0.8) 5N_test = N - N_train 6 7x_train, y_train = x[:N_train], y[:N_train] 8x_test, y_test = x[N_train:], y[N_train:] 9 10POLY = PolynomialFeatures(degree=2, include_bias=False) 11x_train_pol = POLY.fit_transform(x_train) 12x_test_pol = POLY.transform(x_test) 13sc = StandardScaler() # 特徴料の標準化を行う 14x_train_std = sc.fit_transform(x_train_pol) 15x_test_std = sc.transform(x_test_pol) 16 17model = LinearRegression() 18model.fit(x_train_std, y_train) 19y_train_pred = model.predict(x_train_std) 20y_test_pred = model.predict(x_test_std) 21 22for i in range(7): 23 print(mean_squared_error(y_train.iloc[:, i], y_train_pred[:, i])) 24 print(mean_squared_error(y_test.iloc[:, i], y_test_pred[:, i]))

投稿2020/06/30 16:53

編集2020/06/30 17:34
yymmt

総合スコア1615

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

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

JMS

2020/07/01 01:06 編集

ありがとうございます。こちら上のものを試してみたのですが、どうも動かないようなんです。実行しても実行自体は完了するのですが何もアウトプットがでないんです。下は今からやってみます! <追伸> なぜか、最後を以下のように変えたらできました!ありがとうございます。 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]))
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問