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

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

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

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

Q&A

解決済

3回答

373閲覧

機械学習、python グリッドサーチ(leave-one-out)による計算が終わりません!

moon_light

総合スコア23

Python

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

0グッド

0クリップ

投稿2018/12/17 07:41

前提・実現したいこと

gridseachCVを使わず、グリッドサーチによるパラメータのチューニングを行いたいのですが計算が終わりません。何故こんなに時間がかかるのでしょうか?

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

エラーは出ませんが、計算が終わりません(二時間程度)

該当のソースコード

import numpy as np import pandas as pd import matplotlib.pyplot as plt import time import winsound as ws from sklearn.preprocessing import StandardScaler,MinMaxScaler from sklearn.decomposition import KernelPCA as KPCA from sklearn.linear_model import LogisticRegression from sklearn.model_selection import LeaveOneOut from sklearn.pipeline import make_pipeline from sklearn.model_selection import GridSearchCV start=time.time() #データ読み込み file_name='data_class3.xlsx' sheet_name='Sheet1' df = pd.read_excel(file_name,sheet_name=sheet_name) df=df.drop('results',axis=1) df_X=df.copy() df_Y=df.copy() features_df=df_X.drop('Target',axis=1) features_test=np.array(features_df) nan_count=0 while True: for i in range(len(features_df.columns)): col=features_df.iloc[0:44,i] q1=col.describe()['25%'] q3=col.describe()['75%'] iqr=q3-q1 outlier_min=q1-(iqr)*1.5 outlier_max=q3+(iqr)*1.5 col[col<outlier_min]=None col[col>outlier_max]=None for i in range(len(features_df.columns)): col=features_df.iloc[44:55,i] q1=col.describe()['25%'] q3=col.describe()['75%'] iqr=q3-q1 outlier_min=q1-(iqr)*1.5 outlier_max=q3+(iqr)*1.5 col[col<outlier_min]=None col[col>outlier_max]=None for i in range(len(features_df.columns)): col=features_df.iloc[55:,i] q1=col.describe()['25%'] q3=col.describe()['75%'] iqr=q3-q1 outlier_min=q1-(iqr)*1.5 outlier_max=q3+(iqr)*1.5 col[col<outlier_min]=None col[col>outlier_max]=None pre_nan_count=sum(features_df.isnull().sum())-nan_count nan_count=pre_nan_count+nan_count if pre_nan_count==0: break mod_hr_rest_avg=features_df["HR-rest"][0:44].mean() mod_hr_task_avg=features_df["HR-task"][0:44].mean() mod_hr_after_avg=features_df["HR-after"][0:44].mean() mod_hf_rest_avg=features_df["HF-rest"][0:44].mean() mod_hf_task_avg=features_df["HF-task"][0:44].mean() mod_hf_after_avg=features_df["HF-after"][0:44].mean() mod_lf_rest_avg=features_df["LH-rest"][0:44].mean() mod_lf_task_avg=features_df["LH-task"][0:44].mean() mod_lf_after_avg=features_df["LH-after"][0:44].mean() features_df["HR-rest"][0:44]=features_df["HR-rest"][0:44].fillna(mod_hr_rest_avg) features_df["HR-task"][0:44]=features_df["HR-task"][0:44].fillna(mod_hr_task_avg) features_df["HR-after"][0:44]=features_df["HR-after"][0:44].fillna(mod_hr_after_avg) features_df["HF-rest"][0:44]=features_df["HF-rest"][0:44].fillna(mod_hf_rest_avg) features_df["HF-task"][0:44]=features_df["HF-task"][0:44].fillna(mod_hf_task_avg) features_df["HF-after"][0:44]=features_df["HF-after"][0:44].fillna(mod_hf_after_avg) features_df["LH-rest"][0:44]=features_df["LH-rest"][0:44].fillna(mod_lf_rest_avg) features_df["LH-task"][0:44]=features_df["LH-task"][0:44].fillna(mod_lf_task_avg) features_df["LH-after"][0:44]=features_df["LH-after"][0:44].fillna(mod_lf_after_avg) gad_hr_rest_avg=features_df["HR-rest"][44:55].mean() gad_hr_task_avg=features_df["HR-task"][44:55].mean() gad_hr_after_avg=features_df["HR-after"][44:55].mean() gad_hf_rest_avg=features_df["HF-rest"][44:55].mean() gad_hf_task_avg=features_df["HF-task"][44:55].mean() gad_hf_after_avg=features_df["HF-after"][44:55].mean() gad_lf_rest_avg=features_df["LH-rest"][44:55].mean() gad_lf_task_avg=features_df["LH-task"][44:55].mean() gad_lf_after_avg=features_df["LH-after"][44:55].mean() features_df["HR-rest"][44:55]=features_df["HR-rest"][44:55].fillna(gad_hr_rest_avg) features_df["HR-task"][44:55]=features_df["HR-task"][44:55].fillna(gad_hr_task_avg) features_df["HR-after"][44:55]=features_df["HR-after"][44:55].fillna(gad_hr_after_avg) features_df["HF-rest"][44:55]=features_df["HF-rest"][44:55].fillna(gad_hf_rest_avg) features_df["HF-task"][44:55]=features_df["HF-task"][44:55].fillna(gad_hf_task_avg) features_df["HF-after"][44:55]=features_df["HF-after"][44:55].fillna(gad_hf_after_avg) features_df["LH-rest"][44:55]=features_df["LH-rest"][44:55].fillna(gad_lf_rest_avg) features_df["LH-task"][44:55]=features_df["LH-task"][44:55].fillna(gad_lf_task_avg) features_df["LH-after"][44:55]=features_df["LH-after"][44:55].fillna(gad_lf_after_avg) con_hr_rest_avg=features_df["HR-rest"][55:].mean() con_hr_task_avg=features_df["HR-task"][55:].mean() con_hr_after_avg=features_df["HR-after"][55:].mean() con_hf_rest_avg=features_df["HF-rest"][55:].mean() con_hf_task_avg=features_df["HF-task"][55:].mean() con_hf_after_avg=features_df["HF-after"][55:].mean() con_lf_rest_avg=features_df["LH-rest"][55:].mean() con_lf_task_avg=features_df["LH-task"][55:].mean() con_lf_after_avg=features_df["LH-after"][55:].mean() features_df["HR-rest"][55:]=features_df["HR-rest"][55:].fillna(con_hr_rest_avg) features_df["HR-task"][55:]=features_df["HR-task"][55:].fillna(con_hr_task_avg) features_df["HR-after"][55:]=features_df["HR-after"][55:].fillna(con_hr_after_avg) features_df["HF-rest"][55:]=features_df["HF-rest"][55:].fillna(con_hf_rest_avg) features_df["HF-task"][55:]=features_df["HF-task"][55:].fillna(con_hf_task_avg) features_df["HF-after"][55:]=features_df["HF-after"][55:].fillna(con_hf_after_avg) features_df["LH-rest"][55:]=features_df["LH-rest"][55:].fillna(con_lf_rest_avg) features_df["LH-task"][55:]=features_df["LH-task"][55:].fillna(con_lf_task_avg) features_df["LH-after"][55:]=features_df["LH-after"][55:].fillna(con_lf_after_avg) drop_idx=['HR-rest','HR-task','HR-after','HF-rest','HF-task','HF-after','LH-rest','LH-task','LH-after'] targets_df=df_Y.drop(drop_idx,axis=1) targets_array=np.array(targets_df) features_train=np.array(features_df) targets=np.ravel(targets_array) #グリッドサーチによるパラメータの探索 param_range_lr_c=[10**i for i in range(-5,6)] param_range_kpca_gamma=[10**(i) for i in range(-5,6)] train_index=list(range(len(features_train))) train_data=[] targets_train=[] predicted_labels_grid=[] test_score_grid_list=[] for lr_c in param_range_lr_c: for kcpa_gamma in param_range_kpca_gamma: sckit_kpca=KPCA(n_components=None,kernel='rbf',gamma=kcpa_gamma)#n_componentsは謎のパラメータ。誰か教えて for test_index in range(len(features_test)): if test_index in train_index: train_index.remove(test_index) else: pass for i in train_index: train_data.append(features_train[i]) targets_train.append(targets[i]) test_data,targets_test=np.reshape(features_test[test_index],(1,-1)),np.ravel(targets[test_index]) pipe_lr=make_pipeline(StandardScaler(),\ sckit_kpca,\ LogisticRegression(penalty="l2",\ C=lr_c,\ random_state=1,\ solver="lbfgs",\ multi_class='multinomial')) pipe_lr.fit(train_data,targets_train) test_score1_list=[] test_score1=pipe_lr.fit(train_data,targets_train).score(test_data,targets_test) test_score1_list.append(test_score1) test_score_grid=np.mean(test_score1_list) test_score_grid_list.append(test_score_grid) best_score=max(test_score_grid_list)

