From 5b97dbfb8147c4a7d735f1c984556dc6010bb502 Mon Sep 17 00:00:00 2001 From: joaquintb Date: Wed, 22 May 2024 11:17:40 +0200 Subject: [PATCH] Corrected computation of mean and sd for hyperparameter tuning --- model_selection/hyperparam_tuning.py | 35 ++++++++---------- .../output_hyperparam/hyperparamers.xlsx | Bin 13438 -> 8635 bytes 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/model_selection/hyperparam_tuning.py b/model_selection/hyperparam_tuning.py index ca31f54..fc97f49 100644 --- a/model_selection/hyperparam_tuning.py +++ b/model_selection/hyperparam_tuning.py @@ -73,13 +73,13 @@ if __name__ == "__main__": # -------------------------------------------------------------------------------------------------------- # 1. No class weight models_simple = {"DT" : DecisionTreeClassifier(), - "RF" : RandomForestClassifier(), - "Bagging" : BaggingClassifier(), - "AB" : AdaBoostClassifier(algorithm='SAMME'), - "XGB": XGBClassifier(), - "LR" : LogisticRegression(max_iter=1000), - "SVM" : SVC(probability=True, max_iter=1000), - "MLP" : MLPClassifier(max_iter=500) + # "RF" : RandomForestClassifier(), + # "Bagging" : BaggingClassifier(), + # "AB" : AdaBoostClassifier(algorithm='SAMME'), + # "XGB": XGBClassifier(), + # "LR" : LogisticRegression(max_iter=1000), + # "SVM" : SVC(probability=True, max_iter=1000), + # "MLP" : MLPClassifier(max_iter=500) # "ElNet" : LogisticRegression(max_iter=1000, penalty='elasticnet') } @@ -141,15 +141,15 @@ if __name__ == "__main__": # -------------------------------------------------------------------------------------------------------- # Store each df as a sheet in an excel file sheets_dict = {} - for i, group in enumerate(['pre', 'post']): - for j, method in enumerate(['', '', 'over_', 'under_']): + for i, group in enumerate(['pre']): #['pre', 'post'] + for j, method in enumerate(['under_']): #['', '', 'over_', 'under_'] # Get dataset based on group and method X = data_dic['X_train_' + method + group] y = data_dic['y_train_' + method + group] # Use group of models with class weight if needed models = models_CS if j == 1 else models_simple - # Save results: params and best score for each of the mdodels of this method and group - hyperparam_df = pd.DataFrame(index=list(models.keys()), columns=['Best Parameters','Best Precision', 'Mean Precision', 'SD']) + # Save results: set of optimal hyperpameters -> mean precision and sd for those parameters across folds + hyperparam_df = pd.DataFrame(index=list(models.keys()), columns=['Best Parameters','Mean Precision', 'SD']) for model_name, model in models.items(): print(f"{group}-{method_names[j]}-{model_name}") # Find optimal hyperparams for curr model @@ -158,18 +158,15 @@ if __name__ == "__main__": search.fit(X,y) # Access the results results = search.cv_results_ - # Best parameters and best score directly accessible - hyperparam_df.at[model_name, 'Best Parameters'] = search.best_params_ - hyperparam_df.at[model_name, 'Best Precision'] = round(search.best_score_, 4) - # Finding the index for the best set of parameters best_index = search.best_index_ - # Accessing the mean and std of the test score specifically for the best parameters + # Get sd and mean across folds for best set of hyperpameters + best_params = search.best_params_ mean_precision_best = results['mean_test_score'][best_index] std_precision_best = results['std_test_score'][best_index] # Storing these values - hyperparam_df.at[model_name, 'Mean Precision'] = mean_precision_best - hyperparam_df.at[model_name, 'SD'] = std_precision_best - + hyperparam_df.at[model_name, 'Best Parameters'] = best_params + hyperparam_df.at[model_name, 'Mean Precision'] = round(mean_precision_best, 4) + hyperparam_df.at[model_name, 'SD'] = round(std_precision_best, 4) # Store the DataFrame in the dictionary with a unique key for each sheet sheet_name = f"{group}_{method_names[j]}" sheets_dict[sheet_name] = hyperparam_df diff --git a/model_selection/output_hyperparam/hyperparamers.xlsx b/model_selection/output_hyperparam/hyperparamers.xlsx index 598578e577cf2b89b361f358a0fcc87f12b68552..0f4ba7ea4cbbfa8585dcc2d47f8faffc61ec8ab8 100644 GIT binary patch literal 8635 zcmeHMg6R3fMv!i#ySovPuA$*K$9vB8 z9K653;NCsYeBU$A-fPX?-}k<2t^F<)d3XeT01^NN007VcO!v}2MsNT?6aoN%2S9nC zFXiaqYT@8&tl{Zo0XF3Du(zYmLU_QG0eAqr{(r}R@d^~i_A0e;VLv+qUQ4a9%gvRG zqwwuQI&oQ4#hTk=IzF4}r(0X!rN6zxmdqru5h%kQob%#2><5)Q*nfqDbkwP#hxvCk zYZ{RWaDMCDVQ3;EiFVP`-Os=$6Xzx|HV(H;0VFzCwW;w+FH6W3l7a{b#r#&&W;(TS z7CUOtKkMZSb2=;s$#aYZuemV|KdM@Y5) z^yuwXM5guRdhV=>sTt<&bsD%4Ecm)oou_tn0yTRhB$b|NB{@lEGezj~=z@nsbxm{} zBTnX6Xa*c?l-A(wT+0WA&LqyF04h?lC$5THr^@14e<&$*^6Bt*u>5#o?O3|amKSa- zbSAgLEBml8e+VReoRI*9$zI4|zJgfdSUBL=mfd>Lzw{JF1)I>(yL&#Yq=mNe9KP}B6V9ogXmQ2O= zf;s^YgDU-}<6aq$g}!0@c+1`oqNT63&mSZ$@s^j$*NHU+l za9gS$)-a8xj}c|CDEnBhJyY#ARrVc|N)B2zBTt0Z=jx8sw+GIrq{+UUlTsn7 z<^@inhI~@pOKmbT40YwIiLGJXQHyP7%R59c%>T{`f3etvW7wHm7&Ax#C~z=V{40C> zog05;5;$042jkX%_fe>(DBsS7-GFu*%=I$God9Rrm6LWya~lh#yMlT45zS+tlSML? zT0@-)c}{r8AkY2&PWLlD%oTXN(-zkJP+Wvpcy{|Dh>rco{qQKJyG4|c=ZJW?J3qDy zcF{1C!FV-d(Oqom_=4ZhnHWfdvp>>GpVW*5@!AY*QQ9MxZ2DtZpswq#$Tuag(Z zQ-0=q;vM8l9o+St%9lAByq=X*r@6oEDtXnz+%$W{)_byVxz^n|z6jgt-yuV3#DJay zgUdTa0Du^F#h-x`46?9r1#|wKxc`W#sWJLt*eVr0S3l`jqKqy3~!YItyo5829w-^xOvT!&a;H+ z=xFS~qCj^-mRAt*50g|+3o!@wrO>cZaqaR!WM?I{%wW9aAN&HWSa{-L86K*u(VT`a>An?Mm! z^Jk*G1UK!yiZau$_@INzh`|SgB5zHvFnGIAHs7f8RBTMt+#Ia3D&@Y3owqjbfL^c2 zVuWwHUH`!RAhA0W66IOmTpIkEb9)pC(jFwG63vMe?@9{a{GK?F5xLi*-MIo;v-4}# zHy-9AyY9z1U1HK!K8k49Y##!2l2t>XY<*$oja_%yX4#8PKezek5IZ#Zu$3CnysVA0 zfAKVbIe^^@n>%wflv%&whPQ3qy(eaq@mAxq4lI#k5=&0?m{=c3bD;eAT+kK)fs^H( zy@TU!y_*z>M&cSJuA&=?>KoCHL8Z<3j6OZK9m>k#C1IO+1|je_(_l99jdeqvw5V^a zip<7Nv6vb(#V_g2mfR8T%uWRn~0W7X=C zRb(yGmx(8C9FJ9C;Q{|_9wDkK^FEFoIl5(px)8#cOVnMZY0_i z!S+&Sn~pXmc@HlizrycqIwcoM{>jiL0q126HM2-9L3f$Bf0p&Iy#K;0rWqulpV3I3 zb4r$?f4yYznw*}Vh8-i)B@u-k``POCpi@xot6hnnAsU?Mqe21=PVEQM71B$Kj8%iIXV#@9Zu|1tFaBb(?_Y>U)>C)zvry6v#m%?b9zx zhx0$z6lT>G_dx| z^nW8$X$A4?iQ5K4Um>27n0HM_5H(^RoXWv{$fhQ>9M086_xu?DO)qpGJPhxL#8U_g z8lz{FBA3K}=_HJeZ;RydW@&`14!|Db*cytQj8Xev_SN6uMZr+*)I87c$Yp&4vTIDQG2d4j>~2w6jj#9V?Cw zi#f55V6g>?RH5SC2ylM#XojoZqHGA=cgnV;R_^W)$x8|xcqmNCntBO@ zI`{M-HNDkb!8$I_G4!hFyFydeqS*U)!i^zg+eQZD1B1Rewt2 zF^@}1q%f)yxTKF)zGn(+4Mh?^`$@6)f#IHIh!4`!CA&{``)VuIS0|EA!5tC6W5BRu zM^^rf(v6}uwAQqbNn`cpH;-4s_ASF}@^91d7(7V!jCDM!4h3iFu(!jI2kUCDiuaK2 zE^6!85(f3`HxLPv*F25wYS&z?V?=Y_QRJi23FL0YFpv|fVi79BJASO59*Si=sASs1 zfC#7nIHH=Z|?|IEen05?JW& zX`V3I^JV$nyCi(G$G%D=Mb;0jEWWz0??sf@(=W;$8(l9%D~F4Xgz|5~K}`tXK#W`%KEHXl6kwLrJwIw2w~} zSIx&aUA5#+$QU<09$%XBYTv$|m%?GgXvEWtmO@ucNhv-vTWhGWWC9+4rJex&MPXox zHKtKQ?O_{RP+g`9Dj78I(HGRo8iADC(!y57z{)E~s}e<5pvJ7uBYxh#0$Kze%OEGZ zI~$6=SE>)EfWGj|6B9JVxBSe_5yiIMPC!XbcX#V=bE?GRs&W@PIL=Yh&q2){rc`gP z-0~q}IB`xQFJLl-UjeVZ{c#Wbz_XD!&QkP&VzYS0YNjgTXL(6>%a0|i*T@9 zk9!^pfXxZiDs>QkjFx?WeRz#qY;ok!wXt+2iMZ zJB)I)ST1w3Gq#>wDJb)?B9{nF4SJ5vgjQx8+T8R#x5rEn1K#-`M}|gCQ!$?S&um<& z=;K^Zn9Q;wsJ`yzrvwrK^(m2u1gD>oDI~|*>xAw>TW6W7-*X7hlNfi62yD3yTJPwB zzn6nu4o~MdF5VgHOqIFSjGiWvMnla*e?URPUBsP<#+5x!MGsqEJDuhxS${mb3jC%<`Nwyy@Wep)kKOp>w!jqlyi2hWMnIg1MO zTi3fAl`Om>s%aX%9d}AV;||SvoWl)tNKz$9&GNaaF7Yde{Mbnk%8pqelRA?i4(Eu1 zN|+QV!p%GNEt|-hwaB5B5jRfP`WCRB8`|1tnvPU2xn>g(a9m@qohok9f)WvC+3~NV z9BaSSDhoItJh_xzjF*yM&S4!Q*GWIwg?K)V7h{TgWF;wDZPJ(!ELu};BbVdO69X*< za`oY8Beda4ZzUKy)Q0zt6Bo5nwgg$VWPKD}x_heuxL%+`gf8=EX)-{I9aE*}9j4d=&6_5Q2O)ehQfFfuw_7t~+%vcwf35GtKFwCP~c?c>TINu}@cr$Jwmy}%V z&JxnLbe=YBhnf6XFbQuc$xK|P+C^7B7@S?tyZFJ6){xYc>KP+X=y?pPIm+tpcd6|8 z?z6dgO&Y#=M?ADkg!q{|k7Zd}1gpL~ zcA$Rxgy*Q72}OIf`-s0M3+HUJPhu~IdQ%KF!n>l>fTv|VV?1MM>LG0llv5%~0@dZ( zAg}2^NI2gT!H>B>euO+6aEPZ(q4 zmlk&(o_PdlDri!)g{R2n3+Km=JJ~*;;7-;OkxWjwjG7@B<>Gu2434D(zOVTrY8epk zCH?kIL-A*QGMXqY#blt(>+EsqWx?gP573A=FIV=<)^@0+q?z@FSr?|KFDpM_19y4& zUx=A(i8&^i*BM7Ex2vHzVTxn02{OzuX}m?A zIl{Yx1(DyQ%vk#joHlG>9AGgB2c`s=JDRDuI68qj%^Y1U{_O1hPXK_S=3TTRth0e1 za0Z;CITCY@jwj5bk9+vzfhy`-YHX2SAA7nLD!Vhr;1zrWbVh3_7M;?Ql*5fA#=I}^ zCG`{_b-DMMOepV>A#z%wZb9i`fxh9QW^YY$q95>Rypi~FeMFnflBw2~9sjU`y~QJf zUO`ebh=1ZUf|-;+^IOzZDM4ojKE?@(Q&LvR#con3@*upv7F-#&7K|b7CpZ-E-$8+u z`E0epfFX|Go+Giol5B@56~>nkc<(juIL?PNsCUQ#Jclbv0?E~TpEHn>G; z;-E^O`Rv1-Y^W;k*#nZ~!)A3`IMF`Mlshz;Vk@QX;FvGgW+?ScgCV}`<`UnCrqUfP z&9*#-`PSa`;H&)E1Fpeb`C1OfbqiN7Z8jCk;KM1bl50VZ))e|=`qeG{nAIJhn6G39 zX32MWd9uV(mr`g(*YlQxRXtqa}+fyN;|v34y0(4U%fe1>y(>Pq+{_tW@c}|uGhz9 z;};IwVVFF%#4Ow&;1OxKp~NzDJF|7#VyPsd}%x? zJd=(^HF4G6toK^6Tf{cR@sqD`3SCD~sG|s)QTLV__x!^hb@z(N+~`rQqQXO`mX2C( zN{Q|S|5~`w;IF(K*;*9r!ln3N|2@u5cb3qnNSU3Vq^-&y`x6%=g!ijl1;n0~BvO?j zQfovbt~xR0%~ZC_9?t>{dVy`!!dlra!F@~i3}F@F{8A;v&SEVF>aXmS49>+I$d zW7)}CY&-4>i-_`2tY|ft#zSe}BVVhiTLrun?1}~N*4ARNm|{@z$S%WYqTcYt@rKI> z^yFzu+y^%e;NKUC&2jd zxAxwB!~0E+U#9giUE^NM;C|bm-}%5 literal 13438 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 D55^%2 -- 2.24.1