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

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

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

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

Q&A

解決済

1回答

1799閲覧

Python・機械学習 二値分類を二回おこなう3クラス分類モデルについて

moon_light

総合スコア23

Python

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

0グッド

0クリップ

投稿2018/12/21 04:52

前提・実現したいこと

二値分類を二回行い3クラスに分類するSVMについてです。想像していた判別率よりかなり低く出てしまっています。
この原因はpipe_svc2のところでpipe_svc1のところでの標準化の処理StandardScaler()が二回行われているせいでしょうか?
それとも判別率の算出方法に問題があるのでしょうか?

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

エラーメッセージはありません。

該当のソースコード

import numpy as np import pandas as pd import matplotlib.pyplot as plt import time import winsound from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from sklearn.pipeline import make_pipeline start=time.time() #データ読み込み file_name='data_class2.xlsx' sheet_name='Sheet7' 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','Target2'],axis=1) drop_idx=['HR-rest',\ 'HR-task',\ 'HR-after',\ 'HF-rest',\ 'HF-task',\ 'HF-after',\ 'LH-rest',\ 'LH-task',\ 'LH-after',\ 'Target2'] drop_idx2=['HR-rest',\ 'HR-task',\ 'HR-after',\ 'HF-rest',\ 'HF-task',\ 'HF-after',\ 'LH-rest',\ 'LH-task',\ 'LH-after',\ 'Target'] mod_excel_num=92 con_mod_index=(mod_excel_num-1) targets_df=df_Y.drop(drop_idx,axis=1) targets2_df=df_Y.drop(drop_idx2,axis=1) targets_array=np.array(targets_df) targets2_array=np.array(targets2_df.iloc[:con_mod_index]) features1=np.array(features_df) features2=np.array(features_df.iloc[:con_mod_index]) targets1=np.ravel(targets_array) targets2=np.ravel(targets2_array) #LOO交差検定によるグリッドサーチでのハイパーパラメータの探索 param_range_c1=[10**i for i in range(-3,3)] param_range_gamma1=[10**i for i in range(-3,3)] param_range_c2=[10**i for i in range(-3,3)] param_range_gamma2=[10**i for i in range(-3,3)] entire_count1=len(targets1) entire_count2=len(targets2) predicted_labels1=[] predicted_labels2=[] best_score=0 for svc_c1 in param_range_c1: for svc_gamma1 in param_range_gamma1: for svc_c2 in param_range_c2: for svc_gamma2 in param_range_gamma2: correct_answer_count=0 for test_index in range(entire_count1): test_index=np.array([test_index]) train_array1=np.array([range(entire_count1)]) train_index1=np.delete(train_array1,test_index) train_data1=np.delete(features1,test_index,0) test_data=features1[test_index] targets_train1=np.delete(targets1,test_index,0) targets_test1=targets1[test_index] pipe_svc1=make_pipeline(StandardScaler(),\ SVC(C=svc_c1,gamma=svc_gamma1,random_state=1,kernel='rbf')) pipe_svc1.fit(train_data1,targets_train1) predicted_label1 = pipe_svc1.predict(test_data) predicted_labels1.append(predicted_label1) if predicted_label1==targets_test1: #正解 if predicted_label1==0: #その他をその他 train_array2=np.array([range(entire_count2)]) train_index2=np.delete(train_array2,test_index) train_data2=np.delete(features2,test_index,0) test_data=features2[test_index] targets_train2=np.delete(targets2,test_index,0) targets_test2=targets2[test_index] pipe_svc2=make_pipeline(StandardScaler(),\ SVC(C=svc_c2,gamma=svc_gamma2,random_state=1,kernel='rbf')) pipe_svc2.fit(train_data2,targets_train2) predicted_label2 = pipe_svc2.predict(test_data) predicted_labels2.append(predicted_label2) if predicted_label2==targets_test2: correct_answer_count+=1 if targets_test2==1: #健常を健常で正解 pass else: #うつをうつで正解 pass else: if targets_test2==0:#うつを健常のミス pass else: #健常をうつのミス pass else: #不安を不安 correct_answer_count+=1 else: if targets_test1==0:#うつをその他のミス pass else: #その他を不安のミス pass test_score=float(correct_answer_count)/float(entire_count1) if test_score > best_score: best_score=test_score best_params={"svc_gamma1":svc_gamma1,"svc_c1":svc_c1,"svc_gamma2":svc_gamma2,"svc_c2":svc_c2} print(best_score) print(best_params)

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

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

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

hayataka2049

2018/12/21 05:08

現状だと、質問者様自身も読んでいる我々も何をやっているのか容易に把握できないコードになっていると思うので、リファクタリングするのが先だと思います。グリッドサーチはsklearnにあるので自分で書く必要はありません。
moon_light

2019/01/09 11:28

すみませんでした。あらためて分かりやすくしたいと思います。
guest

回答1

0

自己解決

すみませんでした。あらためて分かりやすくしたいと思います。

投稿2019/01/09 11:28

moon_light

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問