試したこと

デバックで回したら一回forループを回すことができました。

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

データの読み込み部分も一応載せておきます。見づらかったらすいません。

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

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

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

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

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

tiitoi

2018/12/17 07:55

探索するパラメータ空間が多すぎるのでは? 例えば、a, b, c というパラメータがあり、これをそれぞれ 0 ~ 100 の範囲でグリッドサーチする場合、 100x100x100 = 1000000 通り試さなければなりません。 グリッドサーチした場合、合計何通り試す必要があるのか概算できると思うので、多すぎる場合は探索する範囲またはパラメータを削減してみてはどうでしょうか
moon_light

2018/12/17 08:03

param_range_lr_c=[10**i for i in range(-5,6)] param_range_kpca_gamma=[10**(i) for i in range(-5,6)] の部分で探索範囲を指定しているのですが、リストに10個づづ入っているので100通りですよね? gridsearchCVを使っていた時は、問題無い時間で終わっていたのですが…
guest

回答3

0

ちなみにtrain_dataの初期化のし忘れでした

投稿2018/12/17 10:20

moon_light

総合スコア23

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

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

0

自己解決

疲れてどうかしてました。解決しました。すいません

投稿2018/12/17 10:18

moon_light

総合スコア23

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

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

0

コードを読んでいませんが正しく実装できていると仮定して、leave-one-outだと

グリッドサーチで探索するパラメータ数×データ数

のループが回るので、ある程度データ数があると激遅ですね。

k分割交差検証なら

グリッドサーチで探索するパラメータ数×交差検証のk

です。leave-one-outは交差検証でk=データ数とした場合とみなせなくもありません。

投稿2018/12/17 08:42

hayataka2049

総合スコア30933

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

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

hayataka2049

2018/12/17 08:47

念のために書いておくと、CVは交差検証(クロスバリデーション)です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問