From 6a7a9a2d0482c895162da6eb1c537fe15376ffb0 Mon Sep 17 00:00:00 2001 From: Rebecca Bilbro Date: Wed, 10 Jun 2020 13:58:32 -0400 Subject: [PATCH] Small fixes to manual alpha selection (#1067) Fixes to manual alpha selection to ensure the correct call to super is made, adds manual alphas quick method and test suite. Closes #1052 --- docs/api/regressor/alphas.rst | 84 +++++++++++++++- .../test_alphas/test_quick_method_manual.png | Bin 0 -> 19684 bytes .../test_alphas/test_similar_image_manual.png | Bin 0 -> 17052 bytes tests/test_regressor/test_alphas.py | 51 ++++++++++ yellowbrick/regressor/alphas.py | 90 +++++++++++++++++- 5 files changed, 217 insertions(+), 8 deletions(-) create mode 100644 tests/baseline_images/test_regressor/test_alphas/test_quick_method_manual.png create mode 100644 tests/baseline_images/test_regressor/test_alphas/test_similar_image_manual.png diff --git a/docs/api/regressor/alphas.rst b/docs/api/regressor/alphas.rst index d8a55eebb..7f8c22403 100644 --- a/docs/api/regressor/alphas.rst +++ b/docs/api/regressor/alphas.rst @@ -5,7 +5,7 @@ Alpha Selection Regularization is designed to penalize model complexity, therefore the higher the alpha, the less complex the model, decreasing the error due to variance (overfit). Alphas that are too high on the other hand increase the error due to bias (underfit). It is important, therefore to choose an optimal alpha such that the error is minimized in both directions. -The AlphaSelection Visualizer demonstrates how different values of alpha influence model selection during the regularization of linear models. Generally speaking, alpha increases the affect of regularization, e.g. if alpha is zero there is no regularization and the higher the alpha, the more the regularization parameter influences the final model. +The ``AlphaSelection`` Visualizer demonstrates how different values of alpha influence model selection during the regularization of linear models. Generally speaking, alpha increases the affect of regularization, e.g. if alpha is zero there is no regularization and the higher the alpha, the more the regularization parameter influences the final model. ================= ============================== Visualizer :class:`~yellowbrick.regressor.alphas.AlphaSelection` @@ -14,6 +14,22 @@ Models Regression Workflow Model selection, Hyperparameter tuning ================= ============================== +For Estimators *with* Built-in Cross-Validation +----------------------------------------------- + +The ``AlphaSelection`` visualizer wraps a "RegressionCV" model and +visualizes the alpha/error curve. Use this visualization to detect if +the model is responding to regularization, e.g. as you increase or +decrease alpha, the model responds and error is decreased. If the +visualization shows a jagged or random plot, then potentially the model +is not sensitive to that type of regularization and another is required +(e.g. L1 or ``Lasso`` regularization). + +.. NOTE:: + The ``AlphaSelection`` visualizer requires a "RegressorCV" model, e.g. + a specialized class that performs cross-validated alpha-selection + on behalf of the model. See the ``ManualAlphaSelection`` visualizer if + your regression model does not include cross-validation. .. plot:: :context: close-figs @@ -22,8 +38,8 @@ Workflow Model selection, Hyperparameter tuning import numpy as np from sklearn.linear_model import LassoCV - from yellowbrick.regressor import AlphaSelection from yellowbrick.datasets import load_concrete + from yellowbrick.regressor import AlphaSelection # Load the regression dataset X, y = load_concrete() @@ -37,9 +53,46 @@ Workflow Model selection, Hyperparameter tuning visualizer.fit(X, y) visualizer.show() +For Estimators *without* Built-in Cross-Validation +-------------------------------------------------- + +Most scikit-learn ``Estimators`` with ``alpha`` parameters +have a version with built-in cross-validation. However, if the +regressor you wish to use doesn't have an associated "CV" estimator, +or for some reason you would like to specify more control over the +alpha selection process, then you can use the ``ManualAlphaSelection`` +visualizer. This visualizer is essentially a wrapper for scikit-learn's +``cross_val_score`` method, fitting a model for each alpha specified. + +.. plot:: + :context: close-figs + :alt: Manual alpha selection on the concrete data set + + import numpy as np + + from sklearn.linear_model import Ridge + from yellowbrick.datasets import load_concrete + from yellowbrick.regressor import ManualAlphaSelection + + # Load the regression dataset + X, y = load_concrete() + + # Create a list of alphas to cross-validate against + alphas = np.logspace(1, 4, 50) + + # Instantiate the visualizer + visualizer = ManualAlphaSelection( + Ridge(), + alphas=alphas, + cv=12, + scoring="neg_mean_squared_error" + ) -Quick Method ------------- + visualizer.fit(X, y) + visualizer.show() + +Quick Methods +------------- The same functionality above can be achieved with the associated quick method `alphas`. This method will build the ``AlphaSelection`` Visualizer object with the associated arguments, fit it, then (optionally) immediately show it. @@ -60,10 +113,31 @@ The same functionality above can be achieved with the associated quick method `a alphas(LassoCV(random_state=0), X, y) +The ``ManualAlphaSelection`` visualizer can also be used as a oneliner: + +.. plot:: + :context: close-figs + :alt: manual alphas on the energy dataset + + from sklearn.linear_model import ElasticNet + from yellowbrick.regressor.alphas import manual_alphas + + from yellowbrick.datasets import load_energy + + # Load dataset + X, y = load_energy() + + # Instantiate a model + model = ElasticNet(tol=0.01, max_iter=10000) + + # Use the quick method and immediately show the figure + manual_alphas(model, X, y, cv=6) + + API Reference ------------- .. automodule:: yellowbrick.regressor.alphas - :members: AlphaSelection, ManualAlphaSelection, alphas + :members: AlphaSelection, ManualAlphaSelection, alphas, manual_alphas :undoc-members: :show-inheritance: diff --git a/tests/baseline_images/test_regressor/test_alphas/test_quick_method_manual.png b/tests/baseline_images/test_regressor/test_alphas/test_quick_method_manual.png new file mode 100644 index 0000000000000000000000000000000000000000..5c2022842d65d51a7d2949e63c37db495ffe2fca GIT binary patch literal 19684 zcmeIaby!th`z|^G6-7b?1W6H)l2E!q1O%kJL8ZGJmahte0=g*au0<>)rBPI*yFoy@ zyK9fR^!@g4U+3&|_WtAibFTee?{^_$m!H1@zh7~Dtm^_nM5gfnv2w(-t-yx@uF^WL z>JH|v9;VJ_ke#WkqpgFht<}@p?q<#|Ru1;u91l3|-@9$;>gp)O$@$-}b2vC#aHekw zjX=X3zO?5&TZvxo9-l~@NZ<|} zU3I?-HVf4>n7YG1p*=|~EbwEJm*g7!tC7_I`St%N(oibFnXE@fM9jKZlaiBLx|0C) zo)BHUc<}+g6uW*ok8p_DC#+36`wD&giqX9J+4*^&-6xS8Yh6d5rEI3p^23Eo#T+J5 zE9Q9vzFqnjbW(iy=Iz_<7B4|TL3srQbq$TkuV25`INy~g^RV7-*u_ORiYw z;^pn1wm1;xyUpizv}09ZSgmDcW!2Kr!6!@zK@At5C4IUJu9bOhn=>*nJVxFiCe|#o z){GzqhG;-OcgyA}4mQ|pgAMa-@B^v|#QtCT^?>GDJRT8|cAi$jjB_Ok4UN4!6$Bx! z{t$VlNOCPcBrHtp>C?2Ho}Ru8IpUIOu&@Cac-C)vo&Vt>2bZH2sfFF2xXgF-CyDxK zq{|Sze*HR@`U{4K$0l3`SHHqnX}`dGg}ur0 zJlCLv9{kd9m-%)Vlg)#+F!(|7DF}(}ULwo$W~!2B@YPGqw^d9(={s@e?`maHx2~P-eLcKhKGk2867>h>GI&ggO0<_Cg-i)k#II122@&8r_AE&4pP%i1Q63Qq2a(Hrh4=DvjOGUjNm4~I>Sn{q@(7?{J*Igl@ z5jKyXMAn=%M5$7PeCWIu(=W)3D{uMZ6X1vq4vzi$(xrt$!cYb|@r>2(J^Jh?N*BPD z0BNjGxj49l3#%0q12fGLZX1)51nWaOScFpc6+1uF%5MW@?4PRhcfHy57(!sTS=->*9kyy;+c2os3XPEppf;};|V z&pWw(@q$GeT3gy~Nh6w}_LJ+|khkM^nSgm9>QfPu_Zqo)eitLzA0K^CkNXs>c^BLw zPj>Ob{Abp>!aFTdzSn!degAdHrwTqF!UdmScD`ik+4KXM;WbKVsX2EY<1P)!DiRyQ zjhuFA#a~_^Gc4xw|33W6#S8W7EcbNwJ*@A@9hvqT75wt+n|TBl+aLqpfKp8l1gE1h z^xN%68Py)GpB+gVKGnE8#3JYI&ZiHb&F9QI>4k%H95pnTV_03D}upvY3E@aAA}$;1t8t);E4PhD9wlYhcjz1m~_ ztnvKUo7Om#`yrPcqyGDouXh}zfjSS==Y=~PDuAYzx>BW%7Sh9c+?F(`#e5Hl&V5o} zD2a~Nzhlt2oQk#r)~T;Nvtmud{z4SM|=gq zB$l(;k6693G5eTY1|l4#B9u!0)g|Y~8Yx2L+@#%F>N{u}p$^L`MpeR=RaDf_W6UWi z$^Xb|b?DQy!?_@=@YMoCQVQ~vv9EUs4jo^V(@v$j0z>o440b0vKQM=zm6V1qbrh2_74$ge3Tc;H8upop*)SL*;dMYAC13#=FT^qL| zn!!%gS54cuRHgEw^xbUO&CuX-pGcRW9=#BM6a)LP)8oN_a-ECP-~U|ZgzpYj{`^Sl z_Yz1#{A=Cq5z(lek2m0ZZ;)JzL_tAP5%w$jzZB(-I*;3{46Dp~lv$q>gX@s0#3a_2 z4#>~LhRn@Q#}K(=<{Vgf?i;*y)$1-W&xSST+Z%6+ZfDo{lM5!hTaMB*nZzzeiq zULp{2SF%h|pO_fXtax%H7oqNMHC)(OwGyg(G}W<&($0O?)B)6Y)~UaZFHZ)mTP5`$ z@BOucFlu4c!`FB;qHIIAQsnsE2XHKmy5rrs6jqtq`nC*%M7=qH*E;-4uu$;^yT%J@ z?8F1My?&pee*b91u_t7nbAc$QsTxarY!Vq z^+T|E+kdd1s>k!$sZG@R@%kP(f~euOyTbN+*}B`$Pou;jhrw#)pU|cKH4$pT#N~dF zq#H)s5-c|MVZ&i!lBMLcRq^(>?|A?5xjFGAr=SsTb-;-<6B2SVfG~@JX?8hkJ?w z6kBw+Wd7EPD9N>tchd|$&JnJ=?M>~pO%E@f9EE$EP2D9Wt5#IP1v^qsK{RN*z#^>W z%Lo;t9Fa5oCz17@`*L>%ul#`{7Hu<7=!O)@wS!lbdi{f_pi4Ps1@g#@SSz1?-xJr< z&tB-}X0VD%+`*lPwA1d@Q4tZ-n=Z~S=hcQkTU)nVVgoYWKdZZ})jT;*h(cAwI1Ii} z=OFNOs9UogmFV0JR`ofoJvs1C%xi_Pf7xJ7OsYNTECWp=5Ts(~u=3%o7PqH^w-_&eu3!9Jd z_e(CiyVf=GS$uh#u%J2L>n=0%Pqz63HoQ0CSMc#Q08DG@Jls|GzH{de2{rZVCO79J z*HWGgsU#UC{k)7)zY#xHV~_UsEEc+V*BsD@8mrBX>q{Ad( zLFjRb7 zzHUkBvnE1byAgmX0)BGgkB^k6dh-T%6*af=(%YeX!V}agD$JLY2t#*$&u^m0Z`!&) z0VxDKuZ>%P%;8IM?#6~Aug$;{RaMpKgJ9)?EmQfL^mwtlGc`?o_QSDRfT>u`pQMQy zmq^+3Pf%h*h;bdeB*`mymqBXAAMdMr!S_z7tBm~)BkToB(Q@LsgQG5`hbGaLaEY`L z!+g6afnxR{?_yTR(dHVBwMJ$>gO%iwWSOT|)tMl@uHfP8yG(E_piM;#^;NkolaP^R zv!QF$mIu-N!W|Pmd2)&cKF{Bujb~T>lSoKPLc09ji;{$&Lsi^%E8sQu^B8WJp1sUou&7DdfOY2 z+gsMd;;-XO&OAHYnQ%PPi}Lz5^9p#(o;22ri4e4|s!QN*k4J^OYGVtdL+g>?bkT_N z$6WpT6S?DJ=O;=4Je!CE_u~bSh@r4hO_r$VZv&hQeo^-&K`Ef;^(ycAfn z<_$Ks{$=+|3m@#;OJ{?>RF(Ke;!Cx3aQ3Nl53&G#)+u#N9>S$8CvbW#R187Cu(n6n z5^!pTM&!KIgK&%Gz|NSQR?3pnryym)f;!;Gd!txp+5Ip#H}?qOJrY`42X`v8jcOip zj$l2rxx!WTRNf50Ni!;~reN`)h1H%M$V07YNG4;ui(PI;Yj7NC? z08`+?nUdm+D>*AO>%gn;@%;<0St#mF(w(n{w1vS{2pLF~ni?7z2?nB`QyL9is6qR0{Q`=@{?AU&K=H-Q z$oPFlKrBoVU`XtEsMX)N;zgMEW{9Tp~eX){up~Le>$Qs zU<)VL@h)%h_Z40%BtkFelo1hWBxmsgZ&seS`WC4fLLHyc%u+q$zWw7Ku<8kLG%~t6 zbLsZac|qnAz3K(l+DHaFac_ATP*F2=^rfxhV&nj0NC}pOZh?nvGJAs-Qo=07YM&Xb z%;r?x0&L1}h)ss-0`sd+K@3GUPO0eVe0=!u;f&)(xTKY%0RDIvs*X>TPluDqAWhy> z5}85E7gckAxey&=#p%$74W;zKI^s7|FVHLN87RMhTQJB zY1TX6r=-N8?a0xrDy~LA^E}~0{yj4I_Q|LB!R;3>Y`n)ymGm~1V6*f0EwUE{N7R=5 zV3bfH8EW(qH5ikz37^?SnB-bR##YXYB{D+=q$>}TGLe#Df%!AyT{q`T z@TyR`B-SSuQ0Li=mRk)L8ah`Rm^XcT{rOEuoWF%fJM}Mxf@M(StO|JR@%z?2qQ2YK z_jLyc_Kya=j~4mC01r^|+iO(VkGsw%da$yyx3374_pqY^qeB<60V2`DxL2M#t!DUn zTX)0$yiMcTH0E{+%YBi?OGq(dEb*n6Ic~sYCbqWZ_U!WHff97bOzhP-ULO8 z;axUKyKRA>S)eMgJ10+L^8UukQ#2E*ON$;UyvwQ7EAFoYd><&>I28ejrTALDPg)ZZd{RoqF2p*fHV%U@GehESw|7|`V6{vRmonmmS_u@ z__(`K+7HYq2bhuPGY}e!c)-_Q#`Wi7+YsEvEz5f;`x6dXZZrEqI| zOOiNpHC2(Nrwc5G+s#ki{9MYl%xUgp4z#W+0ll@+WjEMfU(4zYa#yPjVI)Fvj(a_Z zZH6G3UG)+X3I~E{AA(vvKmQ)P!Dkh~=cs9EMGreUegH+sU?7K__o zZxoZd5R@4E1WN*JVJTX5z>oxl%QY@y`tpgp9Vb|`g=cuji zSK?oB=CF2Ywb|KfGfc{Qe+1ufqNea{Tv&^@^|d$s1OI8?^=oy({{d$IbMglRCyfM& zleU+SPq^D(X3F_3E#|Q|?KJHUyPKbl*r^orkUj!SG|cU~UvYdkU?v=Z$V*3xbooXQq9+VTJgc=4YD{6&`Ohy(IQ zE|Qx!0d)mTx#LVsKwyZ?;;YL;DJjkaLi)z9J7>FzI}$PEp>gGUS9^%8*X3f?4&0-D z>6fXa@$C!TcTwKV_x+dG$LM@`=UoQ3-Mme>rpAVHp(|)hdsS zUKdIWBM#_OG``orHa(0<>}RhC-Y7<~X)764yKB0;m$yW*S-4YuY~#Ww00n2AqRmo! zrvA=K!md!Peu|uphqb(Q7R~CwlW^BiRZ!Ipt71U{Z@qrRfn*KmTEDZydBAjSw{SBR z1%lF?W{n~}UXQ=4S3GN>c6M}zmAQwzWN`T<=^}{Q3gcbHbyS1{oe;DQ$8$g`ZU}3( zzFH{A8?jo=!CLCh31qNx&p*DYJ>8@maZFd$g1XcpDyJ!h5%W z-b%r({$|-a{nAagn)z0ss}Ncx{JcnOa~cVVo(f>3!}qZuzCW-BBFoSlR;l$-#4R8n zHja^r_Em-nF^a9Jhr0m|b$qmK4`8R+FazC*fL2B~R-5iqzn$SOC6s2}%-dvhhvDqG z=?EU{5$i<9Sqvw4a0iH>z8xTVkZF5p6uKfrr%6^^bBcxv25)BPE-I++o^9E&vU2bV z1IlfK4lGQ@E+U}Pxnq+WnojKMWnd@=lMPiCTh3+4TKRE4q2X5KJA1Gxy>&iWLcFL>|w_MwYi#u09 zx2fR*%-89ap#ll1QCK*aa^#~}&6{4(=26k)R}@-jM-lC5AA2*N=i7<7s`*VMX6K3P zW*9ap!O}3%1mSrG<`PuVMxvp&xMctlkJ7Iw9Ck9n0RU$Jd3?N7!YjOUuu~@FDx^Ju z?(72)4F+K}iz83yUSOFwU4V2hZ@=UHgoQQ9OBj@@Kf=>D*Mw^`W2Q(t$pzajFkxnU zgES=H8lUhTAW|;8%MhB4mLfy@QbqSj5N?jXhMQbZSb8?^Oyg^q!?6?g?Sboq26f;Z zWfq+@q13`!w0=7u_Ex7&O+M1|rKQ2{$?34ozmp+5I(u18EczmZn1z?4YUGN%rZ1bDj=KnQ2`MnU zlpGz-_R*9fC%L$|xaOu}kN}v0e3D5i7W#Vq;*z&NRuNq1l^*9o_x&ZtqzX^8&Z+~3tnZzY5F}T{IV-u=9h*( zJu`2@k~jQbWK!#8Cd^LRt;}wtiDW1kc6kC5YCl=nqGnt8LDc#eizAF})GI=w!&kBg z1534rCnZR$$Gx8|-sA=N0aJifw})MZ5Ctkg<)Rh{DI(XffgepbT+MtzBsz=WFx+2! zO5hn#=T0SR21lZmm*C`lFc{?rm1$4nIH@j+0g}gNTkLzNV$WL_^(bQ$d`L?J!5~o#Y8QZXahg_1XLD?0^U4T$*XIt1^ejLlonIQ3F@uIC2F|Rq|G17 z0+ps3E|kIp>~|;$IAeibB&_t&5xz(U>elAL@rirdgZvg&{{s8~fp$X3r4MavOnmoA zSDoK6V4bYosT!CxScucW6LRA9`TP7P3c9jh>K?I77jbya;)?b$$|&!KsKaR%q!J6b zVuDT1pt88IW=no|Wmr9mRr7%`;iNi;jgFxW4NVH!QH6%32?Fo!I7Nj?`tKi%R^}r{ z@Zmd50LTLlc|s)F0f`RKYvqO$s!hOUVs)5>&E)a6Tcd@7>qcZN?3Qq41)V(tIe_=H zW9?{Zu2m!5Hiuzx+3glw*6&AezXxcXECl91`5gu{wGA^>(`Brd2MU16_{IToRC$To z`QDS%^W{qHOQAdVJ$v&(!BoePZXjk1-K zK?~L73fxo}&|ED&I1>xWH8Mh$y3W&;`2yDI^jV1W)q}fk(8gW3waKm{_G8tZjftsg zdVXf^Y+qquYikSc*e18m3e9VK%C;_* z@ovrez5j5F?eDz6YQU4jlczhGZ;NH6q)32tLL<&ZPd~k~zP~=P9>qN+SYM~?+1aq9 z<~woZ?bPpIAowxePF5*zBIqq|j^xEqOI^d+mpC2AoxlI(6yw_BEdKfDpBm?|`ZUDB z$A$(8X=!P%lLX`Q45mAG9)boUjW}^;=d3deJ-yV24*@37PR(> z`x~I22_DLiI6Z77tm4Tst|<&dZ)c0M07CTtLRVqoQF-rFXr1rRMz(O0^e_zh6H`#Tzq+^?T? z44j70#$-5c^P^I7hF}Bw7!F$5nfVsemor6#RFrq#MD?2f)Ktl63ed?bM|X6!w9%V4 z;Xn-<0F`VYx+JpU+BA=rCS`9I^%yy@E?yW$Y+*eU86^}O?*Myb+ZXP?`0{wQ0!CvL zyw=Zw`#5};*64$id!m{CZuqTc7^Lz?+jmFyjeAdrlrIgZ6c1m=YAA*S++Uo#I$ELa z>s!+jeYzd=49kEDv;j60;w`5aF2MN(S<25Q8xv5f!XHp(AZvhOHf^5%@f}aO_AOI5 zO(|9u7(ttbsK_YrwN^Sp7*nP{hTH0z1#c$qW2*>PPz7z04f8em#S~NRwQrC3q;3K?rTo z!m7Fc={jlI%nPwNu8h#HFB4c<-EGGH35A)hIfqdPn7Wm}2#)Lf7}1z|EX=RDl>V}> z!b(xDXD>awZ+W${YI`}^O(ZCs9PnhJz$C)nhdu>+AI}%Ca+m|QyND31sPhOgVr6IDlHMD|mV)?FOfFYl zCp_5tKu8+#j=b~0&=J>mPg^_Nl9K0dvQKC4oAi@Q1>+df0!wkvM z&SH9*&0rigZiBS506xL;kPaO9>lgHp89VgZeWwM(Rr{l)f8C7P?+@Vol$Lgfl#DE% z8b^W!rGDQ)&cn4g8#p}3g2_St7Qg(bFXI478@84emfw%LPV)Qq!H= zhT}C!3|7ioVV7#fjrsjPX~-(g$H6e&0{)_Ue@oy}UOZRFUh+C=(_X=1`r; zZ+$=7PDYLm)xhz?-~O?IVWybSCJ*~{YkX>f1RPgf8;8X6)1wr892RHx`y zb@@y4@m}>0QC}J5dihqgR)!w=6+NXKy#^r$0p4hk@#YItX`z3~ljfp+D=;!jKc%`} zw-5%u9qHL^VYpBcV7{QCC$W%V0PX_` zzadL#0G$Pjo<4E!AFK_g%uMxszjtbY!bM@~7Eaay&U3fs!ODIT?L=yubYO1AR+pCqEckqU|a5_F}I= zhu<~&B{LzdY2B91u-@o)yj7Pay$cGf!MyG z%JBs57$+00W?)EDk7zs1lLH2T+&gDL^F1#G0YM${0GZTj`q`0-KGx<%Gs(4xBo+9t zcl0J2pXU>E&|qJLP6Xk{{-eo8i9$QnJ((DDjzvXX`GA>*`3=IRuQ^md zs7r#IX9NXH3dp@gSE~)&tFGG_nL^PK7S2Ktf)jA<5QqHihKV0vX++l8fadkthm3Nd zQ;`c|R2(wS3jP*o-w$bkStK}Yuxg^1L0@x406LL)XiE(flKP`O08)xX<>iSPWxyp{ zW3~%u_cqW1Ly72Jfw*KrHq$~I6_l3pNXyE`Q{y6%bFNWj5EU-xb35nXB_*NuZ%n0s4JFg6u+uapYPAUpnMZ4yCI<rx=7IH_mQ^?!rl+Lg6@T1Zk>C#!Q&F=6P`;lz*W$9P?+w6SqmEr+E zsP!UrxA7guss#S)_!vlcJC7bc+L*ii7W58Ue*RQ>{yYP)dF^2@>%SCw94HxZkAFJO z2@I&0(GO4P3Behr5aO2V+zSTanDXaT(GO*^RqueaSHh)y+;g!zJFel$Q|kbN{@}s~ z!+8KJzJLF|q@IY7aIYnHBLOt6*SdbMcm^59zhXK35a(^~9`b{8ETi}EwKua>VwT+q zdcSZr1z@>2>dl(r&9f5%4@*V!Hg4aOrQe&^grEiVd$ z3}uYhG-!)2h8iY7_=K`-46}>1MEi_EITF*033&9`g=(D@^OnaS)L|$W3Fs)Of$4%E z&dz#Wd)epE!ZkY7{mv*l>G@j=lmf63p&`Hfe<19^sD+lJ!^{m_%Y}8 zRkEdn&1n!{5!+w+E;OLwr*(qsV3fply>?$737}^7-@(TYT5$V&uxtncSQa@1)`F=O zD0;7zZ^l>zK#gb#_$fy3xh0h0!zsWq=j0N6c0c&+#^69u9Snmu6l|rS27dT%|F?Dk z@X!FC(L`y;0eja1eJ9ONPo;s+AY{SbPly49vnl@k-dz`HB&3r#Aa9z(-oN)wM$*mvUr+#^jgE<-#oOpHl8=19AE^*k+iou3bHJ{@ed0KrdbJS#S8$Up$U)>EUW0vzp@gt%H^YK z>*;w%Z!IP!$4OwBIYk}+bBYTzorkb71mLG!p!VfvrsO_DkMT@c{nWV7y==2pc|D%| z>a}+TUx8ypV0z3KK$nZ<=VI6RW`F5M(pnA6Rj30lo)K^RYRq4Y`>Njr+Z7-K(tg0r zy*m@3ytF%LJh(Ovs1UHFeOZSVkn=qWF)ZDm2|w^1*fbl1h(IKVPJXQaiu}%ZVFMl) zhO>!E3(#Z(Z94epBps0A(k-BrU=gf>Ab>^A z_2qmd@E&k<_8-cF`U(|A1Xz<53Ff#6!KHzMy!j*_C0s%(6%fMPz#hwYfps5N=6XB* zx&%fAmtL^2?fNZo)Osl5_M;63R^A{wVcY@6oHYydc*nh$3n)Z9i%?nx*1%AT%0P$m z4DE20opxB+={hNc9B5*o4i6TOIy-Hp{v8Q`Am2xMBT;2rU(URXEfTP)0*kk=x}AHl z^&ck+wg_MhLWLE~D~CH(kGC{8Z?@?EO#@@8@U-k)?y*me!n56A6v}i0J&+~ERCfC` z<#!X~Ql*$vRjnJ2AeBsRl7+>Iu%+LxI;o0L_QuJHFKL+^S-}6 z*9U*xJRrWnT9$GKpYpnU(uuW|&B7~?=D@SLCMV11@P zO}BEpb!5zcz;8!!!EfSzC?7D95aM-dp}KA!4F$|Qx0sR(C2HsR)ElPOt#_!;ZQ26t z+h7dasmXnKwF%5>+V}ev%IRDx)?lu-w!#;NPur5tKyFUMIS3#qVX=L z1%ScXaBwUtdfx!ma-~H1Q*>*018diTfNw$KUFG(q1^$*`jzrjlvgf?^aHJg=H_;St z4Ie3(B@7oo)A>6~2%9kTML5ejnXnNA=cSLfMxzEqL{!3)h65AY*t-C`H;C9D4s59Z8wDV7 z63~Q>xm4bR#68NfDsx6==*ELX)8$VM!Su0i9&_Llp?G>%{3bO6ge^wlLH zUiU6WJ?8*pUa=B_*w}Jyr)R_#OM zDN`ewF}fGU_lC83~z z0~jJ4@2c}s)EB$b$zQ)LD(HIoS5?P`82su2?Jl?d(F5ReVubi}3TIStcrnGL>sS<8 z|L$oM`lOpgusGy)O7zyqr z)iy|tj3j}zc`xHRWAXuV%McU z7GU>qmNL0N1sXl8ZG0J$vk#CN-$H%hIlG8~wda)B=)V*&bTA6j#mh1TeW!_WkC9=s zGs{_=(MzB~0`SI$IP7^1(pQKG`(CwEMcb?DHePW^fn>IE6^$E;yT0I!|Pt zj|Yw&d{;BvZN5V-0y2yQ7%PMzW?rz1I8SN)cFJE0yKF#DSy^jZu;8NFK+OjGu&2ae z4u#(SPl<6Kun-uop>yUXy@PrP+^+G{@hu^bllEM_sWU!bmn z#I^4Vs5lr5D}g?bNHxKszh4&M$rt0@Zp{V0H2aHsz-U`b3@7@5SiUT=xr0}bIv??;uO5|< zkbhS(j+u^5l7)o@pjBu{WB9#9t(#^uU&dOj-A`c6u$m`|3BDNrt7I<2@E_Op&VT-` z=r$Hb438I|8a4qe0R#iW5phf4g(bL_3-{PpNyIZnW;BBcTaS4!PApS9A`Vjy_MeT} zT?T;q1P7M)L4q@#r1$X>((duNaV-m*J5Y!GujYyzoSQPR7mMX#?#tshqi%2R?dptK zLMh)|Y>+FbLy*E|g-|}8Rn!H7*T76dsjGXifsSgOP6=>gll$k*UZa z2j1mz1E$XdI;tZvQO`iRJpUGS9k8&lSk<%Mf%mdVu3dveG}NI0s2jzaw1T;bQGMWG zQ4H|=8cx&5oo3Xkt(0xx-w}mkGX=X}HM+f7it5{Q?Jx>!xVYF;R0UYKuAi-OV8)KP z&=RA~{9H zC{QS4hMs{nf%miGVW19Pl*m=fl>fi!BM_cl!ZbK0N}Tsq3C{gP%V`7|*A;WM_ls2i{NVNqW#%`M2^^jOWV@I6nh1<=dnFLc`JNKXWRzTb%?V zL7-k;>-2E7yOA{`YrPaZ%mTVk5lZ0AlIKs0;WE?%ZG}FvpfNaSU+ankqtyoo{okkQ z;Flt_!KBj8SA^D)*CS)la5F;kh@T>09;hPPUe)P7?HSYt#;!n}l&d(-s<+z(i4Jos zfmfM^L5*wDBEReF6IPyl_~s^@NFgwdNVIv29^6n=d-dW~30bui~0{O|EClP!@D37b%1TUgEt4`%8l7!9ZEhYt{1z z?f_l60>;xo`TYiTzi4*~(Euh-wbe+NBx^FEce6LI{y;(2iO@1%fvdz{s; z8ZU29t&tEDKZ8Bv$+Rmug_|yM0X476>XOz6hJq14jRNCCNzOJ!O{~#t$^YgtNUpoT z)utK8kH_7F?X>_7jDEAt3)P!~xy$?~oB*`*2OU|EiDdxW56|1d6FTH@+uFVJewm+L zU{Y*U8hCFB@O%TZf9BfSlf{kMv(_u%SU4dw}hwJ{u301b9W|sD604 z-~a2Af>EEg6;FYez)dlwNV(l;R=h)ifE;T1P;W=OWNZmW|x9kOt{x>K!rR|{o0WhAze2-b;^>=$wekM&j zoe^P8v$Qlu;Dm4i7h}C80co3zZ;IP7B0ifAZLYJ z(zm#)>&@U)=Dc+k%-0_9!C4N_D`>S_?N!;?zbdP00lS78S{=xH+tc^-#Fc%-ziY)4 z(Fw!pv-(=$@WNt|4S_SC66CeZ43FMRe69O<;R4SqX*{gqmxPbWB&cNBNpV$g_X+8D z4rxiu7F~|Y{r(S$eBR^68`o7MrOU59{zr0;(PZexz}U<~=Xs*}p~f~(yoX8ib(IsH z;!~b8HTBcSo!h(ZwVa6cW+y7q!~wm-*jp51Vn#^UgRi8So#&6ICq@ffXN_8~Vx3FD zt~8c|g;O-`fy zuU{XQ*$(&Y0fV-F=d<)^LHU`_V$&hh&e*ZAhVS=uMnT!qvj(en>Lk>4>Kk^-`S%4n zKNBlUfIXtVq_bRsAH_s-GH2pDCtvCRdBG*rU?(<&)8`%FU)i7x{`M&%Q=@U3iQT^4ZIezNeekpQpV%CTNs!0g`Z|=qmiQ zmG#`xH@qB~p%$*K%rS~ebqGj{$Q-H2!LEU+O2^ti4Qc? zy(hA7H+4saEPJn=t}g8lcvA}n4DX4gj9kABP8%rwD$vqfhRn{-KLttIAHm?~e(-KB zz^}~Q{zNTGQ!|+GgAO`Im&XLLflD=XmImkLDJQL>`Gc}qSw$X2X^OQU zxF!qLf0Bt0Pbd>5`bi;fiv1Wn zy?{v@Y5@=3+Ie*E!J6G}JY6CQDUG#HmL^8pS5$(7gS~hAwKa8ga$dc<0IRCO+TNvxP&qVGEt-U(XFTflADVKO+7n~qd&@-^kAz!AO$1mkoden*xCKEOuQ`f zh3?2KWX3bbL7t6zzJ6vp)V)z(EfaZaslImd}L6_7g}VU6-h zA2RE2CY06?e&z*M2hd{A&SGzwSgabkL>b9$n>@@xAy2`t%zOESz zR)l*2t!tR3wqW$DksWqFllQw+OhygvM>zUr`A16*FG=`s5vpJ%4 zjc`wlF~?|?mVLEY@WJZnU^uA%4xc=-^r-btX4}u6(NV%n-+Hfo#)TJCk=n89f9!LY zsQ+s1NUKwZ!t5aL8s{jF$(JS}@2QYgF9ZXu>lB$>Y8n(jjh96HnODjP|2y!~qkv96 zAsXE?ruZ6#`fYW2<&Ff9vUQ4m`|n6@t2ah#G5M3XWzBxc*A_X)_;WcV?j=_~_o2Zi z|MS?_K^K;zBoj-gUw>I5p`{0{sg(qwPJ@C)N<7!};+Cz47w%vl99S(bCS&}BD#Mtl z&e-&eBggMKr^Y?H_HrQU4$y!U*Kl3@@7JEgL5=JGMc7^z^FZ;LFvBogZiB%svL z)3f#g7^&zU2P*nz_);!!X9nA+GyY_p<`L}-IDT(@$Ex>zK{tQP17kBA1us^AN5#aZ z2G@=>J7u&26FjS3l|NsVJzBcQ$@MLf9=0sUh@1_TcHbFEIG#0!F3BPJs0H(s9P$So z#5!X3Win@9J95J&1D&G_gPq_wTKizZfs^Z`VntLwu}n)?DWO7?h(j6yzA`EN`t^n7 zS$~$6L=g?q_z8Nsmh+=D@3upgi1R9iLDoWjqstYT(754IW+Rr}umCN;x9 zxfWZ));2$oh_(=nx3S*6`vVSBlWO-rOnD#6j_-DV_P4%H$tc&tA(9Ey;_cGwuc@V} zIa((8H_{-42P)cYM}!%rV*QXLR5J^4`+;{0$8wDv3VZ8*zb&8t68`7xY1)>`SBbzY}7e!2Zl7?Xi>_zEcc`j3)D^CwP=;+Ldf zHP1)PIULHfaBErZ#z=#6U}FrYzr~5_RDDougx~EW&GJWPIo2wTELs2aT>q`Lc_EkY z&%EfK+>rpvHhGj@bzM)aJVpzsF?3nxG4iZt{xdSmVv$Iga2vZ3l7uzgkRywXN0}^f zg)R@sAT^dYmvU$IdEvlXuy-oo$z!An$TnKK>{v}Amg$;|Nc!(VuCoM5{usQJ`~289KORw&Q<^`&KT z+;OyFL?AOSofa}uT_dee*JgJsZhXt2-qee3E$iASj)^RIO{MJVcRXq^#b!5B`Uw`Q z1k3)w;M^6Q-MKmR4tltfbz95&i0OF8|JN0E^4P3j1r*~u>n_0MlK_4aa$8~s5VEc7;`(Y5|Rwy#%$s)ACD^Rz^I|?S;*0ud#(S`Jf~~-b_E$ZCSbsB>YuIqByvD3 zqEI^Bo0;!{0dnVfH7JrtRDo?vNyjKi_>T-Z1;f(s8|qn3bOu>z%+Db+ezVcQNKxj* zG+oJUmXiB(cqj zOh3RV%YdF$M5BbpPbHoSUt^nG%yUiV&*x0+_m$rI_cZR|`x5>6goWW_dOoGoAXpP3 z$3Sz4D-hNrWP*>;Q^QA$7C@RPcbF)IN1j<&nlU>c{Q*$R<@XRN4Nc*}fu~`eukO^; z6pYiMF+KoZzkxr+1pfWsm%EVyc!o^CJ);02FjDJN0S9lWA{02l=B@Y8-1ecZGWg&# zJwQ`IOt-;5p?8?*_CMJfc^$|uApJ!}MQI+pfx))=Qx|FJ*B@+tuWfsZ@Snaqb|e}P zJ)ZX;lkzBWO4>a1b*9Q5L90gyiq%!OIn2z>p-`xnpJg>hXbywVw=wTQf!7f~ECc%- zV=wREmXwrS>dTGzVAKCd1Z$HXRMtQNGKHi!Z)SnN`a(YlzL!G?zIPHnD%?m6Ls{s@ z224+YpO}#I|FVCKJ0tF6Gyy%sVB!CB<6pBQ|NlfdhYlu*u8HKLNI>X9kesyAqr!(K G|NJ))PJ^oe literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_regressor/test_alphas/test_similar_image_manual.png b/tests/baseline_images/test_regressor/test_alphas/test_similar_image_manual.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0941b38d9de8974ab6f836f1ee298805cdb458 GIT binary patch literal 17052 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