From 6b6cc73e113407c4ded195aaf284fbd68985d09a Mon Sep 17 00:00:00 2001 From: Lindsey Heagy Date: Tue, 30 Jan 2024 13:37:48 -0800 Subject: [PATCH] week 8 python materials on regression 1 --- .../data/marathon.csv | 930 ++ .../py_worksheet_regression1/img/k-nn.jpeg | Bin 0 -> 24188 bytes .../img/k-nn_RMSE.jpeg | Bin 0 -> 24991 bytes .../py_worksheet_regression1.ipynb | 1733 ++++ slides/python/08_regression1_py.ipynb | 436 + slides/python/08_regression1_py.slides.html | 7874 +++++++++++++++++ 6 files changed, 10973 insertions(+) create mode 100644 materials/python/py_worksheet_regression1/data/marathon.csv create mode 100644 materials/python/py_worksheet_regression1/img/k-nn.jpeg create mode 100644 materials/python/py_worksheet_regression1/img/k-nn_RMSE.jpeg create mode 100644 materials/python/py_worksheet_regression1/py_worksheet_regression1.ipynb create mode 100644 slides/python/08_regression1_py.ipynb create mode 100644 slides/python/08_regression1_py.slides.html diff --git a/materials/python/py_worksheet_regression1/data/marathon.csv b/materials/python/py_worksheet_regression1/data/marathon.csv new file mode 100644 index 0000000..d509d97 --- /dev/null +++ b/materials/python/py_worksheet_regression1/data/marathon.csv @@ -0,0 +1,930 @@ +age,bmi,female,footwear,group,injury,mf_d,mf_di,mf_ti,max,sprint,mf_s,time_hrs +35,23.5923233,0,2,1,2,42195,4,10295,60,1,4.098591549295775,2.8597222222222225 +33,22.51829529,0,2,2,2,42195,3,12292,50,0,3.432720468597462,3.4144444444444444 +38,25.56031227,0,2,3,1,42195,4,10980,65,0,3.842896174863388,3.05 +34,22.60793114,0,2,1,1,42195,3,10694,88,1,3.945670469422106,2.9705555555555554 +39,24.97483635,0,2,1,1,42195,2,13452,51,0,3.136708296164139,3.7366666666666664 +33,24.30183029,1,2,2,1,42195,3,14940,40,0,2.82429718875502,4.15 +34,24.57002449,0,1,3,1,42195,3,10747,75,1,3.926211966130083,2.9852777777777777 +53,23.16774559,0,2,1,1,42195,3,10875,45,1,3.88,3.0208333333333335 +34,23.58257103,1,2,2,1,42195,3,16580,39,0,2.5449336550060315,4.605555555555555 +44,20.03506279,1,2,3,1,42195,2,15440,45,1,2.732836787564767,4.288888888888889 +27,29.88360977,0,1,1,1,42195,4,14430,28,1,2.924116424116424,4.008333333333334 +27,21.38561058,0,2,2,1,42195,2,9475,110,1,4.453298153034301,2.631944444444444 +39,29.73737335,0,2,1,2,42195,4,13113,52,0,3.2177991306337224,3.6425 +32,29.21779823,1,2,3,1,42195,2,17190,55,0,2.4546247818499127,4.775 +24,21.70493698,1,2,3,2,42195,2,12701,50,1,3.322179355956224,3.5280555555555555 +35,30.05259323,1,2,1,3,42195,3,22139,30,0,1.9059126428474638,6.1497222222222225 +63,24.48979568,0,2,2,2,42195,2,15172,30,0,2.7811099393619827,4.214444444444444 +47,24.55106735,0,2,3,2,42195,2,14416,52,1,2.9269561598224194,4.004444444444444 +28,18.86635017,1,2,3,1,42195,2,11707,62,0,3.6042538652088494,3.2519444444444447 +42,25.10309982,0,2,2,1,42195,3,14813,30,0,2.848511442651725,4.114722222222222 +58,26.4293766,0,1,3,1,42195,2,14071,70,0,2.9987207732215193,3.9086111111111115 +33,21.75764084,1,2,3,2,42195,3,13337,120,0,3.1637549673839693,3.7047222222222222 +33,22.51829529,0,1,3,1,42195,3,9508,135,1,4.437841817416912,2.641111111111111 +24,22.53944397,1,2,2,1,42195,4,15420,30,0,2.7363813229571985,4.283333333333333 +47,22.49134827,0,2,1,1,42195,4,12312,40,1,3.4271442495126707,3.42 +26,25.25252533,1,2,1,2,42195,2,16899,34,1,2.4968933072962898,4.694166666666666 +52,23.80480194,0,1,1,1,42195,4,13257,40,1,3.182846797918081,3.6824999999999997 +33,28.2003727,1,2,2,1,42195,3,18484,15,0,2.2827851114477387,5.134444444444444 +50,19.17613602,1,2,2,1,42195,2,10718,80,1,3.936835230453443,2.977222222222222 +27,20.77414703,1,2,2,1,42195,2,12095,70,1,3.488631665977677,3.3597222222222225 +47,25.24751663,0,3,1,1,42195,2,10757,60,1,3.9225620526169007,2.9880555555555555 +28,20.91324425,1,1,1,1,42195,2,10888,86,1,3.875367376928729,3.0244444444444443 +37,27.4961338,0,2,3,1,42195,2,14700,42,0,2.870408163265306,4.083333333333333 +31,22.53840446,0,1,2,2,42195,3,12323,45,1,3.424085044226244,3.4230555555555555 +31,24.52615929,0,1,3,1,42195,2,10778,7,0,3.914919280014845,2.993888888888889 +25,24.95965385,1,1,2,1,42195,3,14985,45,1,2.815815815815816,4.1625 +28,19.92750168,1,2,3,3,42195,2,12151,55,0,3.4725536992840094,3.375277777777778 +43,25.24778557,0,2,2,1,42195,3,17400,36,0,2.425,4.833333333333333 +26,19.86567116,1,2,2,1,42195,2,10461,94,1,4.033553197591052,2.9058333333333333 +30,20.57555008,1,2,2,1,42195,4,12719,72,1,3.317477789134366,3.5330555555555554 +36,24.34137344,0,2,3,1,42195,3,13530,51,1,3.1186252771618626,3.7583333333333333 +34,27.51718903,0,2,2,1,42195,3,14939,43,0,2.824486244059174,4.149722222222222 +40,28.44444466,0,2,1,1,42195,4,11611,82,1,3.6340539143915254,3.225277777777778 +38,23.37423897,1,2,2,2,42195,3,13690,35,0,3.0821767713659605,3.8027777777777776 +37,23.84960938,0,2,3,1,42195,3,12566,42,1,3.3578704440553877,3.4905555555555554 +40,21.5213356,0,2,2,1,42195,3,10698,70,1,3.9441951766685364,2.9716666666666667 +33,21.3521862,0,2,1,1,42195,3,13040,40,1,3.235812883435583,3.6222222222222222 +54,21.70465088,0,2,1,1,42195,4,12641,52,0,3.3379479471560796,3.511388888888889 +38,23.80480194,0,1,3,1,42195,3,13860,50,0,3.044372294372294,3.85 +29,18.63140297,1,2,3,1,42195,4,13632,51,1,3.0952904929577465,3.7866666666666666 +31,24.37873268,0,1,3,1,42195,3,15420,34,1,2.7363813229571985,4.283333333333333 +48,28.05836296,0,2,2,1,42195,3,18300,30,0,2.305737704918033,5.083333333333333 +34,20.19801331,0,2,1,1,42195,3,11453,70,1,3.6841875491137692,3.181388888888889 +44,25.20478821,0,2,2,1,42195,4,13458,55,1,3.135309852875613,3.7383333333333337 +64,24.81470108,0,2,1,1,42195,3,14807,60,1,2.849665698656041,4.1130555555555555 +55,25.11189079,0,2,1,1,42195,3,14188,50,1,2.973992106005075,3.9411111111111112 +28,19.66026878,0,2,1,2,42195,4,10080,70,0,4.186011904761905,2.8 +36,22.60793114,0,1,2,1,42195,3,10040,70,1,4.202689243027889,2.788888888888889 +29,27.19741821,1,2,1,2,42195,3,17341,44,0,2.4332506775849145,4.816944444444444 +28,24.34137344,0,2,3,2,42195,3,13840,35,1,3.048771676300578,3.844444444444444 +36,22.857143399999998,0,1,1,2,42195,4,10652,60,1,3.961227938415321,2.9588888888888887 +39,23.37423897,1,2,1,1,42195,3,13148,40,1,3.209233343474293,3.652222222222222 +27,20.20201874,1,2,2,2,42195,2,14100,50,1,2.9925531914893617,3.9166666666666665 +31,22.80591202,1,1,2,2,42195,3,15060,35,0,2.801792828685259,4.183333333333334 +34,23.80480194,1,2,2,1,42195,2,16050,35,1,2.6289719626168226,4.458333333333333 +60,23.87511635,0,2,1,1,42195,3,13767,42,0,3.0649378949662234,3.8241666666666663 +27,24.38188744,0,2,2,2,42195,3,15120,55,0,2.7906746031746033,4.2 +30,21.38588142,0,2,3,1,42195,2,10211,70,1,4.132308294976006,2.836388888888889 +60,24.37873268,0,2,1,1,42195,4,12480,55,1,3.3810096153846154,3.466666666666667 +38,22.37248611,1,2,1,2,42195,3,12420,60,1,3.3973429951690823,3.45 +35,28.25022507,0,1,1,1,42195,4,13147,52,0,3.2094774473263863,3.6519444444444447 +43,22.80591202,0,2,1,1,42195,3,11107,63,1,3.7989556135770237,3.085277777777778 +33,25.11189079,0,1,3,1,42195,4,11056,58,1,3.8164797395079595,3.071111111111111 +49,22.13814735,0,2,1,1,42195,2,14570,60,1,2.89601921757035,4.0472222222222225 +25,22.35768318,0,2,2,2,42195,2,9301,80,0,4.536608966777766,2.5836111111111113 +28,20.77922058,1,2,3,1,42195,2,10691,85,1,3.9467776634552427,2.9697222222222224 +39,21.70493698,1,2,2,1,42195,4,15971,38,0,2.641976081647987,4.436388888888889 +23,22.80591202,0,2,2,1,42195,3,10353,70,0,4.07563025210084,2.8758333333333335 +47,24.48979568,0,2,1,1,42195,3,12111,55,1,3.484022789199901,3.3641666666666667 +32,29.34202003,0,2,1,1,42195,4,12600,38,1,3.348809523809524,3.5 +31,23.30241394,1,2,3,3,42195,3,12123,50,1,3.4805741153179905,3.3675 +43,25.23407936,0,2,2,1,42195,2,13800,52,1,3.0576086956521737,3.8333333333333335 +38,20.41903305,1,2,3,2,42195,2,13120,62,1,3.216082317073171,3.6444444444444444 +36,22.91344261,0,2,2,2,42195,2,12423,55,0,3.396522579087177,3.4508333333333336 +43,19.64085388,0,2,3,1,42195,2,11622,57,0,3.6306143520908623,3.228333333333333 +35,25.16514397,1,3,2,1,42195,4,14453,35,1,2.9194630872483223,4.014722222222222 +51,34.34582138,0,2,2,1,42195,3,18960,45,0,2.225474683544304,5.266666666666667 +28,23.47361565,0,2,1,1,42195,2,11010,72,1,3.832425068119891,3.058333333333333 +39,22.84348106,0,2,1,1,42195,2,11148,40,1,3.784983853606028,3.0966666666666667 +31,20.3689785,1,1,2,1,42195,3,15009,41,0,2.8113132120727564,4.1691666666666665 +54,21.2900238,0,2,1,2,42195,2,10081,100,1,4.185596666997322,2.800277777777778 +26,30.05259323,1,2,1,1,42195,2,15743,32,1,2.6802388363082006,4.373055555555555 +38,21.69139481,0,2,2,2,42195,2,9627,105,1,4.382985353692739,2.6741666666666664 +34,25.04382706,0,2,3,1,42195,4,10780,50,0,3.9141929499072354,2.9944444444444445 +31,20.55720139,1,2,1,2,42195,2,12493,35,0,3.3774913951813015,3.470277777777778 +50,22.60793114,0,1,3,1,42195,4,12052,68,1,3.5010786591437104,3.347777777777778 +45,22.62626266,0,2,3,1,42195,2,10593,65,1,3.983290852449731,2.9425000000000003 +36,22.33406639,0,2,3,1,42195,4,8777,86,1,4.807451293152558,2.4380555555555556 +27,23.20066833,0,1,2,1,42195,3,12960,60,0,3.255787037037037,3.6 +39,23.49176788,1,2,3,2,42195,2,17660,55,0,2.3892978482446208,4.905555555555555 +34,22.26345062,0,2,1,1,42195,3,10425,60,0,4.047482014388489,2.8958333333333335 +47,25.66305733,0,1,3,1,42195,3,11898,38,1,3.5463943519919314,3.305 +44,19.62345314,1,2,3,1,42195,2,9838,22,1,4.28898150030494,2.7327777777777778 +35,22.91344261,0,1,1,1,42195,2,10137,65,1,4.162474104764724,2.815833333333333 +36,22.97629166,0,2,3,1,42195,3,15508,38,0,2.720853752901728,4.307777777777777 +53,23.00556564,0,1,3,1,42195,4,12255,50,1,3.4430844553243576,3.404166666666667 +37,20.34231186,0,1,3,1,42195,4,11352,50,0,3.7169661733615222,3.1533333333333333 +32,24.85795403,1,2,1,1,42195,4,14400,40,0,2.9302083333333333,4 +37,23.46041107,1,2,2,3,42195,4,17160,40,1,2.4589160839160837,4.766666666666667 +38,21.18406296,0,2,2,2,42195,2,12005,52,1,3.5147855060391504,3.3347222222222226 +24,21.06158638,1,2,1,3,42195,2,13530,60,1,3.1186252771618626,3.7583333333333333 +34,24.30183029,0,2,1,2,42195,3,12507,40,0,3.3737107219956823,3.4741666666666666 +35,24.85795403,1,2,1,3,42195,2,15527,40,1,2.7175243124879245,4.313055555555556 +25,23.08238602,1,2,2,1,42195,2,12048,60,0,3.502241035856574,3.3466666666666667 +30,21.69922447,1,2,2,2,42195,3,10334,85,1,4.083123669440681,2.8705555555555553 +37,28.49721718,0,2,1,1,42195,4,16474,50,0,2.5613087289061554,4.5761111111111115 +26,22.19460106,1,2,1,2,42195,3,20355,35,1,2.072955047899779,5.654166666666667 +33,21.23309135,0,3,2,1,42195,2,11440,65,1,3.688374125874126,3.1777777777777776 +37,21.69139481,0,2,3,1,42195,3,9290,108,1,4.541980624327233,2.5805555555555557 +26,19.44146538,1,2,3,1,42195,2,16226,30,0,2.6004560581782323,4.5072222222222225 +37,23.00556564,1,2,1,2,42195,2,16636,60,1,2.536366915123828,4.6211111111111105 +24,24.30183029,1,2,1,1,42195,3,16660,34,1,2.5327130852340938,4.627777777777778 +23,20.41903305,1,2,3,1,42195,3,17153,35,0,2.459919547601003,4.764722222222222 +44,21.68908119,1,2,1,1,42195,3,15060,55,1,2.801792828685259,4.183333333333334 +32,19.92143822,0,2,2,2,42195,3,10080,67,1,4.186011904761905,2.8 +41,21.38588142,0,2,3,3,42195,3,15617,48,0,2.701863354037267,4.338055555555556 +32,26.20307159,1,2,1,2,42195,3,14313,33.59999847,1,2.9480192831691467,3.9758333333333336 +61,23.74768066,0,2,1,1,42195,3,12900,68,1,3.2709302325581397,3.5833333333333335 +42,22.50635719,0,1,2,1,42195,2,11248,89,0,3.751333570412518,3.1244444444444444 +27,23.67722511,1,2,3,2,42195,2,13143,52,1,3.2104542341931066,3.6508333333333334 +22,25.23191071,0,1,1,1,42195,3,12132,50,1,3.4779920870425323,3.3699999999999997 +28,19.44146538,1,2,1,2,42195,4,12960,43,1,3.255787037037037,3.6 +26,29.68460083,0,2,2,1,42195,2,17137,40,1,2.4622162572212174,4.760277777777778 +25,22.14966202,0,2,3,1,42195,4,9152,110,1,4.6104676573426575,2.542222222222222 +47,25.23407936,0,2,2,1,42195,3,11620,62,1,3.6312392426850257,3.2277777777777774 +50,20.24147606,1,2,1,2,42195,4,12211,69,0,3.4554909507820817,3.391944444444445 +34,21.24975014,0,1,2,1,42195,2,11047,75,1,3.8195890286955736,3.068611111111111 +29,23.67722511,0,1,2,2,42195,3,11295,55,1,3.735723771580345,3.1375 +25,24.20903206,1,1,3,1,42195,2,13620,50,1,3.0980176211453743,3.783333333333333 +49,19.57361603,1,2,3,2,42195,2,14304,25,0,2.9498741610738257,3.9733333333333336 +32,22.02581596,0,2,1,1,42195,4,11070,51,1,3.8116531165311653,3.075 +33,25.87862206,1,2,3,3,42195,4,21300,20,0,1.9809859154929577,5.916666666666667 +35,21.38588142,1,2,1,1,42195,4,14340,30,0,2.942468619246862,3.9833333333333334 +38,22.65063095,0,2,2,1,42195,2,12485,67,1,3.379655586704045,3.468055555555556 +32,21.23309135,0,2,3,2,42195,2,12720,35,0,3.3172169811320753,3.533333333333333 +42,23.61009026,0,2,2,2,42195,3,12660,61,0,3.3329383886255926,3.5166666666666666 +44,24.48979568,0,2,1,2,42195,3,12531,50,1,3.3672492219296144,3.4808333333333334 +33,27.15151405,0,1,3,1,42195,4,19825,48,0,2.1283732660781842,5.506944444444445 +47,23.97780609,0,2,2,2,42195,3,11678,80,1,3.613204315807501,3.243888888888889 +46,31.7002182,0,2,3,1,42195,4,23100,18,0,1.8266233766233766,6.416666666666667 +36,27.54168892,1,2,2,3,42195,4,20520,40,0,2.056286549707602,5.7 +25,20.58569527,0,2,2,1,42195,4,10176,75,1,4.146521226415095,2.8266666666666667 +24,23.97780609,0,2,2,1,42195,4,9214,107,1,4.579444323855003,2.5594444444444444 +40,23.04032135,0,2,1,2,42195,4,14160,40,0,2.979872881355932,3.933333333333333 +39,21.34480858,1,2,2,2,42195,2,17640,37,0,2.3920068027210886,4.9 +34,24.5955925,1,2,3,1,42195,4,17100,30,0,2.4675438596491226,4.75 +34,23.97780609,1,2,3,1,42195,3,15958,45,0,2.644128336884321,4.432777777777777 +33,21.74523163,0,1,3,1,42195,4,11673,52,0,3.614751991775893,3.2425 +41,19.29499054,1,2,2,1,42195,4,12780,65,1,3.301643192488263,3.55 +35,21.89049911,1,2,3,1,42195,4,14169,57,1,2.977980097395723,3.9358333333333335 +59,24.23761749,0,2,1,1,42195,4,22565,38,0,1.8699313095501884,6.268055555555555 +46,21.5684433,1,2,2,1,42195,4,13100,79,1,3.2209923664122138,3.638888888888889 +58,21.74523163,0,1,2,1,42195,4,12247,100,1,3.445333551073732,3.4019444444444447 +50,23.14814949,0,2,1,2,42195,3,14433,35,0,2.923508626065267,4.009166666666667 +32,22.53944397,1,2,3,1,42195,4,12774,43,1,3.3031939877876937,3.5483333333333333 +45,19.79558945,1,2,3,1,42195,3,12844,60,0,3.2851915291186544,3.5677777777777777 +30,21.91380501,0,3,3,3,42195,2,18720,40,0,2.25400641025641,5.2 +27,23.08238602,1,2,2,3,42195,4,18514,36.5,0,2.27908609700767,5.142777777777778 +30,20.522686,1,2,1,2,42195,2,13180,35,1,3.20144157814871,3.661111111111111 +40,25.04382706,1,2,1,1,42195,2,18000,55,0,2.3441666666666667,5 +35,22.44668961,0,2,1,2,42195,2,11340,20,1,3.7208994708994707,3.15 +30,20.91937065,0,1,2,1,42195,3,9081,87,1,4.646514701024116,2.5225 +31,20.86985588,1,2,3,2,42195,4,11219,60,1,3.7610303948658528,3.116388888888889 +56,25.04382706,0,2,3,1,42195,3,17110,48,1,2.4661016949152543,4.752777777777778 +26,24.17777824,0,2,1,1,42195,2,14332,42,0,2.9441110801004746,3.9811111111111113 +47,25.96857071,0,2,1,2,42195,4,12713,60,1,3.3190434987807755,3.531388888888889 +45,24.81470108,0,2,2,2,42195,4,12212,40,0,3.4552079921388796,3.3922222222222222 +52,26.71614075,0,2,3,2,42195,2,16055,40,0,2.6281532232949236,4.459722222222222 +45,24.17159081,0,1,1,2,42195,2,15360,52,0,2.7470703125,4.266666666666667 +35,24.56541252,0,1,2,2,42195,3,10640,60,1,3.9656954887218046,2.9555555555555557 +31,22.0385685,1,1,1,3,42195,4,12775,51,1,3.30293542074364,3.548611111111111 +33,29.68460083,0,2,2,2,42195,3,14872,22,0,2.83721086605702,4.131111111111111 +31,25.65335846,1,1,1,2,42195,3,15613,55,0,2.7025555626721323,4.336944444444444 +50,25.04382706,0,2,1,2,42195,3,11961,47,1,3.527715073990469,3.3225 +39,22.51969719,0,2,1,2,42195,4,15420,40,0,2.7363813229571985,4.283333333333333 +39,21.66193008,1,2,3,1,42195,3,14660,50,0,2.8782401091405183,4.072222222222222 +43,24.55106735,0,2,2,1,42195,2,12121,70,1,3.4811484200973517,3.3669444444444445 +37,19.24729347,1,2,2,1,42195,3,14820,100,1,2.847165991902834,4.116666666666666 +38,28.81798363,1,2,3,1,42195,2,16449,60,1,2.565201532008025,4.569166666666666 +35,20.58569527,0,2,3,1,42195,4,12480,56,1,3.3810096153846154,3.466666666666667 +34,20.73756218,1,2,3,1,42195,2,13693,50,0,3.0815014971153145,3.803611111111111 +28,21.74523163,0,2,3,2,42195,3,16513,26,0,2.555259492521044,4.586944444444444 +28,20.86985588,1,2,3,1,42195,4,15627,45,0,2.7001343827990016,4.340833333333333 +48,25.67717934,0,2,3,1,42195,2,16140,20,0,2.6143122676579926,4.483333333333333 +23,20.48237419,0,2,1,1,42195,2,10781,55,0,3.9138298859103977,2.9947222222222223 +51,25.74573708,1,2,1,1,42195,3,16578,40,0,2.5452406804198335,4.605 +33,25.92195129,0,1,3,2,42195,3,12989,38,1,3.2485179767495573,3.608055555555555 +28,22.89282227,1,2,1,1,42195,3,12664,55,1,3.3318856601389766,3.517777777777778 +39,23.00785828,0,2,1,1,42195,2,11065,70,1,3.8133755083596927,3.073611111111111 +38,25.97402573,0,2,1,1,42195,4,13201,55,1,3.1963487614574655,3.666944444444445 +42,24.6258564,0,2,1,1,42195,2,15009,57,0,2.8113132120727564,4.1691666666666665 +41,20.03506279,1,2,3,1,42195,3,13458,57,0,3.135309852875613,3.7383333333333337 +27,25.23191071,0,1,3,1,42195,2,12267,80,0,3.4397163120567376,3.4074999999999998 +42,21.87164688,1,2,3,1,42195,2,12399,65,1,3.4030970239535447,3.444166666666667 +29,24.1301918,0,2,2,1,42195,4,12179,52,0,3.4645701617538385,3.3830555555555555 +44,21.69139481,1,2,2,1,42195,3,13609,40,1,3.1005217135719008,3.7802777777777776 +31,23.00573349,1,2,2,1,42195,2,12817,56,1,3.2921120386986034,3.560277777777778 +22,21.5213356,0,2,1,1,42195,3,11841,50,0,3.563465923486192,3.2891666666666666 +28,23.74768066,1,2,2,3,42195,4,22623,40,0,1.865137249701631,6.284166666666667 +55,26.7323513,0,2,3,2,42195,3,13924,42,0,3.030379201378914,3.8677777777777775 +28,20.24406624,1,2,1,1,42195,3,12851,60,1,3.2834020698778303,3.5697222222222225 +29,21.87164688,1,2,3,2,42195,4,17574,40,0,2.400990099009901,4.881666666666666 +28,21.62211609,1,2,3,2,42195,2,12180,50,1,3.4642857142857144,3.3833333333333333 +27,24.81470108,0,1,3,2,42195,3,14442,31,1,2.9216867469879517,4.011666666666667 +35,25.05203247,0,2,3,2,42195,4,14399,55,1,2.9304118341551497,3.999722222222222 +40,22.176784519999998,0,2,3,1,42195,3,9600,87,1,4.3953125,2.6666666666666665 +33,24.38188744,0,2,3,1,42195,3,12900,45,1,3.2709302325581397,3.5833333333333335 +32,22.51829529,0,2,1,1,42195,4,10139,100,0,4.16165302298057,2.8163888888888886 +39,19.66026878,1,2,2,1,42195,4,14940,58,0,2.82429718875502,4.15 +45,23.84960938,0,2,1,1,42195,3,12510,40,0,3.3729016786570742,3.475 +27,22.3776226,1,2,3,1,42195,3,13496,60,1,3.1264819205690575,3.748888888888889 +41,25.79427338,1,2,2,1,42195,3,14060,55,0,3.0010668563300142,3.905555555555556 +30,21.91380501,0,2,1,1,42195,3,12029,54,0,3.5077728822013468,3.3413888888888885 +28,23.94907188,0,2,2,2,42195,3,12289,34,1,3.433558466921637,3.413611111111111 +46,25.85858536,0,2,3,2,42195,2,16638,37,0,2.5360620266858995,4.621666666666667 +43,26.69023323,0,2,3,3,42195,4,20100,35,0,2.0992537313432837,5.583333333333333 +39,23.27121544,1,2,1,1,42195,2,19920,40,1,2.118222891566265,5.533333333333333 +24,20.86985588,1,2,2,2,42195,4,14400,40,0,2.9302083333333333,4 +31,20.15620995,1,1,1,3,42195,3,11205,42,0,3.7657295850066936,3.1125 +30,23.37472534,0,2,2,3,42195,4,14136,45,1,2.984932088285229,3.9266666666666667 +41,28.44444466,0,2,3,1,42195,4,14100,50,0,2.9925531914893617,3.9166666666666665 +42,23.00573349,1,2,3,1,42195,3,14820,48,0,2.847165991902834,4.116666666666666 +42,21.23312569,0,2,2,1,42195,3,10850,45,0,3.8889400921658988,3.013888888888889 +40,25.11189079,0,2,1,3,42195,4,16080,55,1,2.6240671641791047,4.466666666666667 +47,24.70283508,0,2,1,3,42195,3,12720,70,1,3.3172169811320753,3.533333333333333 +30,22.01950264,1,2,3,2,42195,3,18585,30,1,2.2703793381759483,5.1625 +30,23.74768066,0,1,3,1,42195,4,9278,112,1,4.547855141194223,2.5772222222222223 +33,25.11223602,0,3,1,1,42195,2,12555,55,1,3.3608124253285543,3.4875 +28,26.7323513,0,2,1,1,42195,4,12536,48,0,3.365906190172304,3.482222222222222 +30,24.41077614,0,2,2,2,42195,2,10517,63,1,4.01207568698298,2.921388888888889 +41,22.80591202,0,1,3,1,42195,3,10065,55,1,4.192250372578242,2.7958333333333334 +28,20.77414703,1,3,1,1,42195,4,11190,91,1,3.7707774798927614,3.1083333333333334 +30,19.17613602,1,1,1,3,42195,2,13289,55,1,3.1751824817518246,3.6913888888888886 +44,24.44100571,0,2,1,1,42195,4,9518,108,1,4.433179239335995,2.6438888888888887 +41,19.47665596,0,1,2,2,42195,2,10579,61,0,3.9885622459589753,2.938611111111111 +37,24.48979568,0,2,1,1,42195,3,13027,60,1,3.2390419897136717,3.6186111111111114 +28,22.68170738,0,1,2,1,42195,4,9615,88,1,4.388455538221529,2.6708333333333334 +51,25.21078491,0,2,3,2,42195,3,14247,50,1,2.961676142345757,3.9575 +32,25.24751663,0,2,1,2,42195,3,11593,50,1,3.6396963684982317,3.220277777777778 +41,20.73756218,0,2,1,2,42195,3,9807,95,0,4.302539002753136,2.7241666666666666 +31,22.60793114,0,2,1,1,42195,4,11426,60,1,3.6928934010152283,3.173888888888889 +41,27.45825768,0,2,1,2,42195,2,13400,22,1,3.148880597014925,3.7222222222222223 +40,20.62209892,1,2,2,1,42195,2,12549,105,1,3.3624193162801816,3.4858333333333333 +31,47.18464661,1,2,2,1,42195,3,22680,55,0,1.8604497354497354,6.3 +28,20.20103264,0,2,2,1,42195,4,9483,92,1,4.4495412844036695,2.6341666666666668 +37,24.04452515,0,2,3,1,42195,2,10480,60,0,4.026240458015267,2.911111111111111 +35,23.66053009,0,2,3,2,42195,2,10467,65,0,4.031241043278876,2.9074999999999998 +32,19.34570503,0,1,1,1,42195,4,8152,110,1,5.176030421982335,2.2644444444444445 +30,23.74768066,0,2,3,2,42195,3,10136,90,1,4.162884767166535,2.8155555555555556 +49,19.79558945,1,2,2,1,42195,2,12858,47,1,3.281614559029398,3.5716666666666668 +44,22.32523155,1,1,2,1,42195,2,16973,43,1,2.4860071878866434,4.714722222222222 +54,23.00556564,0,2,3,1,42195,3,11580,70,0,3.643782383419689,3.216666666666667 +30,20.47117615,0,2,2,2,42195,4,8815,90,1,4.7867271695972775,2.448611111111111 +52,22.14966202,0,2,2,1,42195,2,11541,56,1,3.6560956589550297,3.205833333333333 +28,22.26345062,0,1,2,2,42195,2,12150,65,1,3.4728395061728397,3.375 +31,24.52615929,1,2,1,1,42195,4,13879,55,0,3.0402046256934936,3.855277777777778 +45,21.0636425,0,2,2,1,42195,2,11807,90,1,3.5737274498179046,3.279722222222222 +46,20.65626717,1,2,2,1,42195,2,12600,60,1,3.348809523809524,3.5 +29,23.08238602,1,2,2,1,42195,3,13162,60,1,3.2058197842273213,3.656111111111111 +39,23.80480194,0,2,1,1,42195,2,11606,50,0,3.6356195071514734,3.223888888888889 +44,24.56541252,0,2,1,1,42195,2,9300,65,1,4.537096774193548,2.5833333333333335 +46,34.39236832,1,2,3,1,42195,4,12423,62,1,3.396522579087177,3.4508333333333336 +33,25.52073479,0,2,1,3,42195,2,20714,15,0,2.037028096939268,5.7538888888888895 +30,23.37472534,0,2,1,1,42195,4,11332,59,0,3.7235262972114365,3.147777777777778 +37,21.83592224,0,2,1,1,42195,4,14640,45,1,2.882172131147541,4.066666666666666 +31,32.5569725,1,2,1,1,42195,2,18600,32,0,2.268548387096774,5.166666666666667 +32,26.11717224,0,1,3,2,42195,4,8950,36,0,4.714525139664804,2.486111111111111 +34,25.74573708,1,2,3,2,42195,2,18005,45,0,2.3435156900860874,5.001388888888888 +38,27.12304497,0,2,3,1,42195,4,17878,42,0,2.3601633292314577,4.96611111111111 +20,21.23309135,0,1,3,3,42195,2,12910,35,0,3.2683965917893105,3.586111111111111 +23,19.17613602,1,2,2,3,42195,3,15276,45,0,2.762175962293794,4.243333333333333 +25,21.04377174,0,2,2,1,42195,2,11703,51,1,3.605485772878749,3.2508333333333335 +47,24.09060478,0,1,2,1,42195,3,13170,70,0,3.203872437357631,3.658333333333333 +30,27.54821014,0,2,1,1,42195,2,11505,72,1,3.667535853976532,3.1958333333333333 +28,21.17267418,1,1,2,2,42195,2,18600,30,0,2.268548387096774,5.166666666666667 +43,30.55125809,0,2,1,1,42195,2,15120,40,1,2.7906746031746033,4.2 +30,20.41903305,1,2,2,1,42195,2,14760,40,1,2.858739837398374,4.1 +33,24.13549423,0,2,2,1,42195,2,12720,35,1,3.3172169811320753,3.533333333333333 +37,23.84960938,0,2,3,1,42195,3,10980,60,1,3.842896174863388,3.05 +27,21.83592224,0,2,2,1,42195,2,13920,60,1,3.03125,3.8666666666666667 +45,27.22624207,0,2,3,2,42195,2,15600,30,0,2.7048076923076922,4.333333333333333 +32,18.19851494,1,1,3,2,42195,4,12530,60,1,3.367517956903432,3.4805555555555556 +24,21.06158638,1,2,3,1,42195,2,10340,75,1,4.080754352030948,2.8722222222222222 +37,25.96857071,0,2,2,1,42195,4,13860,55,1,3.044372294372294,3.85 +47,21.96660423,0,1,1,1,42195,3,13162,55,0,3.2058197842273213,3.656111111111111 +58,19.20026779,1,2,3,1,42195,3,17421,41,0,2.4220768038574136,4.839166666666667 +39,23.67722511,0,2,1,1,42195,3,12813,40,1,3.293139779911028,3.559166666666667 +50,24.13549423,0,2,3,3,42195,4,17040,46,0,2.476232394366197,4.733333333333333 +44,22.20382309,1,2,2,1,42195,2,16209,50,1,2.603183416620396,4.5024999999999995 +30,22.01950264,0,1,1,1,42195,4,14115,40,0,2.989373007438895,3.9208333333333334 +42,24.34137344,0,2,3,2,42195,4,13200,40,1,3.1965909090909093,3.6666666666666665 +46,21.22448921,0,1,3,2,42195,2,10176,55,1,4.146521226415095,2.8266666666666667 +26,23.27775955,0,2,3,1,42195,2,9904,76,1,4.2603998384491115,2.751111111111111 +34,21.38588142,0,2,3,2,42195,3,13480,50,0,3.130192878338279,3.7444444444444445 +31,21.24975014,0,1,1,3,42195,2,11175,30,0,3.7758389261744965,3.1041666666666665 +51,25.96857071,0,2,2,2,42195,2,13617,53,0,3.098700154218991,3.7824999999999998 +32,29.38775444,0,2,1,1,42195,4,15077,45,0,2.798633680440406,4.188055555555556 +37,36.75645447,0,2,2,1,42195,3,21046,22,0,2.0048940416231114,5.846111111111111 +31,23.08344269,1,1,3,1,42195,3,15070,40,0,2.7999336429993362,4.186111111111111 +54,21.38588142,0,1,1,1,42195,4,18900,32,0,2.2325396825396826,5.25 +50,26.7323513,0,2,3,2,42195,4,13444,65,1,3.1385748289199644,3.7344444444444442 +33,21.06158638,1,2,2,1,42195,3,12481,50,1,3.3807387228587453,3.4669444444444446 +45,25.81369209,0,2,3,1,42195,4,12749,63,1,3.309671346772296,3.5413888888888887 +45,23.45083618,0,1,3,1,42195,4,10963,65,1,3.8488552403539176,3.0452777777777778 +34,26.42340279,0,2,3,2,42195,3,11790,68,1,3.578880407124682,3.275 +56,22.41187286,0,2,2,1,42195,3,10906,80,1,3.8689712085090777,3.0294444444444446 +37,25.92195129,1,2,2,3,42195,3,17281,40,0,2.441698975753718,4.800277777777778 +40,28.13294601,0,2,3,1,42195,3,14355,70,1,2.9393939393939394,3.9875 +64,21.2037735,1,2,2,1,42195,2,15000,17,0,2.813,4.166666666666667 +49,26.61252975,0,2,1,1,42195,2,15587,51,1,2.707063578623212,4.329722222222222 +24,21.51694489,1,2,2,1,42195,3,12830,50,0,3.2887763055339048,3.563888888888889 +55,26.6554451,0,1,3,3,42195,2,16410,41,0,2.5712979890310788,4.558333333333334 +35,31.56565857,0,2,1,3,42195,2,16500,65,1,2.557272727272727,4.583333333333333 +37,25.68181801,0,2,2,3,42195,4,20100,35,0,2.0992537313432837,5.583333333333333 +32,23.67722511,0,1,2,1,42195,4,13162,46,1,3.2058197842273213,3.656111111111111 +30,22.68170738,1,2,1,1,42195,3,12753,51,1,3.308633262761703,3.5425 +40,24.93506622,0,2,2,1,42195,3,13405,65,0,3.147706079820962,3.723611111111111 +33,26.37486076,0,2,3,1,42195,2,14822,45,0,2.8467818108217515,4.117222222222222 +26,25.85858536,0,1,2,2,42195,2,16506,45,1,2.5563431479462015,4.585 +49,22.68170738,1,2,1,2,42195,3,18420,33,0,2.29071661237785,5.116666666666666 +34,21.17267418,0,1,2,2,42195,3,10530,72,1,4.007122507122507,2.925 +47,21.39037323,1,2,3,1,42195,2,15000,40,1,2.813,4.166666666666667 +27,27.52437782,0,1,1,2,42195,4,12426,45,0,3.395702559150169,3.4516666666666667 +35,25.24751663,1,2,1,3,42195,3,13079,52,1,3.2261640798226163,3.6330555555555555 +46,23.84960938,0,2,2,1,42195,2,11913,50,0,3.5419289851422815,3.309166666666667 +55,24.0420742,0,2,2,1,42195,3,12741,70,1,3.3117494702142687,3.5391666666666666 +38,24.85058212,1,2,2,2,42195,4,13210,65,0,3.1941710825132477,3.6694444444444443 +60,32.40740967,0,2,1,1,42195,3,18730,50,0,2.252802989855846,5.202777777777778 +36,23.45410728,1,1,1,2,42195,3,17077,30,0,2.470867248345728,4.743611111111111 +53,21.70465088,1,2,2,1,42195,3,16500,50,1,2.557272727272727,4.583333333333333 +32,24.64646339,1,2,3,1,42195,4,17149,40,0,2.460493323225844,4.7636111111111115 +32,23.82998085,1,2,3,3,42195,3,14379,28,1,2.934487794700605,3.9941666666666666 +51,26.56771851,0,2,3,1,42195,3,14745,43,0,2.861648016276704,4.095833333333333 +41,24.54295158,0,1,1,1,42195,3,9960,100,1,4.23644578313253,2.7666666666666666 +49,20.89957428,1,2,3,2,42195,3,12363,67,1,3.4130065518078134,3.434166666666667 +55,24.37873268,0,2,1,2,42195,3,12180,33,0,3.4642857142857144,3.3833333333333333 +34,24.23761749,0,2,2,2,42195,4,15610,44,0,2.7030749519538757,4.336111111111111 +47,21.38588142,0,2,2,2,42195,3,9827,60,1,4.293782436145314,2.729722222222222 +46,24.69135857,0,2,1,3,42195,3,17820,40,0,2.3678451178451176,4.95 +26,23.37423897,0,2,2,1,42195,4,14820,30,0,2.847165991902834,4.116666666666666 +43,23.06619835,0,1,3,1,42195,3,13105,73,0,3.2197634490652423,3.6402777777777775 +26,21.96660423,0,2,3,1,42195,3,11160,40,1,3.7809139784946235,3.1 +28,23.45410728,1,2,2,1,42195,4,13396,50,0,3.1498208420424008,3.7211111111111115 +48,20.25152397,1,2,1,1,42195,3,15840,45,1,2.663825757575758,4.4 +53,22.68170738,0,2,2,1,42195,3,11507,64,0,3.666898409663683,3.196388888888889 +45,23.2189579,0,2,2,1,42195,4,11470,50,0,3.678727114210985,3.186111111111111 +40,23.61009026,0,2,2,1,42195,4,10627,85,1,3.9705467206172957,2.9519444444444445 +59,23.24191475,0,2,2,1,42195,3,14785,56,1,2.8539059857964153,4.106944444444444 +24,21.98859215,1,1,3,1,42195,4,15284,20,0,2.760730175346768,4.245555555555556 +46,25.05050468,1,2,2,1,42195,4,13720,55,1,3.0754373177842567,3.811111111111111 +55,21.30681801,1,1,1,2,42195,2,13506,54,1,3.124167036872501,3.7516666666666665 +33,22.68170738,1,2,3,3,42195,2,19307,32,1,2.1854767700833895,5.363055555555556 +31,20.03506279,0,2,1,1,42195,3,9414,110,1,4.482154238368388,2.615 +40,27.15151405,0,2,2,1,42195,2,17623,21,1,2.3943142484253532,4.895277777777777 +36,23.67722511,0,1,3,1,42195,3,14712,20.60000038,1,2.8680668841761827,4.086666666666667 +38,20.63082695,0,2,2,1,42195,3,13142,52,1,3.2106985238167707,3.6505555555555556 +41,23.79261398,0,2,2,1,42195,4,9801,80,1,4.305172941536578,2.7224999999999997 +47,23.49176788,0,2,3,1,42195,4,10588,55,0,3.9851718927087267,2.9411111111111112 +49,26.27408218,0,2,2,1,42195,4,12516,44,0,3.3712847555129435,3.4766666666666666 +27,20.65626717,1,2,3,1,42195,3,12545,40,0,3.363491430848944,3.4847222222222225 +45,25.96857071,0,2,3,1,42195,3,13973,30,0,3.0197523795892076,3.8813888888888886 +36,20.03506279,1,2,3,2,42195,2,15722,60,1,2.683818852563287,4.367222222222223 +39,24.44100571,0,1,1,2,42195,3,13565,33,1,3.110578695171397,3.7680555555555557 +27,22.51829529,0,2,1,2,42195,4,10846,61,1,3.890374331550802,3.012777777777778 +47,25.92195129,0,2,3,1,42195,2,14045,65,0,3.0042719829120683,3.901388888888889 +33,22.86756706,0,2,3,1,42195,2,15294,43,1,2.7589250686543743,4.248333333333333 +31,26.93602562,1,1,3,1,42195,3,14109,45,0,2.990644269615139,3.919166666666667 +46,21.04377174,0,2,2,1,42195,2,11492,60,1,3.6716846501914375,3.192222222222222 +42,29.09090996,0,2,1,1,42195,2,12613,25,0,3.3453579640053914,3.5036111111111112 +49,24.48979568,0,2,2,1,42195,3,13080,100,0,3.2259174311926606,3.6333333333333333 +31,22.26345062,0,2,3,2,42195,3,11090,70,1,3.8047790802524797,3.0805555555555557 +40,25.24751663,0,2,3,3,42195,2,15600,60,1,2.7048076923076922,4.333333333333333 +48,25.81369209,0,2,2,2,42195,3,13835,56,1,3.049873509215757,3.843055555555556 +30,21.38588142,1,2,2,1,42195,4,17970,25,0,2.3480801335559267,4.991666666666666 +67,28.05836296,0,2,3,1,42195,2,21600,40,0,1.9534722222222223,6 +33,21.640728,1,1,1,1,42195,2,14043,35,1,3.0046998504593034,3.9008333333333334 +35,20.31658554,0,2,3,3,42195,3,10424,63,1,4.047870299309286,2.895555555555555 +42,24.04452515,0,2,1,1,42195,3,13680,100,0,3.0844298245614037,3.8 +51,32.36148453,1,2,1,2,42195,3,22333,42,0,1.8893565575605606,6.203611111111111 +37,23.88304138,0,1,1,1,42195,3,11987,40,1,3.5200634020188537,3.3297222222222222 +33,18.32382584,1,2,3,1,42195,4,11966,50,0,3.5262410162126026,3.323888888888889 +25,21.5213356,0,1,3,1,42195,2,12300,70,1,3.430487804878049,3.4166666666666665 +54,21.87164688,1,2,2,1,42195,4,14306,51,1,2.9494617642947016,3.973888888888889 +34,25.74573708,0,2,1,1,42195,4,13185,45,0,3.200227531285552,3.6625 +39,22.36208534,0,1,1,1,42195,3,10922,54,0,3.863303424281267,3.033888888888889 +32,22.72727203,1,2,3,1,42195,4,14700,55,1,2.870408163265306,4.083333333333333 +45,21.97979736,0,2,3,2,42195,4,11017,70,0,3.829990015430698,3.060277777777778 +34,23.5923233,1,2,2,2,42195,3,16151,30,0,2.612531731781314,4.4863888888888885 +37,24.1301918,0,2,1,1,42195,3,14096,30,0,2.9934023836549377,3.9155555555555557 +49,19.53418541,1,1,3,1,42195,2,13767,76,1,3.0649378949662234,3.8241666666666663 +70,24.30183029,0,2,2,1,42195,2,17706,42,1,2.383090477804134,4.918333333333334 +38,22.53944397,1,2,2,1,42195,3,15480,30,0,2.72577519379845,4.3 +32,23.14814949,0,2,1,1,42195,3,12540,45,0,3.3648325358851676,3.4833333333333334 +36,25.25252724,0,1,3,1,42195,2,15060,28,0,2.801792828685259,4.183333333333334 +38,22.91344261,0,2,1,1,42195,4,14040,37,1,3.0053418803418803,3.9 +33,22.72154427,1,2,3,1,42195,3,16877,35,0,2.50014813059193,4.688055555555556 +35,18.84972191,1,2,2,1,42195,3,11002,75,1,3.8352117796764227,3.0561111111111114 +45,27.5420742,0,2,2,1,42195,2,15720,50,1,2.6841603053435112,4.366666666666666 +39,22.36208534,0,2,2,2,42195,4,11708,20,1,3.6039460198155107,3.252222222222222 +33,23.49176788,1,2,3,2,42195,2,11580,50,1,3.643782383419689,3.216666666666667 +35,22.70362473,1,1,3,1,42195,3,15028,50,1,2.8077588501463935,4.174444444444444 +41,24.27048302,0,2,3,1,42195,4,11604,80,1,3.636246122026887,3.2233333333333336 +47,23.20066833,0,2,2,2,42195,3,12840,3,1,3.286214953271028,3.566666666666667 +43,20.86985588,1,1,2,2,42195,2,17927,38.5,1,2.353712277570146,4.979722222222223 +43,22.80591202,0,2,2,1,42195,4,11510,55,1,3.6659426585577757,3.1972222222222224 +44,31.16883087,0,2,3,1,42195,3,14942,45,1,2.8239191540623745,4.150555555555555 +35,22.01950264,1,2,1,2,42195,4,13090,38,1,3.2234530175706646,3.636111111111111 +38,19.24001694,1,2,1,1,42195,4,14107,55,1,2.99106826398242,3.9186111111111113 +31,23.00556564,0,2,2,2,42195,2,14314,55,1,2.9478133296073774,3.976111111111111 +23,21.51694489,1,2,3,1,42195,4,10991,73,1,3.8390501319261214,3.0530555555555554 +35,19.64085388,0,2,2,1,42195,3,13111,52,1,3.2182899855083518,3.641944444444445 +34,20.89263725,1,1,2,1,42195,4,11880,45,0,3.551767676767677,3.3 +32,21.87164688,1,2,2,2,42195,2,12700,70,1,3.32244094488189,3.5277777777777777 +46,25.21212006,0,2,2,2,42195,2,13320,42,1,3.1677927927927927,3.7 +27,21.06158638,0,2,3,3,42195,4,10905,55,0,3.869325997248968,3.029166666666667 +24,21.74523163,0,2,2,3,42195,2,11520,45,1,3.6627604166666665,3.2 +43,20.63079834,0,1,1,1,42195,3,11363,48,1,3.713367948605122,3.156388888888889 +34,23.67722511,1,2,2,1,42195,3,19516,40,1,2.1620721459315435,5.421111111111111 +30,26.71614075,0,2,3,1,42195,4,11620,30,0,3.6312392426850257,3.2277777777777774 +38,23.5923233,0,2,3,2,42195,3,12120,55,0,3.4814356435643563,3.3666666666666667 +51,23.84960938,0,1,3,1,42195,4,12648,58,1,3.336100569259962,3.5133333333333336 +46,23.74768066,0,1,2,2,42195,4,12930,80,1,3.2633410672853826,3.591666666666667 +32,22.80591202,1,2,1,2,42195,3,15473,62,1,2.7270083371033413,4.298055555555555 +54,29.26304436,1,2,2,1,42195,2,15840,54,0,2.663825757575758,4.4 +24,19.47665596,0,2,2,1,42195,3,12432,45,1,3.3940637065637067,3.453333333333333 +69,23.06619835,0,2,1,2,42195,2,14460,45,1,2.91804979253112,4.016666666666667 +40,22.35768318,1,2,1,2,42195,3,15922,55,1,2.650106770506218,4.422777777777778 +52,25.32242584,0,2,2,1,42195,2,14275,43,0,2.955866900175131,3.9652777777777777 +36,20.91937065,0,2,3,1,42195,3,9398,90,1,4.489785060651203,2.6105555555555555 +48,25.24778557,0,2,2,1,42195,4,12059,55,1,3.499046355419189,3.349722222222222 +45,24.55106735,0,2,2,1,42195,2,13392,42,0,3.1507616487455197,3.7199999999999998 +28,20.86985588,1,1,1,1,42195,3,14768,40,0,2.857191224268689,4.102222222222222 +49,22.3776226,1,1,1,1,42195,2,12275,74,1,3.4374745417515276,3.4097222222222223 +40,20.03710556,0,1,1,1,42195,3,10600,80,0,3.9806603773584905,2.944444444444444 +56,23.52446938,0,1,3,1,42195,3,12663,65,1,3.332148779909974,3.5175 +25,21.66193008,1,2,3,1,42195,2,12247,50,0,3.445333551073732,3.4019444444444447 +35,20.65626717,1,2,2,3,42195,3,14465,40,0,2.9170411337711717,4.018055555555556 +39,22.35768318,0,2,3,2,42195,2,11334,55,1,3.722869242985707,3.1483333333333334 +38,23.14814949,0,2,1,2,42195,3,11780,50,1,3.581918505942275,3.2722222222222226 +29,20.13986015,1,2,1,2,42195,3,13413,45,1,3.145828673674793,3.7258333333333336 +42,25.97402573,0,2,3,3,42195,3,16500,35,0,2.557272727272727,4.583333333333333 +44,22.33406639,0,2,2,2,42195,2,10685,70,1,3.9489939167056622,2.968055555555556 +37,22.56029701,0,1,2,1,42195,3,13502,45,1,3.1250925788772035,3.7505555555555556 +29,24.48979568,0,2,2,1,42195,3,11011,55,1,3.8320770138951956,3.0586111111111114 +44,24.20903206,0,1,2,1,42195,4,10913,43,1,3.8664895079263264,3.031388888888889 +33,21.51694489,1,1,3,2,42195,4,12510,55,1,3.3729016786570742,3.475 +27,19.44146538,0,2,1,2,42195,3,9540,90,1,4.422955974842767,2.65 +35,20.73756218,1,2,3,1,42195,2,12496,55,1,3.376680537772087,3.4711111111111115 +43,25.81369209,0,2,1,1,42195,3,13989,40,1,3.016298520265923,3.8858333333333333 +40,17.84652138,0,2,3,1,42195,4,12518,60,1,3.370746125579166,3.477222222222222 +38,25.24751663,0,2,3,1,42195,3,12510,55,1,3.3729016786570742,3.475 +28,22.68170738,1,2,3,1,42195,2,12510,65,1,3.3729016786570742,3.475 +37,22.80591202,0,2,3,1,42195,3,10920,50,1,3.864010989010989,3.033333333333333 +36,21.51694489,1,2,2,1,42195,3,11400,35,0,3.7013157894736843,3.1666666666666665 +37,27.20981216,0,1,3,2,42195,2,12424,50,0,3.396249195106246,3.451111111111111 +44,22.57785988,0,2,3,1,42195,2,12823,50,1,3.2905716291039537,3.5619444444444444 +43,22.60793114,0,2,3,1,42195,2,16160,20,0,2.611076732673267,4.488888888888889 +35,19.27918243,1,1,3,1,42195,3,11940,65,1,3.5339195979899496,3.316666666666667 +22,21.87164688,1,2,1,1,42195,4,12065,62,1,3.4973062577704104,3.351388888888889 +53,23.37171364,0,2,1,1,42195,2,12430,75,1,3.3946098149637973,3.4527777777777775 +52,21.03681564,1,2,2,2,42195,4,12578,57,1,3.354666878677055,3.493888888888889 +36,22.14966202,1,1,3,3,42195,4,14040,45,0,3.0053418803418803,3.9 +44,23.49176788,0,2,3,2,42195,2,11524,21,0,3.661489066296425,3.201111111111111 +40,22.86775398,1,2,2,1,42195,2,16440,36,1,2.5666058394160585,4.566666666666666 +30,21.37924576,1,1,3,1,42195,2,12180,63,1,3.4642857142857144,3.3833333333333333 +45,21.38588142,0,1,2,1,42195,3,10875,82,1,3.88,3.0208333333333335 +34,22.51829529,0,2,2,1,42195,2,9533,85,1,4.426203713416553,2.6480555555555556 +29,21.38588142,0,1,1,3,42195,2,9877,90,1,4.272046167864736,2.7436111111111114 +39,21.37291145,0,2,1,2,42195,3,9601,130,1,4.3948547026351426,2.666944444444445 +46,20.41903305,1,2,3,1,42195,4,12837,84,1,3.286982939939238,3.565833333333333 +34,21.87164688,1,1,1,2,42195,3,12255,46,0,3.4430844553243576,3.404166666666667 +34,25.66305733,0,2,1,2,42195,3,14820,35,0,2.847165991902834,4.116666666666666 +38,27.41159058,0,2,2,3,42195,4,18026,18,0,2.34078553200932,5.0072222222222225 +32,24.5955925,1,1,3,1,42195,2,12835,58,1,3.287495130502532,3.5652777777777778 +32,25.8121376,0,2,2,2,42195,2,14459,43,0,2.9182516079950203,4.016388888888889 +31,25.75936508,0,2,2,1,42195,4,13025,50,1,3.239539347408829,3.618055555555556 +40,22.26345062,0,1,3,1,42195,3,8657,125,1,4.874090331523623,2.404722222222222 +40,25.20478821,0,1,3,1,42195,3,13585,40,1,3.1059992638940006,3.773611111111111 +32,23.49176788,0,2,3,1,42195,3,13087,50,1,3.2241919462061586,3.635277777777778 +44,22.79490089,0,2,2,1,42195,3,13456,70,1,3.1357758620689653,3.737777777777778 +44,23.5923233,0,2,1,1,42195,4,11985,45,0,3.520650813516896,3.3291666666666666 +28,24.97483635,0,2,2,1,42195,3,11200,67,0,3.7674107142857145,3.111111111111111 +31,23.84960938,0,2,2,3,42195,4,14160,50,0,2.979872881355932,3.933333333333333 +37,21.07580948,1,2,3,2,42195,3,13812,48,1,3.054952215464813,3.8366666666666664 +26,24.73716545,1,1,1,2,42195,2,14668,43,0,2.8766703026997544,4.0744444444444445 +56,25.47970772,0,1,2,2,42195,3,14650,40,0,2.8802047781569966,4.069444444444445 +28,21.70963478,1,2,1,1,42195,2,12153,40,1,3.4719822266107134,3.3758333333333335 +26,23.2189579,0,2,2,1,42195,2,10087,105,1,4.183106969366511,2.8019444444444446 +29,22.0333519,1,2,1,1,42195,2,12352,46,1,3.4160459844559585,3.4311111111111114 +29,22.03732109,0,2,2,1,42195,3,9392,40,1,4.4926533219761495,2.608888888888889 +36,23.00573349,0,2,2,1,42195,2,10473,75,0,4.028931538241191,2.9091666666666667 +32,24.96845627,0,2,3,2,42195,2,13131,50,1,3.213388165410098,3.6475 +34,23.16774559,1,2,1,1,42195,4,14268,44,0,2.957317073170732,3.9633333333333334 +25,21.91380501,0,2,1,1,42195,3,10021,55,1,4.2106576190000995,2.7836111111111115 +48,23.74768066,0,2,3,3,42195,2,15840,26,0,2.663825757575758,4.4 +35,24.04452515,0,2,3,1,42195,3,10861,74,0,3.8850013810882977,3.016944444444445 +49,20.522686,1,2,2,1,42195,4,13020,65,0,3.2407834101382487,3.6166666666666667 +49,23.27272797,0,3,1,1,42195,3,15873,20,1,2.6582876582876582,4.409166666666667 +29,24.22145271,0,2,1,3,42195,4,12225,60,1,3.4515337423312884,3.3958333333333335 +38,22.26345062,0,1,3,2,42195,3,11220,70,1,3.7606951871657754,3.1166666666666667 +43,24.57002449,0,2,3,1,42195,3,11762,90,1,3.5874001020234654,3.2672222222222222 +42,22.16610718,0,2,3,2,42195,2,10522,65,1,4.010169169359437,2.9227777777777777 +28,28.40193176,1,2,2,1,42195,3,16800,40,0,2.5116071428571427,4.666666666666667 +26,20.03710556,0,1,1,1,42195,3,10822,65,0,3.8990020328959525,3.006111111111111 +27,23.84337807,1,1,2,2,42195,2,11145,83,1,3.7860026917900402,3.095833333333333 +25,20.47117615,0,2,3,2,42195,3,10560,105,1,3.9957386363636362,2.933333333333333 +31,21.03681564,1,2,1,1,42195,2,12500,51,0,3.3756,3.4722222222222223 +32,22.91344261,0,2,1,1,42195,2,10349,64,1,4.077205527104068,2.874722222222222 +35,26.69023323,0,2,3,1,42195,3,15000,50,1,2.813,4.166666666666667 +31,21.07240105,1,2,3,1,42195,4,12500,60,1,3.3756,3.4722222222222223 +38,28.11374855,0,2,1,1,42195,3,16280,55,0,2.591830466830467,4.522222222222222 +46,27.03786278,0,2,2,1,42195,3,14378,40,1,2.934691890388093,3.993888888888889 +28,22.3776226,1,2,3,1,42195,4,11835,55,1,3.565272496831432,3.2875 +66,20.76318932,0,2,1,1,42195,3,18930,60,1,2.229001584786054,5.258333333333334 +44,23.42873192,0,2,2,1,42195,4,15310,49,0,2.756041802743305,4.252777777777777 +24,20.19801331,0,2,1,1,42195,4,9130,86,1,4.62157721796276,2.536111111111111 +30,23.97016907,1,2,2,3,42195,3,17827,25,0,2.36691535311606,4.951944444444445 +28,21.640728,0,2,2,2,42195,4,8242,130,1,5.11950982771172,2.2894444444444444 +30,23.5923233,1,2,1,1,42195,4,15496,70,1,2.7229607640681466,4.304444444444444 +33,23.93687057,0,2,1,2,42195,4,8797,104,1,4.79652154143458,2.443611111111111 +31,23.24191475,0,2,3,1,42195,2,14460,50,1,2.91804979253112,4.016666666666667 +28,24.85058212,0,1,2,1,42195,3,14161,50,1,2.979662453216581,3.9336111111111114 +36,23.5923233,0,1,1,2,42195,4,10050,70,1,4.1985074626865675,2.7916666666666665 +55,22.56029701,0,2,1,1,42195,2,11940,60,1,3.5339195979899496,3.316666666666667 +38,23.90596962,0,2,1,3,42195,2,13468,55,0,3.132981882981883,3.741111111111111 +49,23.84960938,0,2,3,1,42195,3,11998,44,1,3.5168361393565593,3.332777777777778 +29,25.74573708,1,2,2,1,42195,3,20430,33,0,2.065345080763583,5.675 +35,22.72189331,1,2,3,2,42195,2,13072,70,1,3.227891676866585,3.631111111111111 +40,24.30183029,1,2,3,2,42195,4,14750,55,1,2.860677966101695,4.097222222222222 +23,17.7299614,0,2,2,2,42195,3,9780,50,0,4.314417177914111,2.716666666666667 +36,22.0385685,0,2,1,1,42195,2,11395,97,1,3.702939885914875,3.1652777777777774 +36,23.03030205,1,1,1,1,42195,2,12291,54,1,3.432999755918965,3.4141666666666666 +49,23.3258419,0,1,3,1,42195,4,10701,62,0,3.9430894308943087,2.9724999999999997 +43,24.3044014,0,2,2,1,42195,3,11593,65,1,3.6396963684982317,3.220277777777778 +36,32.05936813,0,1,1,3,42195,3,15600,45,1,2.7048076923076922,4.333333333333333 +34,23.2491684,0,1,1,2,42195,3,13320,50,0,3.1677927927927927,3.7 +30,22.57785988,0,1,2,1,42195,3,11040,100,1,3.8220108695652173,3.066666666666667 +35,22.01950264,1,1,1,1,42195,3,12546,55,1,3.363223338115734,3.485 +28,23.08344269,0,1,3,1,42195,3,13320,46,0,3.1677927927927927,3.7 +30,20.03506279,1,2,1,3,42195,2,12996,45,0,3.246768236380425,3.61 +39,21.38588142,0,1,1,2,42195,4,11462,70,1,3.6812947129645788,3.1838888888888888 +31,22.68170738,1,2,1,1,42195,2,12204,60,0,3.457472959685349,3.39 +46,19.64085388,0,1,1,1,42195,3,9838,70,1,4.28898150030494,2.7327777777777778 +48,20.20202065,0,1,3,1,42195,3,10020,70,1,4.211077844311378,2.783333333333333 +48,20.76124382,1,2,1,1,42195,2,12072,55,1,3.4952783300198806,3.353333333333333 +32,25.89813232,0,2,2,1,42195,3,12075,57,1,3.4944099378881988,3.3541666666666665 +45,26.6554451,0,2,2,3,42195,2,15600,29,0,2.7048076923076922,4.333333333333333 +33,20.92764473,0,2,3,3,42195,3,10719,80,0,3.936467954100196,2.9775 +35,19.67647552,1,2,2,3,42195,2,11160,20,1,3.7809139784946235,3.1 +34,19.44146538,0,2,1,1,42195,3,10485,44,1,4.024320457796852,2.9125 +54,22.33406639,1,1,3,1,42195,3,12649,65,0,3.335836825045458,3.513611111111111 +32,26.16460609,1,1,3,1,42195,3,19200,45,1,2.19765625,5.333333333333333 +42,28.2599144,0,2,3,1,42195,2,21180,40,0,1.9922096317280453,5.883333333333334 +29,31.14186668,0,2,3,1,42195,2,13560,50,0,3.1117256637168142,3.7666666666666666 +37,24.22145271,0,2,1,2,42195,4,10558,65,0,3.996495548399318,2.932777777777778 +44,18.87354088,1,1,1,1,42195,2,10077,104,1,4.187258112533492,2.7991666666666664 +27,21.30681801,1,2,2,2,42195,3,15965,35,0,2.6429689946758534,4.434722222222222 +33,19.88636398,1,2,2,1,42195,2,11341,60,0,3.7205713781853453,3.150277777777778 +41,23.74960518,0,2,3,1,42195,3,13680,50,0,3.0844298245614037,3.8 +29,22.26345062,0,2,2,2,42195,4,10853,65,1,3.8878651064221876,3.0147222222222223 +33,24.20903206,0,2,1,1,42195,2,12060,58,1,3.4987562189054726,3.35 +34,23.04032135,0,2,2,2,42195,4,12197,60,1,3.459457243584488,3.3880555555555554 +30,21.25563812,1,1,1,1,42195,4,13020,40,1,3.2407834101382487,3.6166666666666667 +58,21.04377174,0,2,3,2,42195,2,10936,53,1,3.8583577176298465,3.037777777777778 +31,23.00573349,1,2,3,1,42195,2,12731,35,1,3.3143507972665147,3.536388888888889 +32,20.03710556,0,2,1,1,42195,4,11031,30,0,3.8251291813978785,3.0641666666666665 +42,24.6258564,0,1,3,1,42195,4,11043,58,1,3.8209725618038575,3.0675000000000003 +37,20.62209892,0,2,1,1,42195,4,10512,80,1,4.01398401826484,2.92 +37,22.14966202,0,2,3,1,42195,3,10576,100,1,3.989693645990923,2.937777777777778 +34,24.44100571,0,2,2,3,42195,2,10487,70,1,4.023552970344236,2.9130555555555557 +37,24.52615929,0,2,3,1,42195,3,11262,75,0,3.7466702184336707,3.128333333333333 +40,23.00556564,0,2,3,1,42195,3,14940,48,1,2.82429718875502,4.15 +21,21.24975014,0,2,3,2,42195,4,12300,45,0,3.430487804878049,3.4166666666666665 +28,23.56902504,0,2,2,2,42195,2,13680,60,0,3.0844298245614037,3.8 +22,25.68033028,0,2,3,1,42195,4,16330,23,0,2.583894672382119,4.536111111111111 +27,25.23191071,1,2,2,2,42195,2,14700,45,0,2.870408163265306,4.083333333333333 +30,23.37423897,1,2,3,1,42195,4,13530,60,0,3.1186252771618626,3.7583333333333333 +29,25.16514397,0,2,2,2,42195,2,12508,60,0,3.3734409977614326,3.4744444444444444 +25,22.51829529,0,1,3,1,42195,3,8447,125,1,4.995264590979046,2.346388888888889 +30,23.91919327,0,1,1,1,42195,4,13392,40,0,3.1507616487455197,3.7199999999999998 +35,20.24147606,1,2,1,1,42195,2,10610,65,0,3.976908576814326,2.9472222222222224 +32,19.37938118,0,3,2,1,42195,3,12158,35,0,3.4705543674946537,3.377222222222222 +35,22.91344261,0,1,2,2,42195,4,11100,80,1,3.8013513513513515,3.0833333333333335 +41,19.74053955,1,2,3,1,42195,3,12713,70,0,3.3190434987807755,3.531388888888889 +29,27.4961338,1,2,1,1,42195,3,18180,30,0,2.320957095709571,5.05 +34,25.25252724,0,2,2,1,42195,4,10550,65,1,3.999526066350711,2.930555555555556 +31,22.31223869,0,2,1,1,42195,4,12084,59,1,3.4918073485600796,3.356666666666667 +41,26.7320137,0,2,1,1,42195,4,11294,64,1,3.736054542234815,3.137222222222222 +29,25.20478821,0,2,2,3,42195,4,13080,40,0,3.2259174311926606,3.6333333333333333 +24,22.36208534,0,2,3,2,42195,4,15042,35,0,2.805145592341444,4.178333333333333 +36,21.38588142,1,1,1,1,42195,2,17310,40,0,2.4376083188908146,4.808333333333334 +35,29.21779823,1,2,3,3,42195,2,19545,26,1,2.1588641596316194,5.429166666666666 +26,21.46464729,0,2,2,1,42195,4,11301,62,0,3.7337403769577913,3.1391666666666667 +60,22.44668961,0,2,1,1,42195,2,13890,40,1,3.037796976241901,3.8583333333333334 +35,22.91344261,0,1,2,2,42195,3,12900,40,1,3.2709302325581397,3.5833333333333335 +41,23.67722511,0,2,1,1,42195,4,11100,60,1,3.8013513513513515,3.0833333333333335 +26,22.19460106,1,2,2,1,42195,3,15600,37,1,2.7048076923076922,4.333333333333333 +49,23.45083618,0,2,3,1,42195,3,11936,50,1,3.535103887399464,3.3155555555555556 +36,28.40909004,1,2,3,2,42195,3,19827,43,0,2.128158571644727,5.507499999999999 +37,20.55757523,0,1,3,1,42195,4,9468,90,1,4.4565906210392905,2.6300000000000003 +28,22.3776226,1,2,1,2,42195,3,15430,30,1,2.7346079066753077,4.286111111111111 +37,23.92344666,0,1,1,1,42195,3,12660,35,0,3.3329383886255926,3.5166666666666666 +23,22.3776226,1,2,2,1,42195,4,14460,50,0,2.91804979253112,4.016666666666667 +43,23.15398788,0,1,1,1,42195,2,15120,45,1,2.7906746031746033,4.2 +28,20.44668007,0,2,1,1,42195,3,8966,115,0,4.706111978585769,2.4905555555555554 +36,22.16610718,0,2,3,1,42195,4,10752,60,1,3.9243861607142856,2.9866666666666664 +39,21.91380501,0,1,1,1,42195,4,12574,60,0,3.355734054397964,3.4927777777777775 +55,22.51829529,0,2,3,1,42195,2,12752,38,0,3.308892722710163,3.542222222222222 +29,22.22222137,1,2,1,1,42195,2,11276,73,0,3.7420184462575383,3.1322222222222225 +32,18.39954567,0,2,2,3,42195,2,9848,70,1,4.284626320064988,2.7355555555555555 +30,24.20903206,0,3,1,1,42195,3,20591,35,0,2.04919625078918,5.719722222222222 +37,22.90478325,1,2,1,1,42195,2,11627,51,1,3.629053066139159,3.229722222222222 +41,21.86121559,1,2,1,1,42195,3,13322,67,1,3.167317219636691,3.7005555555555554 +33,18.03393936,0,2,3,1,42195,3,11009,65,1,3.832773185575438,3.0580555555555553 +38,33.73579407,1,2,1,1,42195,2,16258,40,1,2.5953376799114283,4.516111111111111 +28,23.29388237,0,2,1,1,42195,4,10839,65,0,3.8928867976750623,3.0108333333333333 +57,25.5287571,0,1,3,1,42195,2,13155,64,1,3.2075256556442415,3.654166666666667 +24,22.3776226,1,2,3,1,42195,2,16000,44,0,2.6371875,4.444444444444445 +45,20.81165504,1,2,1,2,42195,2,13620,40,0,3.0980176211453743,3.783333333333333 +25,23.08344269,0,1,1,2,42195,3,14160,50,1,2.979872881355932,3.933333333333333 +55,20.25152397,0,1,1,2,42195,2,10984,60,0,3.8414967225054624,3.051111111111111 +33,25.96887398,0,2,2,1,42195,3,12510,47,1,3.3729016786570742,3.475 +27,27.5420742,1,2,1,3,42195,2,20967,40,0,2.012448132780083,5.824166666666667 +37,28.05836296,1,3,1,3,42195,3,19326,40,1,2.183328158956846,5.368333333333334 +47,24.57002449,0,2,3,2,42195,4,12640,55,0,3.3382120253164556,3.511111111111111 +32,24.70283508,0,1,3,3,42195,2,11296,42,1,3.735393059490085,3.137777777777778 +36,20.86985588,1,1,2,3,42195,3,12115,63,1,3.4828724721419726,3.3652777777777776 +32,21.37073326,1,2,1,1,42195,4,12795,74,1,3.2977725674091443,3.5541666666666667 +39,21.86121559,1,2,1,1,42195,2,14400,40,0,2.9302083333333333,4 +60,22.14966202,0,2,3,1,42195,4,14460,56,0,2.91804979253112,4.016666666666667 +24,21.30681801,1,1,1,3,42195,4,13305,40,1,3.1713641488162345,3.6958333333333333 +32,22.3776226,1,2,1,1,42195,3,12971,80,1,3.253025981034616,3.6030555555555557 +47,25.97402573,0,1,1,1,42195,2,12466,55,1,3.384806674153698,3.462777777777778 +51,23.33714104,0,2,1,1,42195,4,14709,55,1,2.8686518458086887,4.085833333333333 +41,26.37949944,1,1,2,1,42195,4,19800,25,0,2.131060606060606,5.5 +50,23.00573349,0,1,2,2,42195,3,10563,62,1,3.9946038057370066,2.934166666666667 +64,24.37873268,0,2,3,1,42195,2,13397,62,0,3.149585728148093,3.721388888888889 +31,18.69939232,1,2,1,1,42195,3,16497,56,0,2.557737770503728,4.5825 +29,23.82097435,1,1,3,2,42195,2,11646,60,1,3.623132405976301,3.235 +51,31.84507942,0,2,2,1,42195,2,16330,30,0,2.583894672382119,4.536111111111111 +39,22.70872116,0,2,1,2,42195,3,12936,51,0,3.26182745825603,3.5933333333333333 +24,23.5923233,0,1,3,3,42195,2,9937,74,1,4.24625138371742,2.760277777777778 +53,23.14814949,0,2,2,1,42195,2,12220,55,1,3.452945990180033,3.3944444444444444 +46,22.86756706,0,2,2,2,42195,4,10309,90,0,4.093025511688816,2.863611111111111 +27,24.09897804,1,1,2,2,42195,3,13860,45,0,3.044372294372294,3.85 +33,21.5213356,1,2,1,1,42195,4,15780,40,0,2.673954372623574,4.383333333333334 +29,24.20903206,1,1,3,1,42195,2,14131,75,1,2.9859882527775814,3.925277777777778 +40,23.00556564,0,2,3,1,42195,3,11100,70,1,3.8013513513513515,3.0833333333333335 +37,19.55280685,0,2,3,1,42195,4,10834,84,1,3.8946834040982092,3.0094444444444446 +52,18.95542717,1,2,3,1,42195,3,17283,55,0,2.4414164207602846,4.800833333333333 +30,25.11189079,0,1,2,1,42195,2,11280,50,1,3.7406914893617023,3.1333333333333333 +33,20.48413086,1,2,1,1,42195,3,12837,56,0,3.286982939939238,3.565833333333333 +44,26.73796654,0,2,1,2,42195,3,14760,24,0,2.858739837398374,4.1 +33,23.20066833,0,2,3,1,42195,4,10229,87,1,4.12503666047512,2.8413888888888885 +40,20.41903305,1,2,3,1,42195,4,13110,70,0,3.2185354691075516,3.6416666666666666 +38,22.14966202,0,2,1,1,42195,4,10751,60,1,3.924751185936192,2.986388888888889 +38,20.19000053,1,2,2,2,42195,3,11226,64,1,3.7586851950828435,3.118333333333333 +31,22.7912426,0,1,2,1,42195,2,10395,72,1,4.059163059163059,2.8875 +42,31.72218323,1,2,3,2,42195,3,22860,35,0,1.8458005249343832,6.35 +47,23.70931816,0,2,1,3,42195,2,14122,33,0,2.987891233536326,3.9227777777777777 +34,19.85831833,1,2,1,1,42195,3,17700,50,0,2.3838983050847458,4.916666666666667 +34,22.4551754,0,2,3,1,42195,3,9696,20,1,4.351794554455446,2.6933333333333334 +47,25.92195129,0,1,2,2,42195,2,11968,50,1,3.5256517379679146,3.3244444444444445 +34,24.0420742,1,2,1,3,42195,3,17760,51,0,2.3758445945945947,4.933333333333334 +42,19.47665596,1,2,3,1,42195,3,13800,50,0,3.0576086956521737,3.8333333333333335 +42,27.4961338,0,2,1,1,42195,2,16020,30,0,2.6338951310861423,4.45 +31,22.47685242,1,2,3,2,42195,3,13610,42,0,3.100293901542983,3.780555555555556 +25,23.37423897,1,2,1,1,42195,3,12900,24,1,3.2709302325581397,3.5833333333333335 +30,23.88304138,0,2,1,1,42195,3,11700,32,0,3.6064102564102565,3.25 +32,17.75568008,1,1,2,3,42195,3,10923,60,1,3.8629497390826697,3.0341666666666667 +28,22.0347538,0,2,1,1,42195,4,17185,32,1,2.455338958393948,4.773611111111111 +27,21.20791435,0,2,2,2,42195,2,13747,45,0,3.0693969593365824,3.818611111111111 +45,23.64034653,0,1,1,1,42195,4,10595,110,1,3.9825389334591788,2.9430555555555555 +46,24.96845627,0,1,3,1,42195,4,14199,45,1,2.9716881470526095,3.944166666666667 +28,25.60000038,0,2,2,1,42195,3,15324,45,0,2.7535238841033673,4.256666666666667 +43,19.6209259,0,1,2,1,42195,3,11642,90,1,3.624377254767222,3.233888888888889 +51,21.74523163,0,2,1,2,42195,4,10782,80,1,3.9134668892598774,2.9949999999999997 +45,23.80480194,0,2,2,1,42195,4,12662,60,1,3.33241194124151,3.5172222222222222 +51,23.45083618,0,2,3,1,42195,3,12504,56,1,3.3745201535508635,3.4733333333333336 +38,28.2003727,0,2,1,2,42195,4,11880,45,0,3.551767676767677,3.3 +34,23.00556564,0,2,3,1,42195,4,10750,75,0,3.9251162790697673,2.986111111111111 +28,23.98990059,0,2,3,1,42195,4,11130,53,1,3.7911051212938007,3.091666666666667 +45,19.51649475,0,2,2,1,42195,2,13423,45,0,3.14348506295165,3.7286111111111113 +43,19.88636398,1,2,2,1,42195,3,12909,50,1,3.2686497792237974,3.5858333333333334 +34,24.44100571,0,2,3,3,42195,3,10710,65,1,3.939775910364146,2.975 +30,21.5213356,1,2,3,1,42195,4,19618,30,1,2.150830869609542,5.449444444444444 +45,20.33395195,0,2,2,3,42195,2,9930,82,1,4.2492447129909365,2.7583333333333333 +33,22.08595085,1,1,3,3,42195,3,12867,40,0,3.2793191886220563,3.5741666666666663 +47,21.83592224,0,2,2,1,42195,4,10747,86,1,3.926211966130083,2.9852777777777777 +43,23.14814949,0,2,1,1,42195,3,10200,45,0,4.136764705882353,2.8333333333333335 +38,19.04384041,0,2,1,1,42195,4,13069,75,1,3.228632642130232,3.6302777777777777 +52,18.46590805,1,2,2,1,42195,2,15120,45,1,2.7906746031746033,4.2 +41,31.45643044,0,2,3,2,42195,2,17623,42,0,2.3943142484253532,4.895277777777777 +31,23.64955711,1,2,1,1,42195,4,13230,50,1,3.189342403628118,3.675 +33,25.96857071,0,2,3,2,42195,3,12540,40,0,3.3648325358851676,3.4833333333333334 +70,20.48413086,1,2,2,2,42195,3,16691,48,1,2.5280091067042116,4.636388888888889 +26,25.04382706,0,2,2,1,42195,4,12000,40,0,3.51625,3.3333333333333335 +70,26.42340279,0,1,3,2,42195,3,17340,35,1,2.4333910034602075,4.816666666666666 +47,22.16610718,0,2,2,1,42195,3,12265,55,1,3.44027721157766,3.406944444444444 +47,18.32382584,1,2,1,2,42195,4,12184,80,0,3.4631483913328958,3.3844444444444446 +35,21.94683647,1,2,1,3,42195,2,17870,30,0,2.3612199216564074,4.963888888888889 +28,18.75529671,0,1,2,1,42195,4,9742,75,1,4.331246150687744,2.7061111111111114 +33,22.0466156,0,2,3,1,42195,3,11055,35,1,3.8168249660786975,3.0708333333333333 +35,27.54821014,1,2,2,1,42195,3,22186,24,1,1.9018750563418372,6.1627777777777775 +31,19.97297096,1,2,3,2,42195,4,14307,42,0,2.949255609142378,3.9741666666666666 +48,20.41903305,1,2,3,3,42195,3,11777,56,1,3.582830941665959,3.2713888888888887 +43,18.28758621,0,1,3,2,42195,2,15243,49,0,2.76815587482779,4.234166666666667 +42,22.03365898,1,2,2,1,42195,2,12619,38,1,3.3437673349710755,3.5052777777777777 +56,24.48979568,0,2,1,1,42195,4,16440,35,1,2.5666058394160585,4.566666666666666 +60,20.92764473,0,2,3,1,42195,2,17880,40,0,2.3598993288590604,4.966666666666667 +60,27.55586243,0,1,2,1,42195,3,17520,33,0,2.408390410958904,4.866666666666666 +35,22.19460106,1,2,2,1,42195,3,13127,50,1,3.2143673345014094,3.6463888888888887 +40,23.84960938,0,1,2,1,42195,3,11100,55,1,3.8013513513513515,3.0833333333333335 +44,24.5955925,1,2,3,1,42195,2,14400,40,1,2.9302083333333333,4 +30,21.30681801,1,2,2,2,42195,3,14043,34,1,3.0046998504593034,3.9008333333333334 +31,24.55106735,0,2,2,3,42195,4,13321,50,0,3.167554988364237,3.700277777777778 +30,24.18745041,1,2,2,1,42195,2,11940,65,1,3.5339195979899496,3.316666666666667 +27,20.91937065,0,2,1,1,42195,3,9665,85,0,4.365752715985515,2.6847222222222222 +45,25.79951668,1,2,2,1,42195,3,17340,34,0,2.4333910034602075,4.816666666666666 +43,22.50635719,0,2,1,1,42195,4,12274,52,1,3.437754603226332,3.4094444444444445 +47,25.04382706,1,2,1,1,42195,3,15660,40,0,2.6944444444444446,4.35 +28,24.04452515,0,2,1,1,42195,3,13378,41,1,3.1540589026760353,3.716111111111111 +39,26.41929436,0,1,1,1,42195,4,13520,55,0,3.1209319526627217,3.7555555555555555 +45,23.5923233,0,2,1,1,42195,3,11040,55,0,3.8220108695652173,3.066666666666667 +30,22.44668961,0,2,1,2,42195,3,13200,30,1,3.1965909090909093,3.6666666666666665 +43,25.97402573,0,2,1,3,42195,3,14220,36,0,2.967299578059072,3.95 +34,23.37423897,1,2,3,2,42195,2,12070,60,0,3.495857497928749,3.3527777777777774 +29,20.522686,1,2,2,1,42195,2,13326,31,0,3.1663665015758666,3.7016666666666667 +30,22.51829529,0,1,3,1,42195,3,13440,60,0,3.1395089285714284,3.7333333333333334 +27,20.15620995,1,2,3,1,42195,2,13328,42,0,3.165891356542617,3.7022222222222223 +35,25.27348328,0,2,2,1,42195,2,14354,35,1,2.939598718127351,3.987222222222222 +48,22.4551754,1,2,1,3,42195,2,18667,14,1,2.2604060641774253,5.185277777777778 +31,22.76068687,0,2,1,1,42195,3,12300,50,0,3.430487804878049,3.4166666666666665 +41,26.7320137,0,2,1,3,42195,2,13032,22,0,3.2377992633517496,3.6199999999999997 +28,21.49645615,0,2,1,2,42195,3,9363,71,1,4.506568407561679,2.6008333333333336 +53,23.37423897,0,2,3,1,42195,2,13321,47,0,3.167554988364237,3.700277777777778 +23,22.91344261,0,2,3,2,42195,2,17587,20,0,2.399215329504748,4.885277777777778 +33,22.35768318,0,1,2,2,42195,3,11467,78,0,3.6796895439086073,3.185277777777778 +44,20.86985588,1,2,1,1,42195,4,15458,50,0,2.7296545478069607,4.293888888888889 +32,24.48979568,0,2,3,1,42195,2,9787,83,0,4.311331357923777,2.718611111111111 +45,24.09897804,1,2,1,3,42195,2,17634,40,0,2.392820687308608,4.8983333333333325 +42,24.18745041,1,3,2,2,42195,2,17171,44,0,2.4573408654126143,4.769722222222223 +36,30.29488754,1,2,3,1,42195,3,16585,40,0,2.5441664154356345,4.606944444444445 +31,21.81818199,1,2,3,1,42195,4,14526,30,0,2.904791408508881,4.035 +34,21.74523163,0,2,2,1,42195,3,12180,50,0,3.4642857142857144,3.3833333333333333 +34,23.08344269,0,1,3,1,42195,2,12484,50,1,3.379926305671259,3.4677777777777776 +46,20.86985588,1,2,1,1,42195,2,15600,50,1,2.7048076923076922,4.333333333333333 +30,21.23309135,1,2,2,3,42195,3,15780,43,0,2.673954372623574,4.383333333333334 +37,23.27125931,1,2,2,2,42195,4,12826,50,1,3.289801964759083,3.562777777777778 +35,21.70465088,1,2,1,1,42195,3,13484,50,0,3.12926431326016,3.7455555555555553 +41,22.47685242,1,2,2,2,42195,4,17280,40,0,2.4418402777777777,4.8 +34,23.67722511,0,2,2,1,42195,3,13028,55,0,3.2387933681301813,3.618888888888889 +33,20.321558,0,2,1,1,42195,4,13450,50,0,3.137174721189591,3.736111111111111 +35,22.60793114,0,1,1,1,42195,4,9335,72,1,4.520085698982324,2.593055555555556 +26,19.79558945,1,2,2,1,42195,2,13523,48,1,3.120239591806552,3.7563888888888886 +40,25.37774658,0,2,2,1,42195,4,11691,55,1,3.609186553759302,3.2475 +41,22.90478325,1,2,1,1,42195,2,14940,35,1,2.82429718875502,4.15 +29,24.52615929,0,2,3,2,42195,2,14761,45,1,2.8585461689587426,4.100277777777778 +34,20.58569527,0,2,3,1,42195,2,14280,45,0,2.9548319327731094,3.966666666666667 +46,22.176784519999998,0,3,1,1,42195,2,12702,37,0,3.3219178082191783,3.5283333333333333 +33,21.49645615,0,2,1,1,42195,2,10527,52,0,4.008264462809917,2.9241666666666664 +25,22.19460106,1,1,2,1,42195,3,12495,38,1,3.376950780312125,3.470833333333333 +34,22.53944397,0,2,1,1,42195,2,11225,43,1,3.75902004454343,3.118055555555556 +34,21.74523163,1,2,1,2,42195,3,14050,50,1,3.003202846975089,3.9027777777777777 +35,30.5534687,0,2,1,2,42195,3,14264,17,0,2.9581463825014023,3.962222222222222 +45,25.24751663,0,2,1,1,42195,2,12882,40,1,3.275500698649278,3.578333333333333 +32,22.19567108,0,1,2,1,42195,2,10764,102,1,3.920011148272018,2.99 +36,23.16774559,1,2,2,1,42195,2,17101,60,1,2.4673995672767672,4.750277777777778 +36,25.6369915,0,2,2,2,42195,4,11580,55,0,3.643782383419689,3.216666666666667 +32,23.30609322,0,1,2,2,42195,3,15310,48,1,2.756041802743305,4.252777777777777 +35,24.37873268,1,2,1,2,42195,2,21290,37,1,1.9819163926726162,5.913888888888889 +39,22.44668961,0,2,3,3,42195,3,14161,50,0,2.979662453216581,3.9336111111111114 +32,23.78989792,0,2,3,1,42195,2,11384,75,1,3.7065179198875615,3.162222222222222 +28,17.5306797,1,1,1,2,42195,3,12180,60,0,3.4642857142857144,3.3833333333333333 +27,25.74573708,0,1,1,1,42195,4,11058,45,1,3.8157894736842106,3.0716666666666668 +24,20.77922058,0,2,3,2,42195,2,11951,50,1,3.530666889800017,3.3197222222222225 +24,20.77922058,0,2,3,1,42195,4,10448,55,1,4.038571975497703,2.902222222222222 +41,24.37873268,0,2,1,1,42195,4,14130,21,0,2.98619957537155,3.925 +28,20.9185257,0,1,1,2,42195,2,10717,63,1,3.9372025753475786,2.9769444444444444 +30,21.53769112,1,2,2,1,42195,4,12499,47,1,3.3758700696055683,3.4719444444444445 +45,23.49176788,0,2,1,2,42195,2,19200,40,1,2.19765625,5.333333333333333 +38,25.23191071,0,1,2,2,42195,4,11380,61,0,3.7078207381370825,3.161111111111111 +29,17.86459732,1,2,2,1,42195,2,14238,50,1,2.9635482511588704,3.955 +32,23.70815659,0,2,3,3,42195,3,10604,40,1,3.979158807996982,2.9455555555555555 +32,21.75764084,1,2,2,2,42195,3,12338,45,1,3.419922191603177,3.427222222222222 +34,18.36547279,1,2,3,3,42195,3,11040,70,1,3.8220108695652173,3.066666666666667 +28,21.59191895,0,2,3,1,42195,4,12180,57,1,3.4642857142857144,3.3833333333333333 +37,19.86567116,1,1,1,1,42195,3,11426,60,1,3.6928934010152283,3.173888888888889 +35,22.176784519999998,0,2,3,1,42195,3,10994,65,1,3.838002546843733,3.053888888888889 +33,25.82033348,0,2,3,1,42195,3,12581,18,0,3.3538669422144505,3.4947222222222223 +31,21.15354919,0,2,1,1,42195,3,10391,85,1,4.060725627947262,2.886388888888889 +43,25.95398712,0,2,1,1,42195,3,14820,65,0,2.847165991902834,4.116666666666666 +26,25.16318321,1,2,1,2,42195,3,11744,48,1,3.5928985013623977,3.262222222222222 +44,23.08344269,0,1,2,1,42195,2,12798,52,1,3.296999531176746,3.555 +24,17.87248611,0,2,1,1,42195,3,10577,75,1,3.989316441334972,2.9380555555555556 +36,26.61252975,0,1,2,1,42195,2,13560,20,0,3.1117256637168142,3.7666666666666666 +29,21.68908119,1,2,2,1,42195,2,14004,40,1,3.0130676949443016,3.89 +27,22.01950264,0,2,3,2,42195,3,12312,60,1,3.4271442495126707,3.42 +53,22.41249084,0,2,2,1,42195,3,13289,48,1,3.1751824817518246,3.6913888888888886 +33,22.44668961,0,2,2,1,42195,4,12480,52,0,3.3810096153846154,3.466666666666667 +21,21.97979736,0,2,2,1,42195,3,11580,50,1,3.643782383419689,3.216666666666667 +29,23.59925842,0,1,2,1,42195,2,10782,68,1,3.9134668892598774,2.9949999999999997 +28,25.23191071,0,1,3,1,42195,2,12964,60,0,3.2547824745448937,3.601111111111111 +32,31.38913918,0,2,1,1,42195,2,14896,60,1,2.8326396348012888,4.137777777777778 +46,25.96857071,0,2,2,1,42195,3,11433,60,1,3.6906323799527683,3.1758333333333337 +32,22.0347538,0,2,1,1,42195,4,14460,35,0,2.91804979253112,4.016666666666667 +30,20.98412895,0,2,2,2,42195,3,13200,31,1,3.1965909090909093,3.6666666666666665 +41,23.67722511,0,2,1,1,42195,3,15160,50,1,2.783311345646438,4.211111111111111 +33,24.50284004,1,2,2,1,42195,3,14822,40,0,2.8467818108217515,4.117222222222222 +44,23.74768066,0,1,1,1,42195,4,11680,50,1,3.612585616438356,3.2444444444444445 +35,23.82097435,1,2,1,2,42195,3,18010,40,0,2.3428650749583566,5.002777777777778 +34,25.53605843,0,2,3,2,42195,3,12900,55,1,3.2709302325581397,3.5833333333333335 +31,23.80480194,1,2,3,1,42195,3,14329,62,1,2.9447274757484823,3.980277777777778 +45,23.87511635,0,2,3,2,42195,3,12007,55,1,3.5142000499708503,3.335277777777778 +28,22.93917274,0,2,1,1,42195,3,15960,40,0,2.643796992481203,4.433333333333334 +25,23.64960861,1,1,2,1,42195,2,12355,65,1,3.415216511533792,3.4319444444444445 +35,23.24191475,0,2,1,1,42195,4,13260,50,0,3.182126696832579,3.683333333333333 +29,24.1929512,0,2,2,3,42195,4,12065,55,1,3.4973062577704104,3.351388888888889 +28,23.37423897,1,2,3,2,42195,3,13719,40,0,3.0756614913623443,3.8108333333333335 +44,23.56902504,0,1,3,1,42195,3,13779,55,1,3.062268669714783,3.8275 +45,28.55020332,0,2,2,3,42195,3,19740,55,0,2.1375379939209727,5.483333333333333 +43,23.90596962,0,1,3,2,42195,2,13242,62,1,3.1864521975532396,3.6783333333333332 +30,46.90821457,1,2,3,1,42195,3,18856,26,0,2.2377492575307594,5.237777777777778 +31,21.30681801,1,2,1,1,42195,2,14401,40,1,2.9300048607735576,4.000277777777778 +45,25.93618584,0,1,2,1,42195,3,12305,45,1,3.429093864282812,3.4180555555555556 +39,24.85795403,1,2,1,3,42195,3,13350,54,1,3.160674157303371,3.7083333333333335 +61,23.4375,0,2,2,1,42195,3,13811,65,0,3.0551734124972847,3.836388888888889 +39,23.74768066,0,2,2,1,42195,3,14400,50,1,2.9302083333333333,4 +30,21.86121559,1,2,3,2,42195,2,14040,38,0,3.0053418803418803,3.9 +38,19.6476059,0,2,1,1,42195,4,9888,65,1,4.267293689320389,2.746666666666667 +47,21.5194149,1,2,2,2,42195,3,17778,32,0,2.373439082011475,4.9383333333333335 +41,25.97402573,0,2,3,2,42195,3,14820,42,0,2.847165991902834,4.116666666666666 +39,27.1192646,1,2,2,1,42195,2,15420,40,1,2.7363813229571985,4.283333333333333 +27,25.89813232,0,1,3,2,42195,4,14278,45,0,2.955245832749685,3.966111111111111 +30,22.01950264,0,2,1,1,42195,3,12315,32,0,3.4263093788063337,3.4208333333333334 +36,23.82097435,1,2,3,1,42195,3,18120,40,0,2.3286423841059603,5.033333333333333 +57,23.98273849,0,2,2,1,42195,2,13067,68,0,3.229126807989592,3.629722222222222 +38,25.8121376,0,2,1,1,42195,4,14370,40,1,2.9363256784968685,3.9916666666666667 +26,26.37949944,1,2,1,1,42195,3,13874,50,0,3.041300273893614,3.8538888888888887 +41,27.45825768,0,2,3,1,42195,3,15570,30,0,2.710019267822736,4.325 +42,26.40168762,0,1,2,1,42195,3,12896,55,0,3.271944789081886,3.582222222222222 +42,19.9094696,0,1,2,1,42195,4,11311,55,1,3.730439395278932,3.141944444444445 +41,21.85183334,1,1,2,2,42195,3,15362,40,0,2.7467126676214035,4.267222222222222 +54,25.96887398,0,2,1,1,42195,3,15390,33,1,2.7417153996101367,4.275 +30,23.64960861,1,2,3,1,42195,2,15601,35,1,2.7046343183129284,4.333611111111111 +33,19.70556259,0,2,2,1,42195,4,9279,80,1,4.547365017782089,2.5775 +44,23.84960938,0,1,3,1,42195,2,11544,55,1,3.6551455301455302,3.2066666666666666 +39,20.88916206,1,1,1,1,42195,3,13110,55,1,3.2185354691075516,3.6416666666666666 +30,24.83164978,0,2,1,2,42195,4,12616,30,0,3.344562460367787,3.5044444444444447 +51,23.49176788,1,1,3,2,42195,2,13504,60,1,3.124629739336493,3.751111111111111 +40,20.3689785,1,2,3,2,42195,3,16097,45,0,2.6212958936447786,4.47138888888889 +66,21.5213356,0,1,2,1,42195,3,13332,55,0,3.164941494149415,3.703333333333333 +50,24.02800179,1,2,1,1,42195,3,14362,33,1,2.937961286728868,3.9894444444444446 +43,21.15354919,0,1,2,1,42195,3,18066,35,0,2.3356027897708405,5.0183333333333335 +35,24.48979568,0,2,3,2,42195,3,10788,58,1,3.911290322580645,2.996666666666667 +42,23.83880615,1,2,2,1,42195,2,14091,30,1,2.994464551841601,3.9141666666666666 +45,20.91937065,0,2,3,2,42195,3,10080,70,1,4.186011904761905,2.8 +52,24.85795403,1,2,1,1,42195,3,16200,65,0,2.60462962962963,4.5 +33,22.91344261,0,2,2,1,42195,4,10769,65,1,3.918191104095088,2.991388888888889 +33,20.58569527,0,2,3,1,42195,2,10491,50,1,4.022018873319989,2.9141666666666666 +52,26.16460609,0,1,2,1,42195,3,14406,45,0,2.928987921699292,4.001666666666667 +32,22.51829529,0,2,2,1,42195,3,10968,82,1,3.8471006564551424,3.046666666666667 +34,22.53944397,1,2,2,1,42195,2,12537,62,0,3.3656377123713805,3.4825 +41,22.02581596,0,2,2,1,42195,2,11752,44,1,3.5904526889040165,3.2644444444444445 +34,23.88304138,0,1,2,1,42195,4,12525,57,1,3.3688622754491018,3.4791666666666665 +33,25.24751663,0,1,3,1,42195,3,12344,40,0,3.4182598833441347,3.428888888888889 +57,21.85050583,0,2,1,2,42195,2,14282,50,0,2.9544181487186667,3.967222222222222 +37,23.51625824,0,2,3,1,42195,3,15851,34,1,2.6619771623241437,4.4030555555555555 +54,20.44668007,1,2,2,3,42195,2,14708,42,1,2.868846886048409,4.085555555555556 +58,23.82998085,0,2,2,2,42195,4,12420,58,1,3.3973429951690823,3.45 +37,27.07126808,0,2,3,2,42195,3,13412,45,1,3.1460632269609303,3.7255555555555557 +56,30.86419868,0,1,2,2,42195,2,19980,40,0,2.1118618618618616,5.55 +37,18.83348274,0,1,2,1,42195,2,8290,140,1,5.089867310012063,2.3027777777777776 +31,25.87862206,1,2,2,1,42195,2,15591,50,1,2.706369059072542,4.3308333333333335 +42,28.05194664,0,2,3,2,42195,3,14480,35,0,2.914019337016575,4.022222222222222 +29,20.95170403,1,2,3,3,42195,4,11972,50,1,3.5244737721349817,3.3255555555555554 +32,22.2054863,1,2,2,1,42195,3,13149,45,1,3.2089892767510837,3.6525000000000003 +31,29.0236969,0,2,2,3,42195,3,14598,20,1,2.890464447184546,4.055000000000001 +44,25.16514397,0,2,2,3,42195,4,13628,35,1,3.0961990020545933,3.7855555555555553 +34,19.04384041,0,1,3,1,42195,3,10377,100,0,4.0662041052327265,2.8825 +40,23.5923233,0,2,3,3,42195,3,11970,50,1,3.525062656641604,3.325 +25,22.03365898,1,2,1,1,42195,3,15301,53,0,2.757662897849814,4.250277777777778 +28,23.64960861,1,2,1,1,42195,4,16586,45,0,2.5440130230314724,4.607222222222222 +23,21.40518761,0,2,3,1,42195,4,11989,60,1,3.5194761865042956,3.330277777777778 +48,21.46464729,0,2,1,1,42195,3,12477,35,0,3.381822553498437,3.4658333333333333 +36,24.44100571,0,2,3,1,42195,4,13022,50,0,3.240285670403932,3.6172222222222223 +49,20.9185257,1,2,2,2,42195,4,14506,52,0,2.908796360126844,4.029444444444445 +26,27.19061852,0,2,2,2,42195,3,15360,35,0,2.7470703125,4.266666666666667 +32,24.0484848,0,2,2,1,42195,2,14127,45,0,2.9868337226587385,3.9241666666666664 +34,26.93602943,0,2,1,2,42195,2,9694,72,1,4.352692387043532,2.6927777777777777 +57,23.74768066,0,2,3,1,42195,2,17100,45,0,2.4675438596491226,4.75 +27,23.14814949,0,2,2,2,42195,4,11971,40,0,3.524768189791997,3.325277777777778 +33,24.8768692,0,1,3,1,42195,2,15338,35,0,2.7510105620028686,4.260555555555555 +44,24.32528305,1,2,2,1,42195,2,12543,60,1,3.364027744558718,3.484166666666667 +30,18.53243256,1,2,2,1,42195,2,14119,41,1,2.9885260995821232,3.9219444444444442 +31,23.74768066,1,2,3,2,42195,4,19343,32,0,2.181409295352324,5.373055555555555 +30,25.97402573,0,2,1,1,42195,3,11310,45,0,3.730769230769231,3.1416666666666666 +33,21.89049911,1,2,2,1,42195,2,12862,61,1,3.2805939978230447,3.572777777777778 +30,24.93506622,1,2,3,1,42195,2,16700,42,1,2.5266467065868263,4.638888888888888 +36,24.55106735,0,2,1,1,42195,2,11580,56,1,3.643782383419689,3.216666666666667 +49,20.91937065,1,1,1,1,42195,3,17520,38,0,2.408390410958904,4.866666666666666 +42,24.85058212,0,2,3,2,42195,3,13630,60,1,3.095744680851064,3.786111111111111 +32,22.72727203,0,3,1,1,42195,2,15000,30,0,2.813,4.166666666666667 +36,25.54157829,1,2,2,2,42195,3,15338,60,0,2.7510105620028686,4.260555555555555 +27,20.92425156,1,2,3,2,42195,3,13170,50,0,3.203872437357631,3.658333333333333 +30,22.01950264,1,2,1,1,42195,3,12337,55,1,3.4201994001783254,3.4269444444444446 +42,27.4961338,0,2,3,2,42195,3,13195,42,1,3.197802197802198,3.6652777777777774 +62,24.56541252,0,2,1,1,42195,3,17607,42,0,2.396490032373488,4.890833333333333 +31,19.97483444,1,2,1,1,42195,2,11302,80,0,3.7334100159263848,3.1394444444444445 +46,21.89049911,1,2,2,1,42195,3,13812,35,1,3.054952215464813,3.8366666666666664 +45,22.36208534,0,2,3,2,42195,2,11970,55,1,3.525062656641604,3.325 +28,21.60493851,0,2,1,1,42195,2,14392,34,0,2.9318371317398553,3.997777777777778 +25,19.70114517,1,1,3,1,42195,3,17940,42,1,2.3520066889632107,4.983333333333333 +35,24.34137344,0,2,3,1,42195,3,12055,30,0,3.5002073828287017,3.348611111111111 +23,23.27775955,1,2,2,1,42195,3,15660,18,0,2.6944444444444446,4.35 +30,24.48979568,0,2,2,1,42195,2,16110,45,0,2.6191806331471135,4.475 +44,24.23761749,0,2,3,1,42195,2,12289,63,1,3.433558466921637,3.413611111111111 +34,21.24975014,0,2,3,1,42195,3,12602,32,0,3.3482780511029997,3.5005555555555556 +41,25.20478821,0,2,1,1,42195,2,13500,20,1,3.1255555555555556,3.75 diff --git a/materials/python/py_worksheet_regression1/img/k-nn.jpeg b/materials/python/py_worksheet_regression1/img/k-nn.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ff6acb33e2b2529509286e263e3b4defb9804996 GIT binary patch literal 24188 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 literal 0 HcmV?d00001 diff --git a/materials/python/py_worksheet_regression1/img/k-nn_RMSE.jpeg b/materials/python/py_worksheet_regression1/img/k-nn_RMSE.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..306d7ba8c2aa29a9c4de1613bb75f6cdb46cb230 GIT binary patch literal 24991 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 H+3 {points: 1}\n", + "\n", + "To predict a value of $Y$ for a new observation using $k$-nn **regression**, we identify the $k$-nearest neighbours and then:\n", + "\n", + "A. Assign it the median of the $k$-nearest neighbours as the predicted value\n", + "\n", + "B. Assign it the mean of the $k$-nearest neighbours as the predicted value\n", + "\n", + "C. Assign it the mode of the $k$-nearest neighbours as the predicted value\n", + "\n", + "D. Assign it the majority vote of the $k$-nearest neighbours as the predicted value\n", + "\n", + "*Save the letter of the answer you think is correct to a variable named `answer0_0`. Make sure your answer is an uppercase letter and is surrounded by quotation marks (e.g. `\"F\"`).*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "be09c84e9423c2fde7de7f9a7ff062d0", + "grade": false, + "grade_id": "cell-108236d99368cc44", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "# your code here\n", + "raise NotImplementedError" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "196f9498c8e1fa3993dc7cd3bef7bdfa", + "grade": true, + "grade_id": "cell-7d5938e33a38edeb", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(answer0_0)).encode(\"utf-8\")+b\"dcefd\").hexdigest() == \"3e545b3f6befc9fb348e77db7f2040e82e9bcbb7\", \"type of answer0_0 is not str. answer0_0 should be an str\"\n", + "assert sha1(str(len(answer0_0)).encode(\"utf-8\")+b\"dcefd\").hexdigest() == \"107f1edd22c2860f5c219827900a4ddae78b3686\", \"length of answer0_0 is not correct\"\n", + "assert sha1(str(answer0_0.lower()).encode(\"utf-8\")+b\"dcefd\").hexdigest() == \"d18bedfe24fae0dd4438932704ba3bd5d6bd4f7d\", \"value of answer0_0 is not correct\"\n", + "assert sha1(str(answer0_0).encode(\"utf-8\")+b\"dcefd\").hexdigest() == \"0216e5aab479cd7c4e52506d6e7a964513305bd0\", \"correct string value of answer0_0 but incorrect case of letters\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "cb44f1b9b4de90f4fc22579922dfb503", + "grade": false, + "grade_id": "cell-b0f4fa2237ef0429", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "**Question 0.1**\n", + "
{points: 1}\n", + "\n", + "Of those shown below, which is the correct formula for root mean squared error (RMSE)?\n", + "\n", + "\n", + "A. $\\text{RMSE} = \\sqrt{\\frac{\\frac{1}{n}\\sum\\limits_{i=1}^{n}(y_i - \\hat{y_i})^2}{1 - n}}$\n", + "\n", + "B. $\\text{RMSE} = \\sqrt{\\frac{1}{n - 1}\\sum\\limits_{i=1}^{n}(y_i - \\hat{y_i})^2}$\n", + "\n", + "C. $\\text{RMSE} = \\sqrt{\\frac{1}{n}\\sum\\limits_{i=1}^{n}(y_i - \\hat{y_i})^2}$\n", + "\n", + "D. $\\text{RMSE} = \\sqrt{\\frac{1}{n}\\sum\\limits_{i=1}^{n}(y_i - \\hat{y_i})}$ \n", + "\n", + "*Save the letter of your answer to a variable named `answer0_1`. Make sure you put quotations around the letter and pay attention to case.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "3fa947ab2ac171de2a28b1fcf66500d4", + "grade": false, + "grade_id": "cell-93c565d6974de38f", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [], + "source": [ + "# your code here\n", + "raise NotImplementedError" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "b041d365dc46fd683b0199446176082d", + "grade": true, + "grade_id": "cell-b1e66491132c1e30", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(answer0_1)).encode(\"utf-8\")+b\"82a97\").hexdigest() == \"8034346fc04a5025158904e93a65069d5c375995\", \"type of answer0_1 is not str. answer0_1 should be an str\"\n", + "assert sha1(str(len(answer0_1)).encode(\"utf-8\")+b\"82a97\").hexdigest() == \"02e678e6143abd600cc82e54ead4bfcce627447a\", \"length of answer0_1 is not correct\"\n", + "assert sha1(str(answer0_1.lower()).encode(\"utf-8\")+b\"82a97\").hexdigest() == \"5a991875efd2d67dd30497913cec9d6815947ddb\", \"value of answer0_1 is not correct\"\n", + "assert sha1(str(answer0_1).encode(\"utf-8\")+b\"82a97\").hexdigest() == \"5569bf5f052c87e8c7cd2a4d785524460f47f063\", \"correct string value of answer0_1 but incorrect case of letters\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "247617d4518ef89461e9e157503fac43", + "grade": false, + "grade_id": "cell-ded5f8fa4e621b81", + "locked": true, + "schema_version": 3, + "solution": false + } + }, + "source": [ + "**Question 0.2**\n", + "
{points: 1}\n", + "\n", + "The plot below is a very simple k-nn regression example, where the black dots are the data observations and the blue line is the predictions from a $k$-nn regression model created from this data where $k=2$.\n", + "\n", + "Using the formula for root mean squared error (given in the reading), and the graph below, by hand (pen and paper or use Python as a calculator) calculate the RMSE for this model. **Use one decimal place of precision when inputting the heights of the black dots and blue line.** \n", + "\n", + "*Save your answer to a variable named `answer0_2`*\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "712a52037eb11184818103e9f607d13f", + "grade": false, + "grade_id": "cell-8dc7cc6f35de80cb", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "# your code here\n", + "raise NotImplementedError\n", + "answer0_2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "c122761b2395145165c7eb301812f63e", + "grade": true, + "grade_id": "cell-d90b3e7b890ce86b", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(answer0_2)).encode(\"utf-8\")+b\"9d38\").hexdigest() == \"c0b304c132611ac0be94212d5146aa2739e79ad4\", \"type of answer0_2 is not float. Please make sure it is float and not np.float64, etc. You can cast your value into a float using float()\"\n", + "assert sha1(str(round(answer0_2, 2)).encode(\"utf-8\")+b\"9d38\").hexdigest() == \"eab9ae8ad2853bc4d5efb3425bdbfdc76c159788\", \"value of answer0_2 is not correct (rounded to 2 decimal places)\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "7d5cd1229dfed0d018c205a39336ef31", + "grade": false, + "grade_id": "cell-73d7913554df0781", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "### RMSPE Definition\n", + "\n", + "**Question 0.3** \n", + "
{points: 1}\n", + "\n", + "What does RMSPE stand for?\n", + "\n", + "\n", + "A. root mean squared prediction error\n", + "\n", + "B. root mean squared percentage error \n", + "\n", + "C. root mean squared performance error \n", + "\n", + "D. root mean squared preference error \n", + "\n", + "*Save the letter of your answer to a variable named `answer0_3`. Make sure you put quotations around the letter and pay attention to case.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "1c552fb5d4f17448f4ef16ff47bfd1de", + "grade": false, + "grade_id": "cell-81be027da315cb3f", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [], + "source": [ + "# your code here\n", + "raise NotImplementedError" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "771afb65ff573741b15a19bc7d76127b", + "grade": true, + "grade_id": "cell-db93265fd197f97f", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(answer0_3)).encode(\"utf-8\")+b\"f2e56\").hexdigest() == \"e0e3861cc1a9c49bc790d0703a0dd263658dc787\", \"type of answer0_3 is not str. answer0_3 should be an str\"\n", + "assert sha1(str(len(answer0_3)).encode(\"utf-8\")+b\"f2e56\").hexdigest() == \"8b78fbb97c9ee09546aa0db2de1f4263070d5862\", \"length of answer0_3 is not correct\"\n", + "assert sha1(str(answer0_3.lower()).encode(\"utf-8\")+b\"f2e56\").hexdigest() == \"5f538c8284b8b92db3481e4375f87b845b2de71a\", \"value of answer0_3 is not correct\"\n", + "assert sha1(str(answer0_3).encode(\"utf-8\")+b\"f2e56\").hexdigest() == \"23c3ba2158d8138f6a21d62ba550932d6534229a\", \"correct string value of answer0_3 but incorrect case of letters\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "4d69f891ae2b08cee7906ae7f104890d", + "grade": false, + "grade_id": "cell-e612110169987c7b", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "## Marathon Training\n", + "\n", + "\n", + "\n", + "Source: https://media.giphy.com/media/nUN6InE2CodRm/giphy.gif\n", + "\n", + "What predicts which athletes will perform better than others? Specifically, we are interested in marathon runners, and looking at how the maximum distance ran per week (in miles) during race training predicts the time it takes a runner to finish the race. For this, we will be looking at the `marathon.csv` file in the `data/` folder." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "9ea30c1434a67e3876226cd543d43d4c", + "grade": false, + "grade_id": "cell-16d7d432c49c9e53", + "locked": true, + "schema_version": 3, + "solution": false + } + }, + "source": [ + "**Question 1.0** \n", + "
{points: 1}\n", + "\n", + "Load the data and assign it to an object called `marathon`. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "75aa40b2dc5eadc254c56f3ec9d4a9b5", + "grade": false, + "grade_id": "cell-5376dc2c39983258", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "# your code here\n", + "raise NotImplementedError\n", + "marathon" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "5d849a3973cfdae9723e4e7acf4a5df9", + "grade": true, + "grade_id": "cell-60554f6f6a56a16c", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(marathon is None)).encode(\"utf-8\")+b\"30457\").hexdigest() == \"26d5aef6e71dd1f2188f7132ba3c7c26c732d4db\", \"type of marathon is None is not bool. marathon is None should be a bool\"\n", + "assert sha1(str(marathon is None).encode(\"utf-8\")+b\"30457\").hexdigest() == \"598dc6a0d372aa6b4fab47451f4061e3c8d8d3ee\", \"boolean value of marathon is None is not correct\"\n", + "\n", + "assert sha1(str(type(marathon)).encode(\"utf-8\")+b\"30458\").hexdigest() == \"81b9d38b9594935ea28437a78a119c664b8e271a\", \"type of type(marathon) is not correct\"\n", + "\n", + "assert sha1(str(type(marathon.shape)).encode(\"utf-8\")+b\"30459\").hexdigest() == \"fc9069c39d96d09c086a2b82cb34971a576bcec5\", \"type of marathon.shape is not tuple. marathon.shape should be a tuple\"\n", + "assert sha1(str(len(marathon.shape)).encode(\"utf-8\")+b\"30459\").hexdigest() == \"619cbada2e7f2f961d90ed765b5d118334e79c30\", \"length of marathon.shape is not correct\"\n", + "assert sha1(str(sorted(map(str, marathon.shape))).encode(\"utf-8\")+b\"30459\").hexdigest() == \"efe8921e7ce06759f11980cddc7ae55db277e49c\", \"values of marathon.shape are not correct\"\n", + "assert sha1(str(marathon.shape).encode(\"utf-8\")+b\"30459\").hexdigest() == \"e3f7896715d8c8a8f7ada1fd2c5213c678367660\", \"order of elements of marathon.shape is not correct\"\n", + "\n", + "assert sha1(str(type(\"time_hrs\" in marathon.columns)).encode(\"utf-8\")+b\"3045a\").hexdigest() == \"3a3de902ed3e89879d57fc4eff706e656659352b\", \"type of \\\"time_hrs\\\" in marathon.columns is not bool. \\\"time_hrs\\\" in marathon.columns should be a bool\"\n", + "assert sha1(str(\"time_hrs\" in marathon.columns).encode(\"utf-8\")+b\"3045a\").hexdigest() == \"f7e1f0c320e623dd359e1bd60d7a2017c4aef608\", \"boolean value of \\\"time_hrs\\\" in marathon.columns is not correct\"\n", + "\n", + "assert sha1(str(type(\"max\" in marathon.columns)).encode(\"utf-8\")+b\"3045b\").hexdigest() == \"dcbf21f70e6bbc9a4f84d3f0c06f12d13aafa0ac\", \"type of \\\"max\\\" in marathon.columns is not bool. \\\"max\\\" in marathon.columns should be a bool\"\n", + "assert sha1(str(\"max\" in marathon.columns).encode(\"utf-8\")+b\"3045b\").hexdigest() == \"24b9f6b32bda0c76fd2aab9ff718c8c441f6a57b\", \"boolean value of \\\"max\\\" in marathon.columns is not correct\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "cf74db2f57c49f8935ab34dc3fcb8ea4", + "grade": false, + "grade_id": "cell-26802c14f46a4d8e", + "locked": true, + "schema_version": 3, + "solution": false + } + }, + "source": [ + "**Question 2.0**\n", + "
{points: 1}\n", + "\n", + "We want to predict race time (in hours) (`time_hrs`) given a particular value of maximum distance ran per week (in miles) during race training (`max`). Let's take a subset of size 50 individuals of our marathon data and assign it to an object called `marathon_50`. With this subset, plot a scatterplot (using `mark_circle`) to assess the relationship between these two variables. Put `time_hrs` on the y-axis and `max` on the x-axis. Discuss, with a classmate, the relationship between race time and maximum distance ran per week during training based on the scatterplot you create below. \n", + "\n", + "*Hint: To take a subset of your data you can use the `sample` function*\n", + "\n", + "*Assign your plot to an object called `answer2`.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "f6927f52ae154d8e6ea639d7893551b5", + "grade": false, + "grade_id": "cell-6fcfc6ca32883f4d", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "# ___ = ___.sample(___, random_state=300) # Do not change the random_state\n", + "\n", + "\n", + "# your code here\n", + "raise NotImplementedError\n", + "answer2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "70170a1a854e9230c3209422d010edd9", + "grade": true, + "grade_id": "cell-78ac50fb41cd9a86", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(answer2 is None)).encode(\"utf-8\")+b\"9767\").hexdigest() == \"c9f213a0f76bf1899a7c7ab41bd64020e00a5d8a\", \"type of answer2 is None is not bool. answer2 is None should be a bool\"\n", + "assert sha1(str(answer2 is None).encode(\"utf-8\")+b\"9767\").hexdigest() == \"07c6d302a12aea10f94ce4ac438ed8846da04ee4\", \"boolean value of answer2 is None is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_50.shape)).encode(\"utf-8\")+b\"9768\").hexdigest() == \"1dc6a7e0dc1faf456fc0a56183f1a383ab13ea95\", \"type of marathon_50.shape is not tuple. marathon_50.shape should be a tuple\"\n", + "assert sha1(str(len(marathon_50.shape)).encode(\"utf-8\")+b\"9768\").hexdigest() == \"2211b0a1f1461259f232290064bd4f32d781712d\", \"length of marathon_50.shape is not correct\"\n", + "assert sha1(str(sorted(map(str, marathon_50.shape))).encode(\"utf-8\")+b\"9768\").hexdigest() == \"2102806f043d7c36dcd6b39270f2bc3bf06645c2\", \"values of marathon_50.shape are not correct\"\n", + "assert sha1(str(marathon_50.shape).encode(\"utf-8\")+b\"9768\").hexdigest() == \"38fe5c44247a3db3a62933578c3250c807ac8a1c\", \"order of elements of marathon_50.shape is not correct\"\n", + "\n", + "assert sha1(str(type(answer2.data.equals(marathon_50))).encode(\"utf-8\")+b\"9769\").hexdigest() == \"4cf4607212e9a4c28c631904ff116572eab419e5\", \"type of answer2.data.equals(marathon_50) is not bool. answer2.data.equals(marathon_50) should be a bool\"\n", + "assert sha1(str(answer2.data.equals(marathon_50)).encode(\"utf-8\")+b\"9769\").hexdigest() == \"bbab45c34d4ff267cf8e57a05d36d09aa94cc953\", \"boolean value of answer2.data.equals(marathon_50) is not correct\"\n", + "\n", + "assert sha1(str(type(answer2.encoding.x['shorthand'])).encode(\"utf-8\")+b\"976a\").hexdigest() == \"839b1f6e497ebbed31fb8df0322b128a7b581e7b\", \"type of answer2.encoding.x['shorthand'] is not str. answer2.encoding.x['shorthand'] should be an str\"\n", + "assert sha1(str(len(answer2.encoding.x['shorthand'])).encode(\"utf-8\")+b\"976a\").hexdigest() == \"bbd3ee6c2cefcc8f64a4b15489f070e4e7360127\", \"length of answer2.encoding.x['shorthand'] is not correct\"\n", + "assert sha1(str(answer2.encoding.x['shorthand'].lower()).encode(\"utf-8\")+b\"976a\").hexdigest() == \"5488fa8c72460ec31da324fd60582d6a75e894ac\", \"value of answer2.encoding.x['shorthand'] is not correct\"\n", + "assert sha1(str(answer2.encoding.x['shorthand']).encode(\"utf-8\")+b\"976a\").hexdigest() == \"5488fa8c72460ec31da324fd60582d6a75e894ac\", \"correct string value of answer2.encoding.x['shorthand'] but incorrect case of letters\"\n", + "\n", + "assert sha1(str(type(answer2.encoding.y['shorthand'])).encode(\"utf-8\")+b\"976b\").hexdigest() == \"ad11bd6cff76d9856350485bf290e058bf89f9e0\", \"type of answer2.encoding.y['shorthand'] is not str. answer2.encoding.y['shorthand'] should be an str\"\n", + "assert sha1(str(len(answer2.encoding.y['shorthand'])).encode(\"utf-8\")+b\"976b\").hexdigest() == \"7e31068cc71027470db684645a245618ecc12f0b\", \"length of answer2.encoding.y['shorthand'] is not correct\"\n", + "assert sha1(str(answer2.encoding.y['shorthand'].lower()).encode(\"utf-8\")+b\"976b\").hexdigest() == \"afd8e5f4040c0e6a927a56dd3222c5cb14c29b23\", \"value of answer2.encoding.y['shorthand'] is not correct\"\n", + "assert sha1(str(answer2.encoding.y['shorthand']).encode(\"utf-8\")+b\"976b\").hexdigest() == \"afd8e5f4040c0e6a927a56dd3222c5cb14c29b23\", \"correct string value of answer2.encoding.y['shorthand'] but incorrect case of letters\"\n", + "\n", + "assert sha1(str(type(answer2.mark)).encode(\"utf-8\")+b\"976c\").hexdigest() == \"3623b4c339e9c6ee9fdc6fad96976a7d1a2d9557\", \"type of answer2.mark is not str. answer2.mark should be an str\"\n", + "assert sha1(str(len(answer2.mark)).encode(\"utf-8\")+b\"976c\").hexdigest() == \"77446053854ce07f9a468e3c4253ee227343be8c\", \"length of answer2.mark is not correct\"\n", + "assert sha1(str(answer2.mark.lower()).encode(\"utf-8\")+b\"976c\").hexdigest() == \"5b87400edb7ee707ab95967718e9b221d24e92e2\", \"value of answer2.mark is not correct\"\n", + "assert sha1(str(answer2.mark).encode(\"utf-8\")+b\"976c\").hexdigest() == \"5b87400edb7ee707ab95967718e9b221d24e92e2\", \"correct string value of answer2.mark but incorrect case of letters\"\n", + "\n", + "assert sha1(str(type(isinstance(answer2.encoding.x['title'], str))).encode(\"utf-8\")+b\"976d\").hexdigest() == \"851319552403a87bee34ca83d924c7a895eb0db0\", \"type of isinstance(answer2.encoding.x['title'], str) is not bool. isinstance(answer2.encoding.x['title'], str) should be a bool\"\n", + "assert sha1(str(isinstance(answer2.encoding.x['title'], str)).encode(\"utf-8\")+b\"976d\").hexdigest() == \"e82182bc48c146515fd8a30abc08ff860fa54ee5\", \"boolean value of isinstance(answer2.encoding.x['title'], str) is not correct\"\n", + "\n", + "assert sha1(str(type(isinstance(answer2.encoding.y['title'], str))).encode(\"utf-8\")+b\"976e\").hexdigest() == \"265762b7f33189b160c25ee74148700738439490\", \"type of isinstance(answer2.encoding.y['title'], str) is not bool. isinstance(answer2.encoding.y['title'], str) should be a bool\"\n", + "assert sha1(str(isinstance(answer2.encoding.y['title'], str)).encode(\"utf-8\")+b\"976e\").hexdigest() == \"8bb5960c415644b45508b0818b1eda7297426e4f\", \"boolean value of isinstance(answer2.encoding.y['title'], str) is not correct\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "14adf10f016a98d409cb390184406bf1", + "grade": false, + "grade_id": "cell-cbe9f9a5c4b7c264", + "locked": true, + "schema_version": 3, + "solution": false + } + }, + "source": [ + "**Question 3.0**\n", + "
{points: 1}\n", + "\n", + "Suppose we want to predict the race time for someone who ran a maximum distance of 100 miles per week during training. In the chart we created in the previous question, we can see that no one has run a maximum distance of exactly 100 miles per week. How can we predict with this data? We can use $k$-nn regression! To do this we get the $Y$ values (target/response variable) of the nearest $k$ values and then take their average and use that as the prediction. \n", + "\n", + "For this question perform $k$-nn regression manually to predict the race time based on the average value of the 4 runners (\"neighbors\") closest to running 100 miles per week during training.\n", + "\n", + "*Fill in the scaffolding below and assign your answer to an object named `answer3`.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "1b7ba4c5feb2b757a6defcb9e3d57969", + "grade": false, + "grade_id": "cell-51d4b16bee915d31", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "# Run this cell to see a visualization of the 4 nearest neighbours to 100 miles / week\n", + "\n", + "rule = alt.Chart().mark_rule().encode(x=alt.datum(100))\n", + "\n", + "lines = alt.Chart(\n", + " pd.DataFrame({\n", + " \"x\": [110, 104, 90, 86],\n", + " \"y\": [2.63, 2.8, 3.27, 2.44]\n", + " })\n", + ").mark_line(color=\"orange\", size=2).encode(\n", + " x=\"x\",\n", + " x2=alt.datum(100), # we use `x2` to set a constant second x-coordinate at 100 for all the lines\n", + " y=\"y\",\n", + ")\n", + "\n", + "lines + rule + answer2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "86d5852fe651b81170219fd15540a341", + "grade": false, + "grade_id": "cell-a8d1b15c312d9c3d", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "# ___ = (\n", + "# marathon_50\n", + "# .___(diff=(100 - ___).abs()) # Compute the absolute distance to 100 miles for each runner\n", + "# .___(4, ___)\n", + "# [___]\n", + "# .mean()\n", + "# )\n", + "\n", + "# your code here\n", + "raise NotImplementedError\n", + "answer3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "c4e027aac973e1db926ccf3ad0d4c320", + "grade": true, + "grade_id": "cell-af7afd4794001c7b", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(answer3)).encode(\"utf-8\")+b\"7bdb3\").hexdigest() == \"3a71bdfd3d857a0c621cb9c0eca46cd2d17f7a25\", \"type of answer3 is not correct\"\n", + "assert sha1(str(answer3).encode(\"utf-8\")+b\"7bdb3\").hexdigest() == \"37f5342ce74ffaa4f9a707df207bb80d2cfefc4f\", \"value of answer3 is not correct\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "b1f9aa206f133969fcff7bf2009bbd0e", + "grade": false, + "grade_id": "cell-0c2107e7f52efb3d", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "**Question 4.0**\n", + "
{points: 1}\n", + "\n", + "For this question, let's instead predict the race time based on the 2 closest neighbors to the 100 miles per week during training.\n", + "\n", + "*Assign your answer to an object named `answer4`.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "ddca56a9ac218b2e4309e74065c8a0f6", + "grade": false, + "grade_id": "cell-44994bbd299ff0d0", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "# your code here\n", + "raise NotImplementedError\n", + "answer4" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "5fe34271a3a9489dc5c7e440986c1ba0", + "grade": true, + "grade_id": "cell-690e322810064165", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(answer4)).encode(\"utf-8\")+b\"91a96\").hexdigest() == \"56be2360e19074080ea1ee864973930e01b1feb8\", \"type of answer4 is not correct\"\n", + "assert sha1(str(answer4).encode(\"utf-8\")+b\"91a96\").hexdigest() == \"d87f739886a2763fa87919ecfd5616a4cc832881\", \"value of answer4 is not correct\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "a5edd599a336ceeb48bfe12280c7e05b", + "grade": false, + "grade_id": "cell-3311ba44befa3767", + "locked": true, + "schema_version": 3, + "solution": false + } + }, + "source": [ + "**Question 5.0**\n", + "
{points: 1}\n", + "\n", + "So far you have calculated the $k$ nearest neighbors predictions manually based on values of $k$ we have told you to use. However, last week we learned how to use a better method to choose the best $k$ for classification. \n", + "\n", + "Based on what you learned last week and what you have learned about $k$-nn regression so far this week, which method would you use to choose the $k$ (in the situation where we don't tell you which $k$ to use)?\n", + "\n", + "- A) Choose the $k$ that excludes most outliers\n", + "- B) Choose the $k$ with the lowest training error\n", + "- C) Choose the $k$ with the lowest cross-validation error\n", + "- D) Choose the $k$ that includes the most data points\n", + "- E) Choose the $k$ with the lowest testing error\n", + "\n", + "*Assign your answer to an object called `answer5`. Make sure your answer is an uppercase letter and is surrounded by quotation marks (e.g. `\"F\"`).*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "a11647b32fa9749c8e9821e17be507a0", + "grade": false, + "grade_id": "cell-01b498d6b1415bf5", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "# your code here\n", + "raise NotImplementedError\n", + "answer5" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "87c6d5b0c1a5d0ae1dfce9b0563d26bc", + "grade": true, + "grade_id": "cell-7cbe965dbdb7228d", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(answer5)).encode(\"utf-8\")+b\"37693\").hexdigest() == \"90111e24734de91c15169da5902a3788de0a8444\", \"type of answer5 is not str. answer5 should be an str\"\n", + "assert sha1(str(len(answer5)).encode(\"utf-8\")+b\"37693\").hexdigest() == \"fd218df3c1aeccee91b16c5edb3164742b012b62\", \"length of answer5 is not correct\"\n", + "assert sha1(str(answer5.lower()).encode(\"utf-8\")+b\"37693\").hexdigest() == \"4f99d9a8de2f5a0e124277c1be1e248dce2816c2\", \"value of answer5 is not correct\"\n", + "assert sha1(str(answer5).encode(\"utf-8\")+b\"37693\").hexdigest() == \"57eb3673a1f7ddb554643fa32e78e43ee5424edb\", \"correct string value of answer5 but incorrect case of letters\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "47f01e223f004b1f3c8ad26a8226b640", + "grade": false, + "grade_id": "cell-b3b34499fe540e49", + "locked": true, + "schema_version": 3, + "solution": false + } + }, + "source": [ + "**Question 6.0**\n", + "
{points: 1}\n", + "\n", + "We have just seen how to perform k-nn regression manually, now we will apply it to the whole dataset using the `scikit-learn` package. To do so, we will first need to create the training and test datasets. Split the data to use *75%* as your training set. Store the training data as `marathon_training` and the test set as `marathon_testing`. Remember we won't touch the test dataset until the end. \n", + "\n", + "Next, set the `time_hrs` column as the target (y) and `max` column as the input feature (X). Store the features as `X_train` and `X_test` and targets as `y_train` and `y_test` respectively for the `marathon_training` and `marathon_testing`. Remember that it is easier to work with input features as a data frame rather than a series, so make sure to extract the single input feature as a data frame by passing the column name inside a list.\n", + "\n", + "*Assign your answers to objects named `marathon_training`, `marathon_testing`, `X_train`, `y_train`, `X_test`, and `y_test`.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "a8490ade5d5c9723dbb01fbd6c3d9114", + "grade": false, + "grade_id": "cell-8257a9338314019e", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "# ___, ___ = train_test_split(\n", + "# ___,\n", + "# test_size=___,\n", + "# random_state=2000, # Do not change the random_state\n", + "# )\n", + "# X_train = ___[___] # A single column data frame\n", + "# y_train = ___[___] # A series\n", + "\n", + "# X_test = ___[___] # A single column data frame\n", + "# y_test = ___[___] # A series\n", + "\n", + "# your code here\n", + "raise NotImplementedError" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "3bfa3815e246669d44cd2b93f8f24f85", + "grade": true, + "grade_id": "cell-381c8aeacf15fd35", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(marathon_training is None)).encode(\"utf-8\")+b\"e7ecd\").hexdigest() == \"23389e9a6137f9af868ed3d5dcb5563fa02cf9ee\", \"type of marathon_training is None is not bool. marathon_training is None should be a bool\"\n", + "assert sha1(str(marathon_training is None).encode(\"utf-8\")+b\"e7ecd\").hexdigest() == \"a85ea51e13d13be27411312c98c5d8d08427748f\", \"boolean value of marathon_training is None is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_training.shape)).encode(\"utf-8\")+b\"e7ece\").hexdigest() == \"5c9a6007e66cd4aeb4e09f7e1fbad9430720c874\", \"type of marathon_training.shape is not tuple. marathon_training.shape should be a tuple\"\n", + "assert sha1(str(len(marathon_training.shape)).encode(\"utf-8\")+b\"e7ece\").hexdigest() == \"4371251b32814c5ec901659b3f7243b8f06201eb\", \"length of marathon_training.shape is not correct\"\n", + "assert sha1(str(sorted(map(str, marathon_training.shape))).encode(\"utf-8\")+b\"e7ece\").hexdigest() == \"8c5dccfad110d40e6e2dd0939e314507b72c82ba\", \"values of marathon_training.shape are not correct\"\n", + "assert sha1(str(marathon_training.shape).encode(\"utf-8\")+b\"e7ece\").hexdigest() == \"79b9d73983831ec1ad4b9a030e13f40e5e631303\", \"order of elements of marathon_training.shape is not correct\"\n", + "\n", + "assert sha1(str(type(sum(marathon_training.age))).encode(\"utf-8\")+b\"e7ecf\").hexdigest() == \"6dd9106e51faadb152c13f46748de9b7631041f4\", \"type of sum(marathon_training.age) is not int. Please make sure it is int and not np.int64, etc. You can cast your value into an int using int()\"\n", + "assert sha1(str(sum(marathon_training.age)).encode(\"utf-8\")+b\"e7ecf\").hexdigest() == \"2e875c992a00e64a049679c247546552107e4806\", \"value of sum(marathon_training.age) is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_testing is None)).encode(\"utf-8\")+b\"e7ed0\").hexdigest() == \"eeab11eee8b5ac43daead049c08370a1d6bd29e1\", \"type of marathon_testing is None is not bool. marathon_testing is None should be a bool\"\n", + "assert sha1(str(marathon_testing is None).encode(\"utf-8\")+b\"e7ed0\").hexdigest() == \"45fc996440f56862fa729a598efb3e94ad2cbcba\", \"boolean value of marathon_testing is None is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_testing.shape)).encode(\"utf-8\")+b\"e7ed1\").hexdigest() == \"580e794a2ad10c9c374bc994cb416f4825c1abc2\", \"type of marathon_testing.shape is not tuple. marathon_testing.shape should be a tuple\"\n", + "assert sha1(str(len(marathon_testing.shape)).encode(\"utf-8\")+b\"e7ed1\").hexdigest() == \"0cfe48ec1593a68181d07cf5f9f1868014b33c5f\", \"length of marathon_testing.shape is not correct\"\n", + "assert sha1(str(sorted(map(str, marathon_testing.shape))).encode(\"utf-8\")+b\"e7ed1\").hexdigest() == \"cce555187808a48e1408af0bb536e79e8a2225a5\", \"values of marathon_testing.shape are not correct\"\n", + "assert sha1(str(marathon_testing.shape).encode(\"utf-8\")+b\"e7ed1\").hexdigest() == \"fbf8329576ea0be968fbabcd4c5dd25a6d17c93a\", \"order of elements of marathon_testing.shape is not correct\"\n", + "\n", + "assert sha1(str(type(sum(marathon_testing.age))).encode(\"utf-8\")+b\"e7ed2\").hexdigest() == \"3d8e616c9608ebb5fa199e74614b680d59572017\", \"type of sum(marathon_testing.age) is not int. Please make sure it is int and not np.int64, etc. You can cast your value into an int using int()\"\n", + "assert sha1(str(sum(marathon_testing.age)).encode(\"utf-8\")+b\"e7ed2\").hexdigest() == \"a666611338ec9b1d7c1df5146282bf710f1d54f6\", \"value of sum(marathon_testing.age) is not correct\"\n", + "\n", + "assert sha1(str(type(X_train.columns.values)).encode(\"utf-8\")+b\"e7ed3\").hexdigest() == \"d2af8b1f3ac36ff6af2a760a8b5cfa0388a5a272\", \"type of X_train.columns.values is not correct\"\n", + "assert sha1(str(X_train.columns.values).encode(\"utf-8\")+b\"e7ed3\").hexdigest() == \"17be56c6e47e3d10712619e99b61a6d767fd5666\", \"value of X_train.columns.values is not correct\"\n", + "\n", + "assert sha1(str(type(X_train.shape)).encode(\"utf-8\")+b\"e7ed4\").hexdigest() == \"414b7eb138475c852d35f49fc6d280cb0f9a2a9f\", \"type of X_train.shape is not tuple. X_train.shape should be a tuple\"\n", + "assert sha1(str(len(X_train.shape)).encode(\"utf-8\")+b\"e7ed4\").hexdigest() == \"73a0b26b8110b3197945c70b0650286285cec8d3\", \"length of X_train.shape is not correct\"\n", + "assert sha1(str(sorted(map(str, X_train.shape))).encode(\"utf-8\")+b\"e7ed4\").hexdigest() == \"d74001495311d9550e27e96f7c560f5ed899dc2a\", \"values of X_train.shape are not correct\"\n", + "assert sha1(str(X_train.shape).encode(\"utf-8\")+b\"e7ed4\").hexdigest() == \"f434b7539cfe664a9765b7bbb07e4709fc2491da\", \"order of elements of X_train.shape is not correct\"\n", + "\n", + "assert sha1(str(type(y_train.name)).encode(\"utf-8\")+b\"e7ed5\").hexdigest() == \"07fb7ee407cccab8c19809282e20aecb7bb62185\", \"type of y_train.name is not str. y_train.name should be an str\"\n", + "assert sha1(str(len(y_train.name)).encode(\"utf-8\")+b\"e7ed5\").hexdigest() == \"c159bd913e413006f4be6da2dfb303dd974e4bbb\", \"length of y_train.name is not correct\"\n", + "assert sha1(str(y_train.name.lower()).encode(\"utf-8\")+b\"e7ed5\").hexdigest() == \"a622136689ba01beab477abec3b4b37aa5e2f515\", \"value of y_train.name is not correct\"\n", + "assert sha1(str(y_train.name).encode(\"utf-8\")+b\"e7ed5\").hexdigest() == \"a622136689ba01beab477abec3b4b37aa5e2f515\", \"correct string value of y_train.name but incorrect case of letters\"\n", + "\n", + "assert sha1(str(type(y_train.shape)).encode(\"utf-8\")+b\"e7ed6\").hexdigest() == \"22627a8f279315114f3a5f91de95da0d83389d79\", \"type of y_train.shape is not tuple. y_train.shape should be a tuple\"\n", + "assert sha1(str(len(y_train.shape)).encode(\"utf-8\")+b\"e7ed6\").hexdigest() == \"c61d6dd0518678d74f5f69117e206324490517c6\", \"length of y_train.shape is not correct\"\n", + "assert sha1(str(sorted(map(str, y_train.shape))).encode(\"utf-8\")+b\"e7ed6\").hexdigest() == \"775174c861c6ab54c4c08abf24b2bfebdb30af3f\", \"values of y_train.shape are not correct\"\n", + "assert sha1(str(y_train.shape).encode(\"utf-8\")+b\"e7ed6\").hexdigest() == \"cead78c49de35c73a190c737d2bb46ff4e2fec23\", \"order of elements of y_train.shape is not correct\"\n", + "\n", + "assert sha1(str(type(X_test.columns.values)).encode(\"utf-8\")+b\"e7ed7\").hexdigest() == \"22fe9ec90a423d6060f49aa6d7a76ce3d3974080\", \"type of X_test.columns.values is not correct\"\n", + "assert sha1(str(X_test.columns.values).encode(\"utf-8\")+b\"e7ed7\").hexdigest() == \"7754708b959b4274773a259f79fd376b28310eac\", \"value of X_test.columns.values is not correct\"\n", + "\n", + "assert sha1(str(type(X_test.shape)).encode(\"utf-8\")+b\"e7ed8\").hexdigest() == \"f0858d2513b6eee63f326fcebe57b013cd31df36\", \"type of X_test.shape is not tuple. X_test.shape should be a tuple\"\n", + "assert sha1(str(len(X_test.shape)).encode(\"utf-8\")+b\"e7ed8\").hexdigest() == \"bd7fc6f3096017ac86fb06841d97ddd854492ed0\", \"length of X_test.shape is not correct\"\n", + "assert sha1(str(sorted(map(str, X_test.shape))).encode(\"utf-8\")+b\"e7ed8\").hexdigest() == \"ef154c5dedbd48b6b6a3232c68a2fea5c9f7be4b\", \"values of X_test.shape are not correct\"\n", + "assert sha1(str(X_test.shape).encode(\"utf-8\")+b\"e7ed8\").hexdigest() == \"3a6cfb0fce7e27384ffd615b58fb5cbd20a3d82b\", \"order of elements of X_test.shape is not correct\"\n", + "\n", + "assert sha1(str(type(y_test.name)).encode(\"utf-8\")+b\"e7ed9\").hexdigest() == \"72df4c655d030df71555b431f22397a7e42c0e38\", \"type of y_test.name is not str. y_test.name should be an str\"\n", + "assert sha1(str(len(y_test.name)).encode(\"utf-8\")+b\"e7ed9\").hexdigest() == \"f164546779f465e2b62365d3ab3737c47eebf4d6\", \"length of y_test.name is not correct\"\n", + "assert sha1(str(y_test.name.lower()).encode(\"utf-8\")+b\"e7ed9\").hexdigest() == \"3327e8ccb2ac8ed8cf1dad70018d6f95c820d712\", \"value of y_test.name is not correct\"\n", + "assert sha1(str(y_test.name).encode(\"utf-8\")+b\"e7ed9\").hexdigest() == \"3327e8ccb2ac8ed8cf1dad70018d6f95c820d712\", \"correct string value of y_test.name but incorrect case of letters\"\n", + "\n", + "assert sha1(str(type(y_test.shape)).encode(\"utf-8\")+b\"e7eda\").hexdigest() == \"3caf58a1ec02a722090ad103cb12c17948c05ea8\", \"type of y_test.shape is not tuple. y_test.shape should be a tuple\"\n", + "assert sha1(str(len(y_test.shape)).encode(\"utf-8\")+b\"e7eda\").hexdigest() == \"6bee5d9b7be7422e0080aec785993d4b1645979b\", \"length of y_test.shape is not correct\"\n", + "assert sha1(str(sorted(map(str, y_test.shape))).encode(\"utf-8\")+b\"e7eda\").hexdigest() == \"b4518ece20f13e8647767347afffe9dbd285baf1\", \"values of y_test.shape are not correct\"\n", + "assert sha1(str(y_test.shape).encode(\"utf-8\")+b\"e7eda\").hexdigest() == \"5ff9b39d3ce50b07b91aa77be609c2ec942f2dc3\", \"order of elements of y_test.shape is not correct\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "4fd00f6a0b76b2844119efa7bd675c38", + "grade": false, + "grade_id": "cell-0c01c0b6cf4d8e91", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "**Question 7.0**\n", + "
{points: 1}\n", + "\n", + "Next, we’ll use cross-validation on our **training data** to choose $k$. In $k$-nn classification, we used accuracy to see how well our predictions matched the true labels. In the context of $k$-nn *regression*, we will use RMSPE as the scoring instead. Interpreting the RMSPE value can be tricky but generally speaking, if the prediction values are very close to the true values, the RMSPE will be small. Conversely, if the prediction values are *not* very close to the true values, the RMSPE will be quite large. \n", + "\n", + "Let's perform a cross-validation and choose the optimal $k$!\n", + "\n", + "First, create a pipeline for $k$-nn. We are still using the $k$-nearest neighbours algorithm, and we will also use the `StandardScaler` to standardize the numerical values. Store your pipeline in an object called `marathon_pipe`. Finally, perform a cross-validation with 5 folds using the `cross_validate` function. Remember that since the `cross_validate` function always maximizes its \"score\", and here we're using RMSPE (lower is better!), we need to specify that we're using the *negative* RMSPE (`\"neg_root_mean_squared_error\"`).\n", + "\n", + "*Store the output of the cross validation as a data frame in an object called `marathon_cv`.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "19be30edec8b71b3601d0b24ada2cbb2", + "grade": false, + "grade_id": "cell-766f1e094dd32efc", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "# ___ = make_pipeline(\n", + "# ___,\n", + "# ___,\n", + "# )\n", + "#\n", + "# marathon_cv = pd.___(\n", + "# cross_validate(\n", + "# ___,\n", + "# ___,\n", + "# ___,\n", + "# scoring=___,\n", + "# return_train_score=True,\n", + "# )\n", + "# )\n", + "\n", + "# your code here\n", + "raise NotImplementedError\n", + "marathon_cv" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "26b793b9cc51d7c22794a39e849f68fc", + "grade": true, + "grade_id": "cell-289bc7a299c4f482", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(marathon_pipe is None)).encode(\"utf-8\")+b\"8864c\").hexdigest() == \"25299b052f7ab2931046737631887a8cc568dbdc\", \"type of marathon_pipe is None is not bool. marathon_pipe is None should be a bool\"\n", + "assert sha1(str(marathon_pipe is None).encode(\"utf-8\")+b\"8864c\").hexdigest() == \"e30f3e578a40c11694672cc29b9e8ed48e9b5b0a\", \"boolean value of marathon_pipe is None is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_pipe.steps[1][1].n_neighbors)).encode(\"utf-8\")+b\"8864d\").hexdigest() == \"d547f76ed04d14a405bffd75b858fcadc01626b2\", \"type of marathon_pipe.steps[1][1].n_neighbors is not int. Please make sure it is int and not np.int64, etc. You can cast your value into an int using int()\"\n", + "assert sha1(str(marathon_pipe.steps[1][1].n_neighbors).encode(\"utf-8\")+b\"8864d\").hexdigest() == \"06ffe53eaaff553f1311c56f2367fab086ff823e\", \"value of marathon_pipe.steps[1][1].n_neighbors is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_pipe.steps[1][1].weights)).encode(\"utf-8\")+b\"8864e\").hexdigest() == \"58751697270ec924b2f324e1b5544996472be14f\", \"type of marathon_pipe.steps[1][1].weights is not str. marathon_pipe.steps[1][1].weights should be an str\"\n", + "assert sha1(str(len(marathon_pipe.steps[1][1].weights)).encode(\"utf-8\")+b\"8864e\").hexdigest() == \"6cd5d1937d5b4571f3f6a7a4880af49e992de8a5\", \"length of marathon_pipe.steps[1][1].weights is not correct\"\n", + "assert sha1(str(marathon_pipe.steps[1][1].weights.lower()).encode(\"utf-8\")+b\"8864e\").hexdigest() == \"ab385b8efd1b981d6c0200273e19c124f3e24308\", \"value of marathon_pipe.steps[1][1].weights is not correct\"\n", + "assert sha1(str(marathon_pipe.steps[1][1].weights).encode(\"utf-8\")+b\"8864e\").hexdigest() == \"ab385b8efd1b981d6c0200273e19c124f3e24308\", \"correct string value of marathon_pipe.steps[1][1].weights but incorrect case of letters\"\n", + "\n", + "assert sha1(str(type(marathon_pipe.steps[0][1])).encode(\"utf-8\")+b\"8864f\").hexdigest() == \"974eac74a0ad1ee3ad51d33c86e4f23b9caac296\", \"type of marathon_pipe.steps[0][1] is not correct\"\n", + "assert sha1(str(marathon_pipe.steps[0][1]).encode(\"utf-8\")+b\"8864f\").hexdigest() == \"88499ff4e2ed2a47e400d341106fb5b49551ed08\", \"value of marathon_pipe.steps[0][1] is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_cv is None)).encode(\"utf-8\")+b\"88650\").hexdigest() == \"82c0b965cf5966540442e3581313923f152295a1\", \"type of marathon_cv is None is not bool. marathon_cv is None should be a bool\"\n", + "assert sha1(str(marathon_cv is None).encode(\"utf-8\")+b\"88650\").hexdigest() == \"e0832f10224a7c3b8fc8349d63cbcc366639d036\", \"boolean value of marathon_cv is None is not correct\"\n", + "\n", + "assert sha1(str(type(len(marathon_cv['train_score']))).encode(\"utf-8\")+b\"88651\").hexdigest() == \"2da35ca4faddbf2b4b47152b40d1fbb51614153a\", \"type of len(marathon_cv['train_score']) is not int. Please make sure it is int and not np.int64, etc. You can cast your value into an int using int()\"\n", + "assert sha1(str(len(marathon_cv['train_score'])).encode(\"utf-8\")+b\"88651\").hexdigest() == \"c03676f0aa4939eab9beb8cdd1e1ad156ceff2c0\", \"value of len(marathon_cv['train_score']) is not correct\"\n", + "\n", + "assert sha1(str(type(sum(marathon_cv['train_score']))).encode(\"utf-8\")+b\"88652\").hexdigest() == \"1f1dd6525f2a541022058c1c5c49ef08440be730\", \"type of sum(marathon_cv['train_score']) is not float. Please make sure it is float and not np.float64, etc. You can cast your value into a float using float()\"\n", + "assert sha1(str(round(sum(marathon_cv['train_score']), 2)).encode(\"utf-8\")+b\"88652\").hexdigest() == \"5839a4484a5996becf1142a0c824e072abf9ae74\", \"value of sum(marathon_cv['train_score']) is not correct (rounded to 2 decimal places)\"\n", + "\n", + "assert sha1(str(type(sum(marathon_cv['test_score']))).encode(\"utf-8\")+b\"88653\").hexdigest() == \"b2d3d500fa919b6f72c5a9bfbac6ddf39984c89e\", \"type of sum(marathon_cv['test_score']) is not float. Please make sure it is float and not np.float64, etc. You can cast your value into a float using float()\"\n", + "assert sha1(str(round(sum(marathon_cv['test_score']), 2)).encode(\"utf-8\")+b\"88653\").hexdigest() == \"ceafaaed8afb31ab587e60437edb7aee28aed3e5\", \"value of sum(marathon_cv['test_score']) is not correct (rounded to 2 decimal places)\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "26a0c5f4ee389ac76334c430fb49d6ab", + "grade": false, + "grade_id": "cell-7cd5193eecc27c30", + "locked": true, + "schema_version": 3, + "solution": false + } + }, + "source": [ + "**Question 8.0**\n", + "
{points: 1}\n", + "\n", + "The major difference compared to other models from Chapters 6 and 7 is that we are running a *regression* rather than a *classification*. Using `KNeighborsRegressor` essentially tells `scikit-learn` that we need to use different metrics (`neg_root_mean_squared_error` rather than accuracy) for tuning and evaluation. \n", + "\n", + "Now, let's use the `neg_root_mean_squared_error` to find the best setting for $k$ from our model. Let's test 200 values of $k$. \n", + "\n", + "First, create a parameter grid called `param_grid` that contains values of range 1 to 200. \n", + "\n", + "Next, tune your model such that it tests all the values in `range(1, 201, 1)` using `GridSearchCV` function with `cv=5` and `n_jobs=-1` and save the tuned model as `marathon_tuned`. Finally, fit the tuned model to the training dataset and save the `cv_results_` in a dataframe. \n", + "\n", + "*Assign your answer to an object called `marathon_results`.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "c31d761e4100b98b50b69cbec445cad9", + "grade": false, + "grade_id": "cell-8c7e7ded673d28ec", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "np.random.seed(2019) # DO NOT CHANGE\n", + "\n", + "# param_grid = _____\n", + "# marathon_tuned = GridSearchCV(___, ___, ___, ___, ___)\n", + "# marathon_results = pd.DataFrame(____.fit(____, ____).____) \n", + "\n", + "# your code here\n", + "raise NotImplementedError\n", + "marathon_results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "9d8c2145471357fcb872e0b617009f13", + "grade": true, + "grade_id": "cell-29d608ebfdd11366", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(param_grid is None)).encode(\"utf-8\")+b\"d182e\").hexdigest() == \"ec7bcbea68f702395cdd5e67180936ae258a3f3c\", \"type of param_grid is None is not bool. param_grid is None should be a bool\"\n", + "assert sha1(str(param_grid is None).encode(\"utf-8\")+b\"d182e\").hexdigest() == \"3cf3edd9eddd1b5c4500aa5b52869832b40083d9\", \"boolean value of param_grid is None is not correct\"\n", + "\n", + "assert sha1(str(type(param_grid)).encode(\"utf-8\")+b\"d182f\").hexdigest() == \"ace9aac86250e076a5706a6c94d179a856ffdd1e\", \"type of type(param_grid) is not correct\"\n", + "\n", + "assert sha1(str(type(\"kneighborsregressor__n_neighbors\" in param_grid)).encode(\"utf-8\")+b\"d1830\").hexdigest() == \"ff29e4faf0e45be91ef5484ace002565aebc17a8\", \"type of \\\"kneighborsregressor__n_neighbors\\\" in param_grid is not bool. \\\"kneighborsregressor__n_neighbors\\\" in param_grid should be a bool\"\n", + "assert sha1(str(\"kneighborsregressor__n_neighbors\" in param_grid).encode(\"utf-8\")+b\"d1830\").hexdigest() == \"423cc17212d6b16b3a09484a00636ed40da12d0c\", \"boolean value of \\\"kneighborsregressor__n_neighbors\\\" in param_grid is not correct\"\n", + "\n", + "assert sha1(str(type(sum(i for i in param_grid['kneighborsregressor__n_neighbors']))).encode(\"utf-8\")+b\"d1831\").hexdigest() == \"e79769dca25d75ac1efdfd501a1a3e50a1248982\", \"type of sum(i for i in param_grid['kneighborsregressor__n_neighbors']) is not int. Please make sure it is int and not np.int64, etc. You can cast your value into an int using int()\"\n", + "assert sha1(str(sum(i for i in param_grid['kneighborsregressor__n_neighbors'])).encode(\"utf-8\")+b\"d1831\").hexdigest() == \"3062f138a1709066561977581ee37b9da7187b8b\", \"value of sum(i for i in param_grid['kneighborsregressor__n_neighbors']) is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_tuned is None)).encode(\"utf-8\")+b\"d1832\").hexdigest() == \"9f763278e96c032f901645614bcc433e19b6da21\", \"type of marathon_tuned is None is not bool. marathon_tuned is None should be a bool\"\n", + "assert sha1(str(marathon_tuned is None).encode(\"utf-8\")+b\"d1832\").hexdigest() == \"802f7ddda999c610b46d5eefeaad353b41db1f11\", \"boolean value of marathon_tuned is None is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_tuned.n_splits_)).encode(\"utf-8\")+b\"d1833\").hexdigest() == \"4ae49a96c27611edbdc55e4b6a0acdb6a0f4e361\", \"type of marathon_tuned.n_splits_ is not int. Please make sure it is int and not np.int64, etc. You can cast your value into an int using int()\"\n", + "assert sha1(str(marathon_tuned.n_splits_).encode(\"utf-8\")+b\"d1833\").hexdigest() == \"03197f439ff046e0849de2e1ea68e5abf3a3227a\", \"value of marathon_tuned.n_splits_ is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_tuned.estimator[0])).encode(\"utf-8\")+b\"d1834\").hexdigest() == \"d6e10402eebb0cf168b578048a88cb545603e32a\", \"type of marathon_tuned.estimator[0] is not correct\"\n", + "assert sha1(str(marathon_tuned.estimator[0]).encode(\"utf-8\")+b\"d1834\").hexdigest() == \"f5465c5fbaa6f3239fc28a1ff25004895b6c5876\", \"value of marathon_tuned.estimator[0] is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_tuned.estimator[1])).encode(\"utf-8\")+b\"d1835\").hexdigest() == \"16467dbeabfbbbb3e3f104b63615a61965d962b2\", \"type of marathon_tuned.estimator[1] is not correct\"\n", + "assert sha1(str(marathon_tuned.estimator[1]).encode(\"utf-8\")+b\"d1835\").hexdigest() == \"bf022c71f2b7bd9757a0f4c333efd82fa9d5a235\", \"value of marathon_tuned.estimator[1] is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_tuned.param_grid == param_grid)).encode(\"utf-8\")+b\"d1836\").hexdigest() == \"576f7dc516eea23c2e820127a7892ceea3d0dab5\", \"type of marathon_tuned.param_grid == param_grid is not bool. marathon_tuned.param_grid == param_grid should be a bool\"\n", + "assert sha1(str(marathon_tuned.param_grid == param_grid).encode(\"utf-8\")+b\"d1836\").hexdigest() == \"681a7a81f3b2eb025a9461956a79a884370c9eed\", \"boolean value of marathon_tuned.param_grid == param_grid is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_results is None)).encode(\"utf-8\")+b\"d1837\").hexdigest() == \"8689f96913286ecd30d823e848b7eb97d738c848\", \"type of marathon_results is None is not bool. marathon_results is None should be a bool\"\n", + "assert sha1(str(marathon_results is None).encode(\"utf-8\")+b\"d1837\").hexdigest() == \"0d219c756c386807c0464fa0cee1b865a1200bac\", \"boolean value of marathon_results is None is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_results)).encode(\"utf-8\")+b\"d1838\").hexdigest() == \"18ba9e44f8dde45008fd1011b189d83f547d79f3\", \"type of type(marathon_results) is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_results.shape)).encode(\"utf-8\")+b\"d1839\").hexdigest() == \"21ab468813730121894ce75777b2e1fd48fdb5da\", \"type of marathon_results.shape is not tuple. marathon_results.shape should be a tuple\"\n", + "assert sha1(str(len(marathon_results.shape)).encode(\"utf-8\")+b\"d1839\").hexdigest() == \"ad46a3a70676d9eb487222097e1246978dd107a0\", \"length of marathon_results.shape is not correct\"\n", + "assert sha1(str(sorted(map(str, marathon_results.shape))).encode(\"utf-8\")+b\"d1839\").hexdigest() == \"702ab7880f169feb4a954839cfefe6ea051b42d1\", \"values of marathon_results.shape are not correct\"\n", + "assert sha1(str(marathon_results.shape).encode(\"utf-8\")+b\"d1839\").hexdigest() == \"ac943869f441904a6bb3e649e3086382f6496051\", \"order of elements of marathon_results.shape is not correct\"\n", + "\n", + "assert sha1(str(type(sum(marathon_results.param_kneighborsregressor__n_neighbors))).encode(\"utf-8\")+b\"d183a\").hexdigest() == \"46aa9236ef14c7d42d2b7d92052c5c94af6cab15\", \"type of sum(marathon_results.param_kneighborsregressor__n_neighbors) is not int. Please make sure it is int and not np.int64, etc. You can cast your value into an int using int()\"\n", + "assert sha1(str(sum(marathon_results.param_kneighborsregressor__n_neighbors)).encode(\"utf-8\")+b\"d183a\").hexdigest() == \"61a6b58502c1d2d00fb7a6a65c20cae775b189ff\", \"value of sum(marathon_results.param_kneighborsregressor__n_neighbors) is not correct\"\n", + "\n", + "assert sha1(str(type(sum(marathon_results.mean_test_score))).encode(\"utf-8\")+b\"d183b\").hexdigest() == \"eb6784ad9e0df0d3b20b0857d501db1797afe75c\", \"type of sum(marathon_results.mean_test_score) is not float. Please make sure it is float and not np.float64, etc. You can cast your value into a float using float()\"\n", + "assert sha1(str(round(sum(marathon_results.mean_test_score), 2)).encode(\"utf-8\")+b\"d183b\").hexdigest() == \"5c2e32ca9aacc4f5726277288252ac363fcd924d\", \"value of sum(marathon_results.mean_test_score) is not correct (rounded to 2 decimal places)\"\n", + "\n", + "assert sha1(str(type(sum(marathon_results.std_test_score))).encode(\"utf-8\")+b\"d183c\").hexdigest() == \"a4c7c7e034abaadcaf56057d19893a773dbf8fb1\", \"type of sum(marathon_results.std_test_score) is not float. Please make sure it is float and not np.float64, etc. You can cast your value into a float using float()\"\n", + "assert sha1(str(round(sum(marathon_results.std_test_score), 2)).encode(\"utf-8\")+b\"d183c\").hexdigest() == \"3000c4e4327bea85d84632c37db03bc1d008b2c0\", \"value of sum(marathon_results.std_test_score) is not correct (rounded to 2 decimal places)\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "c7741d04bb74dbf6c518c14d4f9bccb0", + "grade": false, + "grade_id": "cell-35eaea9c384c5f6c", + "locked": true, + "schema_version": 3, + "solution": false + } + }, + "source": [ + "**Question 8.1**\n", + "
{points: 1}\n", + "\n", + "Great! Now find the number of neighbors that will serve as our best $k$ value by calling the `best_params_` attribute of the model `marathon_tuned`. Your answer should simply be a dictionary with one key-value pair. \n", + "\n", + "Also, find the score for the best model by calling the `best_score_` attribute of the model `marathon_tuned`. Make sure to convert the negative RMSPE score we used for cross-validation into a positive RMSPE score for reporting by using a `-` sign.\n", + "\n", + "*Assign your best parameters to an object called `marathon_min`, and assign your best RMSPE to an object called `marathon_best_RMSPE`.* \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "d86b5cdee75a41caa88010256f2c42ef", + "grade": false, + "grade_id": "cell-f9738d45da9e8a77", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "# ___ = ___.best_params_\n", + "# ___ = -___.best_score_\n", + "\n", + "# your code here\n", + "raise NotImplementedError\n", + "marathon_min" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "17e17fc4f3ff2afda441dfc373e22a4e", + "grade": false, + "grade_id": "cell-b0dd9e2eb4743bab", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "marathon_best_RMSPE" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "18e95c8a4dd3ad559c29dd3fd147c2d1", + "grade": true, + "grade_id": "cell-a1e34e1fb62d79f5", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(marathon_min is None)).encode(\"utf-8\")+b\"9ae42\").hexdigest() == \"2feff5d755380f5a1f50804a0c4948d723261eda\", \"type of marathon_min is None is not bool. marathon_min is None should be a bool\"\n", + "assert sha1(str(marathon_min is None).encode(\"utf-8\")+b\"9ae42\").hexdigest() == \"5015b9976a1f2e2f2fa109305796f1e1702ba164\", \"boolean value of marathon_min is None is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_min)).encode(\"utf-8\")+b\"9ae43\").hexdigest() == \"b4658974ee290076b30642296bffc395bf445d21\", \"type of type(marathon_min) is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_min)).encode(\"utf-8\")+b\"9ae44\").hexdigest() == \"3040f94c545ff413539332503528deab08084a62\", \"type of marathon_min is not dict. marathon_min should be a dict\"\n", + "assert sha1(str(len(list(marathon_min.keys()))).encode(\"utf-8\")+b\"9ae44\").hexdigest() == \"84224507b5177db8e9c88f5abd8824ece22645b8\", \"number of keys of marathon_min is not correct\"\n", + "assert sha1(str(sorted(map(str, marathon_min.keys()))).encode(\"utf-8\")+b\"9ae44\").hexdigest() == \"edf882d0536918e0a683172498fcad8c63f6af3c\", \"keys of marathon_min are not correct\"\n", + "assert sha1(str(sorted(map(str, marathon_min.values()))).encode(\"utf-8\")+b\"9ae44\").hexdigest() == \"c3bca7dfbca0e41a87d4ff3e43c335504e37caeb\", \"correct keys, but values of marathon_min are not correct\"\n", + "assert sha1(str(marathon_min).encode(\"utf-8\")+b\"9ae44\").hexdigest() == \"80961d32128e4ca9746e99318dd97c9ed04c317f\", \"correct keys and values, but incorrect correspondence in keys and values of marathon_min\"\n", + "\n", + "assert sha1(str(type(marathon_best_RMSPE is None)).encode(\"utf-8\")+b\"9ae45\").hexdigest() == \"487be9299591e548ea7dcedef4c4e650814148d2\", \"type of marathon_best_RMSPE is None is not bool. marathon_best_RMSPE is None should be a bool\"\n", + "assert sha1(str(marathon_best_RMSPE is None).encode(\"utf-8\")+b\"9ae45\").hexdigest() == \"84ef8bfc80a388930431187a4d0640f62e727b78\", \"boolean value of marathon_best_RMSPE is None is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_best_RMSPE)).encode(\"utf-8\")+b\"9ae46\").hexdigest() == \"78a416ab0e296d01fb1307a654bf9b70b1337868\", \"type of marathon_best_RMSPE is not correct\"\n", + "assert sha1(str(marathon_best_RMSPE).encode(\"utf-8\")+b\"9ae46\").hexdigest() == \"8785f764d752095decf87a8dd24909d0016992f7\", \"value of marathon_best_RMSPE is not correct\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "aa8abd5ef20ec9ab38ae4d8705bd15c7", + "grade": false, + "grade_id": "cell-28a414eb59f5ae20", + "locked": true, + "schema_version": 3, + "solution": false + } + }, + "source": [ + "**Question 8.2**\n", + "
{points: 1}\n", + "\n", + "To assess how well our model might do at predicting on unseen data, we will assess its RMSPE on the test data.\n", + "\n", + "We will use the predict function to make predictions on the test data and store the predictions `marathon_prediction`. Remember that `GridSearchCV` automatically refits the model with the best found parameters, so you can use the `predict` method of the `marathon_tuned` variable for this step.\n", + "\n", + "Finally, we will compute the RMSPE on the test data using the `mean_squared_error` function. Don't forget to take the square root to obtain the RMSPE!\n", + "\n", + "*Note: `scikit-learn` also has a `score` function for the `KNeighborsRegressor`. The `score` function returns the coefficient of determination (often called $R^2$) of the fit, not the RMSPE.*\n", + "\n", + "\n", + "*Assign your answer in an object called `marathon_summary`.*\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "231e9a9aad23a5fac955ed2a8287ebbf", + "grade": false, + "grade_id": "cell-a4de6046a0bd5f96", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "np.random.seed(1234) # DO NOT CHANGE\n", + "\n", + "# ___ = ___.___(___)\n", + "# ___ = mean_squared_error(___, ___)**(1/2)\n", + "\n", + "\n", + "# your code here\n", + "raise NotImplementedError\n", + "marathon_summary" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "a20e2b36367ee4b66e70018ceaf71dc3", + "grade": true, + "grade_id": "cell-94fab75dca459b65", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(marathon_prediction is None)).encode(\"utf-8\")+b\"5e675\").hexdigest() == \"e171ec8a4f6e825d47e43ba2c8d7e4962ff2f8b4\", \"type of marathon_prediction is None is not bool. marathon_prediction is None should be a bool\"\n", + "assert sha1(str(marathon_prediction is None).encode(\"utf-8\")+b\"5e675\").hexdigest() == \"c76b30dacb294c54dc2932240aa7fa4c23543c56\", \"boolean value of marathon_prediction is None is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_prediction)).encode(\"utf-8\")+b\"5e676\").hexdigest() == \"be3ffc123e07105d4089655588fb6d71383eb08d\", \"type of type(marathon_prediction) is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_prediction.sum())).encode(\"utf-8\")+b\"5e677\").hexdigest() == \"d3da4b9915f115587058740bd3c406c49cbf5b2c\", \"type of marathon_prediction.sum() is not correct\"\n", + "assert sha1(str(marathon_prediction.sum()).encode(\"utf-8\")+b\"5e677\").hexdigest() == \"8c10d2be9c82e2bdbdcd44f3fbb35f6c102d0119\", \"value of marathon_prediction.sum() is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_summary is None)).encode(\"utf-8\")+b\"5e678\").hexdigest() == \"1581c288216e96bfb8d0fcc29cf60c18dd92909b\", \"type of marathon_summary is None is not bool. marathon_summary is None should be a bool\"\n", + "assert sha1(str(marathon_summary is None).encode(\"utf-8\")+b\"5e678\").hexdigest() == \"6f8e105f98933eb6b68dbbb0f78058a8ac9dd80a\", \"boolean value of marathon_summary is None is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_summary)).encode(\"utf-8\")+b\"5e679\").hexdigest() == \"ba12bad71525a497b68612abadf62fd2a05b9230\", \"type of marathon_summary is not correct\"\n", + "assert sha1(str(marathon_summary).encode(\"utf-8\")+b\"5e679\").hexdigest() == \"ecbf8a32ee6fde067052e0cf254aaf3b674d001f\", \"value of marathon_summary is not correct\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "916cfae57b2ffacb39d11610af802680", + "grade": false, + "grade_id": "cell-dffef3173aff9b72", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "What does this RMSPE mean? RMSPE is measured in the units of the target/response variable, so it can sometimes be a bit hard to interpret. In this case, we have a helpful reference to compare against: we know that a typical marathon race time is somewhere between 3 - 5 hours. So this model allows us to predict a runner's race time up to about +/-0.6 of an hour, or +/- 36 minutes. Relative the total race time, this margin of error is not *fantastic*, but not *terrible* either. We can certainly use the model to determine roughly whether an athlete will have a bad, good, or excellent race time, but probably cannot reliably distinguish between athletes of a similar caliber.\n", + "\n", + "For now, let’s consider this approach to thinking about RMSPE from our testing data set: as long as it's not significantly worse than the cross-validation RMSPE of our best model (**Question 8.1**), then we can say that we’re not doing too much worse on the test data than we did on the training data. In future courses on statistical/machine learning, you will learn more about how to interpret RMSPE from testing data and other ways to assess models. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "7a897402fd703010fe30e1523087aac7", + "grade": false, + "grade_id": "cell-ed97bb769cc923e5", + "locked": true, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "source": [ + "**Question 8.3**\n", + "
{points: 1}\n", + "\n", + "The RMSPE from our testing data set is *much worse* than the cross-validation RMSPE of our best model. \n", + "\n", + "*Assign your answer to an object named `answer8_3`. Make sure your answer is either `True` or `False`.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "26215e2be064314a108b179eedbf1505", + "grade": false, + "grade_id": "cell-24ccc13552b0fff1", + "locked": false, + "schema_version": 3, + "solution": true, + "task": false + } + }, + "outputs": [], + "source": [ + "# your code here\n", + "raise NotImplementedError" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "0295e3c617a3641783400610f991da00", + "grade": true, + "grade_id": "cell-f39ed1223c189ec6", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false, + "task": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(answer8_3)).encode(\"utf-8\")+b\"a3e08\").hexdigest() == \"b07290d0d5a5f7304386a6085d09604c57fe55d4\", \"type of answer8_3 is not bool. answer8_3 should be a bool\"\n", + "assert sha1(str(answer8_3).encode(\"utf-8\")+b\"a3e08\").hexdigest() == \"0fd0dee1f68a3e7794645e623f2b2be2db15b5cf\", \"boolean value of answer8_3 is not correct\"\n", + "\n", + "print('Success!')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "markdown", + "checksum": "91c371815f8521c3f43e3f0bfe407f84", + "grade": false, + "grade_id": "cell-f527fba0cc1ca89d", + "locked": true, + "schema_version": 3, + "solution": false + } + }, + "source": [ + "**Question 9.0**\n", + "
{points: 1}\n", + "\n", + "Let's visualize what the relationship between `max` and `time_hrs` looks like with our best $k$ value to ultimately explore how the $k$ value affects $k$-nn regression.\n", + "\n", + "To do so, use the `predict` function on `marathon_tuned` to use the model with the best $K$ value to create predictions for the `marathon_training` data. Then, add the column of predictions to the `marathon_training` data frame using the `assign` function. Name the resulting data frame `marathon_preds` and the new column `predictions`.\n", + "\n", + "Next, create a scatterplot with the marathon time (y-axis) against the maximum distance run per week (x-axis) from `marathon_preds`. Use `mark_circle` with an opacity of 0.4 to avoid overplotting. Assign your plot to a variable called `marathon_plot`. **Plot the predictions as a black line over the data points.** Remember the fundamentals of effective visualizations such as having a human-readable axes titles. \n", + "\n", + "*Assign the data frame from the first part to a variable called `marathon_preds`, and the plot to a variable called `marathon_plot`.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "e740adac0cff3905a99f571b55640aee", + "grade": false, + "grade_id": "cell-e623a65f902a7e98", + "locked": false, + "schema_version": 3, + "solution": true + } + }, + "outputs": [], + "source": [ + "np.random.seed(2019) # DO NOT CHANGE\n", + "\n", + "# marathon_preds = ____.assign(\n", + "# predictions= _____.predict(____)\n", + "# )\n", + "# marathon_plot = ___\n", + "\n", + "# your code here\n", + "raise NotImplementedError\n", + "marathon_plot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "deletable": false, + "editable": false, + "nbgrader": { + "cell_type": "code", + "checksum": "b7b8240f95f1bac98e79ee90b5df6b6c", + "grade": true, + "grade_id": "cell-5eff9c974a058bdf", + "locked": true, + "points": 1, + "schema_version": 3, + "solution": false + } + }, + "outputs": [], + "source": [ + "from hashlib import sha1\n", + "assert sha1(str(type(marathon_preds is None)).encode(\"utf-8\")+b\"80ef7\").hexdigest() == \"feb8d8685b9e26c54c06aaf7f0f281aee880c614\", \"type of marathon_preds is None is not bool. marathon_preds is None should be a bool\"\n", + "assert sha1(str(marathon_preds is None).encode(\"utf-8\")+b\"80ef7\").hexdigest() == \"bc57fae1eae5ffdeeeada5122d0bb66260bd0ac6\", \"boolean value of marathon_preds is None is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_preds)).encode(\"utf-8\")+b\"80ef8\").hexdigest() == \"5246d7fd78d900c1aaed511af4b93a395c8f8f6b\", \"type of type(marathon_preds) is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_preds.shape)).encode(\"utf-8\")+b\"80ef9\").hexdigest() == \"47500ac86a3aa4df2352b61411ba2c643b26a21b\", \"type of marathon_preds.shape is not tuple. marathon_preds.shape should be a tuple\"\n", + "assert sha1(str(len(marathon_preds.shape)).encode(\"utf-8\")+b\"80ef9\").hexdigest() == \"c1dee5594a1047ae527ce7ff6fd93c09f5d7087f\", \"length of marathon_preds.shape is not correct\"\n", + "assert sha1(str(sorted(map(str, marathon_preds.shape))).encode(\"utf-8\")+b\"80ef9\").hexdigest() == \"45e6ce598dd4b9a99a59cd85e2bc95e4e6dcfa1d\", \"values of marathon_preds.shape are not correct\"\n", + "assert sha1(str(marathon_preds.shape).encode(\"utf-8\")+b\"80ef9\").hexdigest() == \"8b0e8a50ed15369143176e9e9a444fb85a94925f\", \"order of elements of marathon_preds.shape is not correct\"\n", + "\n", + "assert sha1(str(type(\"predictions\" in marathon_preds.columns)).encode(\"utf-8\")+b\"80efa\").hexdigest() == \"bee6c28399c272e11c7b36d6af56c340b73f5de9\", \"type of \\\"predictions\\\" in marathon_preds.columns is not bool. \\\"predictions\\\" in marathon_preds.columns should be a bool\"\n", + "assert sha1(str(\"predictions\" in marathon_preds.columns).encode(\"utf-8\")+b\"80efa\").hexdigest() == \"bb01defbd41c2fca442d129ecde3d06ba69c793e\", \"boolean value of \\\"predictions\\\" in marathon_preds.columns is not correct\"\n", + "\n", + "assert sha1(str(type(sum(marathon_preds.predictions))).encode(\"utf-8\")+b\"80efb\").hexdigest() == \"6694cadf894375ec79d08d843730bfa2ebeaa247\", \"type of sum(marathon_preds.predictions) is not float. Please make sure it is float and not np.float64, etc. You can cast your value into a float using float()\"\n", + "assert sha1(str(round(sum(marathon_preds.predictions), 2)).encode(\"utf-8\")+b\"80efb\").hexdigest() == \"14d7241b6832fe96cee98179e0bfbab800123337\", \"value of sum(marathon_preds.predictions) is not correct (rounded to 2 decimal places)\"\n", + "\n", + "assert sha1(str(type(sum(marathon_preds.time_hrs))).encode(\"utf-8\")+b\"80efc\").hexdigest() == \"32fcb9d092fe59373b115cd2156579052d4bb724\", \"type of sum(marathon_preds.time_hrs) is not float. Please make sure it is float and not np.float64, etc. You can cast your value into a float using float()\"\n", + "assert sha1(str(round(sum(marathon_preds.time_hrs), 2)).encode(\"utf-8\")+b\"80efc\").hexdigest() == \"de864616f527a3484c98bc8e5ce5448442b3c180\", \"value of sum(marathon_preds.time_hrs) is not correct (rounded to 2 decimal places)\"\n", + "\n", + "assert sha1(str(type(marathon_plot is None)).encode(\"utf-8\")+b\"80efd\").hexdigest() == \"7802ca930a377d22b91bda34749b3473ae40ce6b\", \"type of marathon_plot is None is not bool. marathon_plot is None should be a bool\"\n", + "assert sha1(str(marathon_plot is None).encode(\"utf-8\")+b\"80efd\").hexdigest() == \"6080493d69f4752d4f838318c797543ab4092182\", \"boolean value of marathon_plot is None is not correct\"\n", + "\n", + "assert sha1(str(type(len(marathon_plot.layer))).encode(\"utf-8\")+b\"80efe\").hexdigest() == \"f5cd3e76aff8db41831d68252d099f01b5af0eeb\", \"type of len(marathon_plot.layer) is not int. Please make sure it is int and not np.int64, etc. You can cast your value into an int using int()\"\n", + "assert sha1(str(len(marathon_plot.layer)).encode(\"utf-8\")+b\"80efe\").hexdigest() == \"791ae34b7ef2c822983fb1c67241cccbe65ce087\", \"value of len(marathon_plot.layer) is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_plot.layer[0].mark)).encode(\"utf-8\")+b\"80eff\").hexdigest() == \"31988f4df3bdd784d531d340494800d13f512ec8\", \"type of marathon_plot.layer[0].mark is not correct\"\n", + "assert sha1(str(marathon_plot.layer[0].mark).encode(\"utf-8\")+b\"80eff\").hexdigest() == \"833d54d5fea79d6426472768c3753a1d3e2aab10\", \"value of marathon_plot.layer[0].mark is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_plot.layer[1].mark)).encode(\"utf-8\")+b\"80f00\").hexdigest() == \"afb1d5a9e3ef12f0c2f446d06cc34948eac7babc\", \"type of marathon_plot.layer[1].mark is not correct\"\n", + "assert sha1(str(marathon_plot.layer[1].mark).encode(\"utf-8\")+b\"80f00\").hexdigest() == \"50a72f4524c38645971c4b6a9df41dc1257a95c3\", \"value of marathon_plot.layer[1].mark is not correct\"\n", + "\n", + "assert sha1(str(type(marathon_plot.layer[0].encoding.x['shorthand'])).encode(\"utf-8\")+b\"80f01\").hexdigest() == \"6a6854dca69a83d48caec2cba6e1338a14a346fb\", \"type of marathon_plot.layer[0].encoding.x['shorthand'] is not str. marathon_plot.layer[0].encoding.x['shorthand'] should be an str\"\n", + "assert sha1(str(len(marathon_plot.layer[0].encoding.x['shorthand'])).encode(\"utf-8\")+b\"80f01\").hexdigest() == \"e63a8532d269c7f5a36c4d9e504de2fe4993dd7f\", \"length of marathon_plot.layer[0].encoding.x['shorthand'] is not correct\"\n", + "assert sha1(str(marathon_plot.layer[0].encoding.x['shorthand'].lower()).encode(\"utf-8\")+b\"80f01\").hexdigest() == \"1bd0afc1bf2c4a34122b26e13c975a1f3463b0b9\", \"value of marathon_plot.layer[0].encoding.x['shorthand'] is not correct\"\n", + "assert sha1(str(marathon_plot.layer[0].encoding.x['shorthand']).encode(\"utf-8\")+b\"80f01\").hexdigest() == \"1bd0afc1bf2c4a34122b26e13c975a1f3463b0b9\", \"correct string value of marathon_plot.layer[0].encoding.x['shorthand'] but incorrect case of letters\"\n", + "\n", + "assert sha1(str(type(marathon_plot.layer[0].encoding.y['shorthand'])).encode(\"utf-8\")+b\"80f02\").hexdigest() == \"f9dc36ce988a73cb1cb0b471255c1e10e4d91094\", \"type of marathon_plot.layer[0].encoding.y['shorthand'] is not str. marathon_plot.layer[0].encoding.y['shorthand'] should be an str\"\n", + "assert sha1(str(len(marathon_plot.layer[0].encoding.y['shorthand'])).encode(\"utf-8\")+b\"80f02\").hexdigest() == \"6ce890fc97b51c036be327421ff4134099ff5209\", \"length of marathon_plot.layer[0].encoding.y['shorthand'] is not correct\"\n", + "assert sha1(str(marathon_plot.layer[0].encoding.y['shorthand'].lower()).encode(\"utf-8\")+b\"80f02\").hexdigest() == \"5afe1d7a1dd51c71a80027335b5a7b623548ea9e\", \"value of marathon_plot.layer[0].encoding.y['shorthand'] is not correct\"\n", + "assert sha1(str(marathon_plot.layer[0].encoding.y['shorthand']).encode(\"utf-8\")+b\"80f02\").hexdigest() == \"5afe1d7a1dd51c71a80027335b5a7b623548ea9e\", \"correct string value of marathon_plot.layer[0].encoding.y['shorthand'] but incorrect case of letters\"\n", + "\n", + "assert sha1(str(type(marathon_plot.layer[1].encoding.y['shorthand'])).encode(\"utf-8\")+b\"80f03\").hexdigest() == \"32deb9ef407143db608af31b29a3adedbc08ca59\", \"type of marathon_plot.layer[1].encoding.y['shorthand'] is not str. marathon_plot.layer[1].encoding.y['shorthand'] should be an str\"\n", + "assert sha1(str(len(marathon_plot.layer[1].encoding.y['shorthand'])).encode(\"utf-8\")+b\"80f03\").hexdigest() == \"457b359edc893e20adf144c86cf19d1a75746764\", \"length of marathon_plot.layer[1].encoding.y['shorthand'] is not correct\"\n", + "assert sha1(str(marathon_plot.layer[1].encoding.y['shorthand'].lower()).encode(\"utf-8\")+b\"80f03\").hexdigest() == \"91b908c0622ce400d6464a25c58cb64b9b250011\", \"value of marathon_plot.layer[1].encoding.y['shorthand'] is not correct\"\n", + "assert sha1(str(marathon_plot.layer[1].encoding.y['shorthand']).encode(\"utf-8\")+b\"80f03\").hexdigest() == \"91b908c0622ce400d6464a25c58cb64b9b250011\", \"correct string value of marathon_plot.layer[1].encoding.y['shorthand'] but incorrect case of letters\"\n", + "\n", + "assert sha1(str(type(isinstance(marathon_plot.layer[0].encoding.x['title'], str))).encode(\"utf-8\")+b\"80f04\").hexdigest() == \"6a9334f3b0f6f1f0d22d19bec2755550c05f1b9b\", \"type of isinstance(marathon_plot.layer[0].encoding.x['title'], str) is not bool. isinstance(marathon_plot.layer[0].encoding.x['title'], str) should be a bool\"\n", + "assert sha1(str(isinstance(marathon_plot.layer[0].encoding.x['title'], str)).encode(\"utf-8\")+b\"80f04\").hexdigest() == \"3902db8b41319e78ddf41fae51a6625a43b54f01\", \"boolean value of isinstance(marathon_plot.layer[0].encoding.x['title'], str) is not correct\"\n", + "\n", + "assert sha1(str(type(isinstance(marathon_plot.layer[0].encoding.y['title'], str))).encode(\"utf-8\")+b\"80f05\").hexdigest() == \"523124c5efd969114f88146347e99ccc8593d726\", \"type of isinstance(marathon_plot.layer[0].encoding.y['title'], str) is not bool. isinstance(marathon_plot.layer[0].encoding.y['title'], str) should be a bool\"\n", + "assert sha1(str(isinstance(marathon_plot.layer[0].encoding.y['title'], str)).encode(\"utf-8\")+b\"80f05\").hexdigest() == \"43ecd7181832f23dda45839dbbd29bdbaabcd0b5\", \"boolean value of isinstance(marathon_plot.layer[0].encoding.y['title'], str) is not correct\"\n", + "\n", + "print('Success!')" + ] + } + ], + "metadata": { + "jupytext": { + "encoding": "# -*- coding: utf-8 -*-" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/slides/python/08_regression1_py.ipynb b/slides/python/08_regression1_py.ipynb new file mode 100644 index 0000000..1c01e68 --- /dev/null +++ b/slides/python/08_regression1_py.ipynb @@ -0,0 +1,436 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## DSCI 100 - Introduction to Data Science\n", + "\n", + "\n", + "### Lecture 8 - Regression with k-nearest neighbours\n", + "\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "## Housekeeping \n", + " \n", + " \n", + "- the upcoming tutorial is a project work session\n", + " - Reminder about projects: Part of the group project mark is \"teamwork\". All members will have the opportunity to evaluate your group members at the end of the year and the evaluations will affect your final project mark\n", + "- project proposal due Saturday " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Regression prediction problem\n", + "\n", + "What if we want to predict a quantitative value instead of a class label? \n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "- Last week we learned about predicting a categorical response based on the nearest neighbours \n", + "- suppose now we are no longer predicting a binary/categorical, but now a quantitative response" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "E.g.: predict the price of a 2000 square foot home (from this reduced dataset)\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "- Suppose we want to predict the price of a home given a 2000 sq footage\n", + "- What are some ways you might predict the price? " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### K nearest neighbours regression\n", + "\n", + "As in k-nn classification, we find the $k$-nearest neighbours (here $k=5$) in terms of the predictors\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### K nearest neighbours regression\n", + "\n", + "Then we average the values for the $k$-nearest neighbours, and use that as the prediction:\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "- It makes sense that the predicted value should be near these points, not much lower or higher. Perhaps a good prediction would be the average of these points" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### K nearest neighbours regression\n", + "\n", + "If we do that for a range of house sizes, we can draw the curve of predictions ($k = 14$):\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "- You can imagine doing this for all the possible input values and coming up with predictions everywhere\n", + "- Connecting all these predictions with a line \n", + "- one benefit is that it handles non-linearity well." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Regression prediction problem\n", + "\n", + "We still have to answer these two questions:\n", + "\n", + "1. Is our model any good? \n", + "\n", + "2. How do we choose `k`? " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### 1. Is our model any good?\n", + "\n", + "The same general strategy as in classification works here!\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### 1. Is our model any good?\n", + "\n", + "Suppose the blue line depicts our predictions from k-nn regression.\n", + "\n", + "The red lines depict the error in our predictions, i.e., the difference between the $i^\\text{th}$ test data response and our prediction $\\hat{y}_i$:\n", + "\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "- small datasets: the nearest neighbours are the same and thus the mean in a certain area is the same therefore we have flat lines" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### 1. Is our model any good?\n", + "\n", + "\n", + "We (roughly) add up these errors to evaluate our regression model\n", + "- Not out of 1, but instead in units of the target variable (bit harder to interpret)\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + " \n", + "*Root Mean Squared Prediction Error* (RMSPE):\n", + " \n", + "$$RMSPE = \\sqrt{\\frac{1}{n}\\sum\\limits_{i=1}^{n}(y_i - \\hat{y_i})^2}$$\n", + "

- $n$ is the number of observations

\n", + "

- $y_i$ is the observed value for the $i^\\text{th}$ test observation

\n", + "

- $\\hat{y_i}$ is the forcasted/predicted value for the $i^\\text{th}$ test observation

\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### RMSE vs RMSPE\n", + "\n", + "- *Root Mean Squared Error (RMSE)*: The same formula except on *the data used to train the model*\n", + " - this indicates how well our model can fit our data\n", + "- *Root Mean Squared Prediction Error (RMSPE)*: predicting on *unseen data.*\n", + " - this indicates how well our model *generalizes* to future data\n", + " \n", + " \n", + "**This distinction is very important, but no standard terminology.**" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Final model from k-nn regression\n", + "\n", + "For this model, RMSPE is 91620.4. How can we interpret this?\n", + "\n", + "\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "- Prices tend to be +/- 90000 off that line" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### 2. How do we choose k?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Roughly the same as before! " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "1. Cross validation:\n", + " - Split data into $C$ folds \n", + " - Train \n", + " - Evaluate model \n", + " - Pick k that gives the lowest RMSE on validataion set " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "2. Train model on whole dataset " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "3. Evaluate how good the predictions are using the test data \n", + " - however, this time we use RMSPE as our prediction metric" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### How does $k$ affect k-nn regression?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Worksheet time - go for it!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# What did you learn? \n", + "- \n", + "- \n", + "- " + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + }, + "rise": { + "transition": "fade" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/slides/python/08_regression1_py.slides.html b/slides/python/08_regression1_py.slides.html new file mode 100644 index 0000000..b2c1113 --- /dev/null +++ b/slides/python/08_regression1_py.slides.html @@ -0,0 +1,7874 @@ + + + + + + + +08_regression1_py slides + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +