前提・実現したいこと
二値分類を二回行い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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー