diff --git a/ME-390-Exercises/ME-390-09-trees/data/titanic.csv b/ME-390-Exercises/ME-390-09-trees/data/titanic.csv new file mode 100644 index 0000000..2211a75 --- /dev/null +++ b/ME-390-Exercises/ME-390-09-trees/data/titanic.csv @@ -0,0 +1,890 @@ +survived,pclass,age,sibsp,parch,fare,alone,sex_female,sex_male,embark_town_Cherbourg,embark_town_Queenstown,embark_town_Southampton,who_child,who_man,who_woman,"fare_group_(-0.001, 7.854]","fare_group_(7.854, 10.5]","fare_group_(10.5, 21.679]","fare_group_(21.679, 39.688]","fare_group_(39.688, 512.329]" +0,3,22.0,1,0,7.25,False,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,1,38.0,1,0,71.2833,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,3,26.0,0,0,7.925,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +1,1,35.0,1,0,53.1,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,35.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,8.4583,True,0,1,0,1,0,0,1,0,0,1,0,0,0 +0,1,54.0,0,0,51.8625,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,2.0,3,1,21.075,False,0,1,0,0,1,1,0,0,0,0,1,0,0 +1,3,27.0,0,2,11.1333,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,2,14.0,1,0,30.0708,False,1,0,1,0,0,1,0,0,0,0,0,1,0 +1,3,4.0,1,1,16.7,False,1,0,0,0,1,1,0,0,0,0,1,0,0 +1,1,58.0,0,0,26.55,True,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,20.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,39.0,1,5,31.275,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,14.0,0,0,7.8542,True,1,0,0,0,1,1,0,0,1,0,0,0,0 +1,2,55.0,0,0,16.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,2.0,4,1,29.125,False,0,1,0,1,0,1,0,0,0,0,0,1,0 +1,2,29.69911764705882,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,31.0,1,0,18.0,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,3,29.69911764705882,0,0,7.225,True,1,0,1,0,0,0,0,1,1,0,0,0,0 +0,2,35.0,0,0,26.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,2,34.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,3,15.0,0,0,8.0292,True,1,0,0,1,0,1,0,0,0,1,0,0,0 +1,1,28.0,0,0,35.5,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,8.0,3,1,21.075,False,1,0,0,0,1,1,0,0,0,0,1,0,0 +1,3,38.0,1,5,31.3875,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,29.69911764705882,0,0,7.225,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,1,19.0,3,2,263.0,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,3,29.69911764705882,0,0,7.8792,True,1,0,0,1,0,0,0,1,0,1,0,0,0 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,40.0,0,0,27.7208,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +1,1,29.69911764705882,1,0,146.5208,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,3,29.69911764705882,0,0,7.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,2,66.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,28.0,1,0,82.1708,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,1,42.0,1,0,52.0,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,3,29.69911764705882,0,0,7.2292,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,3,21.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,18.0,2,0,18.0,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,3,14.0,1,0,11.2417,False,1,0,1,0,0,1,0,0,0,0,1,0,0 +0,3,40.0,1,0,9.475,False,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,2,27.0,1,0,21.0,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.8958,True,0,1,1,0,0,0,1,0,0,1,0,0,0 +1,2,3.0,1,2,41.5792,False,1,0,1,0,0,1,0,0,0,0,0,0,1 +1,3,19.0,0,0,7.8792,True,1,0,0,1,0,0,0,1,0,1,0,0,0 +0,3,29.69911764705882,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,1,0,15.5,False,0,1,0,1,0,0,1,0,0,0,1,0,0 +1,3,29.69911764705882,0,0,7.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,3,29.69911764705882,2,0,21.6792,False,0,1,1,0,0,0,1,0,0,0,1,0,0 +0,3,18.0,1,0,17.8,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,7.0,4,1,39.6875,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +0,3,21.0,0,0,7.8,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,1,49.0,1,0,76.7292,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,2,29.0,1,0,26.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,1,65.0,0,1,61.9792,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +1,1,29.69911764705882,0,0,35.5,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,2,21.0,0,0,10.5,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,28.5,0,0,7.2292,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +1,2,5.0,1,2,27.75,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,3,11.0,5,2,46.9,False,0,1,0,0,1,1,0,0,0,0,0,0,1 +0,3,22.0,0,0,7.2292,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,1,45.0,1,0,83.475,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,4.0,3,2,27.9,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +0,1,29.69911764705882,0,0,27.7208,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +1,3,29.69911764705882,1,1,15.2458,False,0,1,1,0,0,0,1,0,0,0,1,0,0 +1,2,29.0,0,0,10.5,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,19.0,0,0,8.1583,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,17.0,4,2,7.925,False,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,26.0,2,0,8.6625,False,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,32.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,16.0,5,2,46.9,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,2,21.0,0,0,73.5,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,26.0,1,0,14.4542,False,0,1,1,0,0,0,1,0,0,0,1,0,0 +1,3,32.0,0,0,56.4958,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,25.0,0,0,7.65,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,0.83,0,2,29.0,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +1,3,30.0,0,0,12.475,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,22.0,0,0,9.0,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,29.0,0,0,9.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,29.69911764705882,0,0,7.7875,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,1,28.0,0,0,47.1,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,2,17.0,0,0,10.5,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +1,3,33.0,3,0,15.85,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,16.0,1,3,34.375,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,29.69911764705882,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,23.0,3,2,263.0,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,24.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,20.0,0,0,7.8542,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,1,46.0,1,0,61.175,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,26.0,1,2,20.575,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,59.0,0,0,7.25,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,71.0,0,0,34.6542,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +1,1,23.0,0,1,63.3583,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +1,2,34.0,0,1,23.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,2,34.0,1,0,26.0,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,28.0,0,0,7.8958,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,21.0,0,1,77.2875,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,33.0,0,0,8.6542,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,37.0,2,0,7.925,False,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,28.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,21.0,0,0,7.65,True,1,0,0,0,1,0,0,1,1,0,0,0,0 +1,3,29.69911764705882,0,0,7.775,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,38.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,29.69911764705882,1,0,24.15,False,1,0,0,1,0,0,0,1,0,0,0,1,0 +0,1,47.0,0,0,52.0,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,14.5,1,0,14.4542,False,1,0,1,0,0,1,0,0,0,0,1,0,0 +0,3,22.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,20.0,1,0,9.825,False,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,17.0,0,0,14.4583,True,1,0,1,0,0,0,0,1,0,0,1,0,0 +0,3,21.0,0,0,7.925,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,70.5,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +0,2,29.0,1,0,21.0,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,1,24.0,0,1,247.5208,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,2.0,4,2,31.275,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,2,21.0,2,0,73.5,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,29.69911764705882,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,32.5,1,0,30.0708,False,0,1,1,0,0,0,1,0,0,0,0,1,0 +1,2,32.5,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,1,54.0,0,1,77.2875,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,3,12.0,1,0,11.2417,False,0,1,1,0,0,1,0,0,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,3,24.0,0,0,7.1417,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,3,29.69911764705882,1,1,22.3583,False,1,0,1,0,0,0,0,1,0,0,0,1,0 +0,3,45.0,0,0,6.975,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,33.0,0,0,7.8958,True,0,1,1,0,0,0,1,0,0,1,0,0,0 +0,3,20.0,0,0,7.05,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,47.0,1,0,14.5,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,2,29.0,1,0,26.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,2,25.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,2,23.0,0,0,15.0458,True,0,1,1,0,0,0,1,0,0,0,1,0,0 +1,1,19.0,0,2,26.2833,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,1,37.0,1,0,53.1,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,16.0,0,0,9.2167,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,24.0,0,0,79.2,True,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,29.69911764705882,0,2,15.2458,False,1,0,1,0,0,0,0,1,0,0,1,0,0 +1,3,22.0,0,0,7.75,True,1,0,0,0,1,0,0,1,1,0,0,0,0 +1,3,24.0,1,0,15.85,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,19.0,0,0,6.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +0,2,18.0,0,0,11.5,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,2,19.0,1,1,36.75,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,3,27.0,0,0,7.7958,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,9.0,2,2,34.375,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,2,36.5,0,2,26.0,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,2,42.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,2,51.0,0,0,12.525,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,1,22.0,1,0,66.6,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,55.5,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,40.5,0,2,14.5,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.3125,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,1,51.0,0,1,61.3792,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +1,3,16.0,0,0,7.7333,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,3,30.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,8.6625,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,8,2,69.55,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,44.0,0,1,16.1,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,2,40.0,0,0,15.75,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,26.0,0,0,7.775,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,17.0,0,0,8.6625,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,1.0,4,1,39.6875,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +1,3,9.0,0,2,20.525,False,0,1,0,0,1,1,0,0,0,0,1,0,0 +1,1,29.69911764705882,0,1,55.0,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,45.0,1,4,27.9,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,1,29.69911764705882,0,0,25.925,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,28.0,0,0,56.4958,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,1,61.0,0,0,33.5,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,4.0,4,1,29.125,False,0,1,0,1,0,1,0,0,0,0,0,1,0 +1,3,1.0,1,1,11.1333,False,1,0,0,0,1,1,0,0,0,0,1,0,0 +0,3,21.0,0,0,7.925,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,56.0,0,0,30.6958,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,3,18.0,1,1,7.8542,False,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,3,1,25.4667,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,1,50.0,0,0,28.7125,True,1,0,1,0,0,0,0,1,0,0,0,1,0 +0,2,30.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,36.0,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,8,2,69.55,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,2,29.69911764705882,0,0,15.05,True,0,1,1,0,0,0,1,0,0,0,1,0,0 +0,3,9.0,4,2,31.3875,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +1,2,1.0,2,1,39.0,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +1,3,4.0,0,2,22.025,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,1,29.69911764705882,0,0,50.0,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,3,29.69911764705882,1,0,15.5,False,1,0,0,1,0,0,0,1,0,0,1,0,0 +1,1,45.0,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,40.0,1,1,15.5,False,0,1,0,1,0,0,1,0,0,0,1,0,0 +0,3,36.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,32.0,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,2,19.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,3,19.0,1,0,7.8542,False,1,0,0,0,1,0,0,1,1,0,0,0,0 +1,2,3.0,1,1,26.0,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +1,1,44.0,0,0,27.7208,True,1,0,1,0,0,0,0,1,0,0,0,1,0 +1,1,58.0,0,0,146.5208,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,3,29.69911764705882,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +0,3,42.0,0,1,8.4042,False,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,29.69911764705882,0,0,7.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,2,24.0,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,28.0,0,0,9.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,8,2,69.55,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,34.0,0,0,6.4958,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,45.5,0,0,7.225,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +1,3,18.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,2.0,0,1,10.4625,False,1,0,0,0,1,1,0,0,0,1,0,0,0 +0,3,32.0,1,0,15.85,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,3,26.0,0,0,18.7875,True,0,1,1,0,0,0,1,0,0,0,1,0,0 +1,3,16.0,0,0,7.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +1,1,40.0,0,0,31.0,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,3,24.0,0,0,7.05,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,2,35.0,0,0,21.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,22.0,0,0,7.25,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,2,30.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,29.69911764705882,1,0,7.75,False,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,1,31.0,1,0,113.275,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,3,27.0,0,0,7.925,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,2,42.0,1,0,27.0,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,1,32.0,0,0,76.2917,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,2,30.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,16.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,27.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,51.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,38.0,1,0,90.0,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,22.0,0,0,9.35,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,19.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,20.5,0,0,7.25,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,2,18.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,29.69911764705882,3,1,25.4667,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,1,35.0,1,0,83.475,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,29.0,0,0,7.775,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,2,59.0,0,0,13.5,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,3,5.0,4,2,31.3875,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,2,24.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,7.55,True,1,0,0,0,1,0,0,1,1,0,0,0,0 +0,2,44.0,1,0,26.0,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,2,8.0,0,2,26.25,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,2,19.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,33.0,0,0,12.275,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,29.69911764705882,1,0,14.4542,False,1,0,1,0,0,0,0,1,0,0,1,0,0 +1,3,29.69911764705882,1,0,15.5,False,1,0,0,1,0,0,0,1,0,0,1,0,0 +0,2,29.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,22.0,0,0,7.125,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,30.0,0,0,7.225,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,1,44.0,2,0,90.0,False,0,1,0,1,0,0,1,0,0,0,0,0,1 +0,3,25.0,0,0,7.775,True,1,0,0,0,1,0,0,1,1,0,0,0,0 +1,2,24.0,0,2,14.5,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,1,37.0,1,1,52.5542,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,2,54.0,1,0,26.0,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,29.69911764705882,0,0,7.25,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,29.0,1,1,10.4625,False,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,1,62.0,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,30.0,1,0,16.1,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,41.0,0,2,20.2125,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,3,29.0,0,2,15.2458,False,1,0,1,0,0,0,0,1,0,0,1,0,0 +1,1,29.69911764705882,0,0,79.2,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,1,30.0,0,0,86.5,True,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,1,35.0,0,0,512.3292,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,2,50.0,0,1,26.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,29.69911764705882,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,3,3.0,4,2,31.3875,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +0,1,52.0,1,1,79.65,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,1,40.0,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,0,0,7.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,2,36.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,16.0,4,1,39.6875,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,3,25.0,1,0,7.775,False,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,1,58.0,0,1,153.4625,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,1,35.0,0,0,135.6333,True,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,1,29.69911764705882,0,0,31.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,3,25.0,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,2,41.0,0,1,19.5,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,1,37.0,0,1,29.7,False,0,1,1,0,0,0,1,0,0,0,0,1,0 +1,3,29.69911764705882,0,0,7.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +1,1,63.0,1,0,77.9583,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,45.0,0,0,7.75,True,1,0,0,0,1,0,0,1,1,0,0,0,0 +0,2,29.69911764705882,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,7.0,4,1,29.125,False,0,1,0,1,0,1,0,0,0,0,0,1,0 +1,3,35.0,1,1,20.25,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,65.0,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +0,3,28.0,0,0,7.8542,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,16.0,0,0,9.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,19.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,29.69911764705882,0,0,26.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,33.0,0,0,8.6625,True,0,1,1,0,0,0,1,0,0,1,0,0,0 +1,3,30.0,0,0,9.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,22.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,42.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,3,22.0,0,0,7.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +1,1,26.0,0,0,78.85,True,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,1,19.0,1,0,91.0792,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,2,36.0,0,0,12.875,True,0,1,1,0,0,0,1,0,0,0,1,0,0 +0,3,24.0,0,0,8.85,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,24.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,29.69911764705882,0,0,27.7208,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,3,23.5,0,0,7.2292,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,1,2.0,1,2,151.55,False,1,0,0,0,1,1,0,0,0,0,0,0,1 +1,1,29.69911764705882,0,0,30.5,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,1,50.0,0,1,247.5208,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,3,29.69911764705882,0,0,7.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +1,3,29.69911764705882,2,0,23.25,False,0,1,0,1,0,0,1,0,0,0,0,1,0 +0,3,19.0,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,2,29.69911764705882,0,0,12.35,True,1,0,0,1,0,0,0,1,0,0,1,0,0 +0,3,29.69911764705882,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,0.92,1,2,151.55,False,0,1,0,0,1,1,0,0,0,0,0,0,1 +1,1,29.69911764705882,0,0,110.8833,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,1,17.0,1,0,108.9,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,2,30.0,1,0,24.0,False,0,1,1,0,0,0,1,0,0,0,0,1,0 +1,1,30.0,0,0,56.9292,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,1,24.0,0,0,83.1583,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,1,18.0,2,2,262.375,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,2,26.0,1,1,26.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,28.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,43.0,1,1,26.25,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,3,26.0,0,0,7.8542,True,1,0,0,0,1,0,0,1,1,0,0,0,0 +1,2,24.0,1,0,26.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,2,54.0,0,0,14.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,1,31.0,0,2,164.8667,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,1,40.0,1,1,134.5,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,3,22.0,0,0,7.25,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,27.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,30.0,0,0,12.35,True,1,0,0,1,0,0,0,1,0,0,1,0,0 +1,2,22.0,1,1,29.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,29.69911764705882,8,2,69.55,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,1,36.0,0,0,135.6333,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,3,61.0,0,0,6.2375,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,2,36.0,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,3,31.0,1,1,20.525,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,1,16.0,0,1,57.9792,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,3,29.69911764705882,2,0,23.25,False,1,0,0,1,0,0,0,1,0,0,0,1,0 +0,1,45.5,0,0,28.5,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,1,38.0,0,1,153.4625,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,16.0,2,0,18.0,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,1,29.69911764705882,1,0,133.65,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,29.0,1,0,66.6,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,1,41.0,0,0,134.5,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,3,45.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,45.0,0,0,35.5,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,2,2.0,1,1,26.0,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +1,1,24.0,3,2,263.0,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,2,28.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,2,25.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,2,36.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,2,24.0,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,2,40.0,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,3,29.69911764705882,1,0,16.1,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,3,3.0,1,1,15.9,False,0,1,0,0,1,1,0,0,0,0,1,0,0 +0,3,42.0,0,0,8.6625,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,23.0,0,0,9.225,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,29.69911764705882,0,0,35.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,15.0,1,1,7.2292,False,0,1,1,0,0,1,0,0,1,0,0,0,0 +0,3,25.0,1,0,17.8,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.225,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,3,28.0,0,0,9.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,22.0,0,1,55.0,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,2,38.0,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,3,29.69911764705882,0,0,7.8792,True,1,0,0,1,0,0,0,1,0,1,0,0,0 +1,3,29.69911764705882,0,0,7.8792,True,1,0,0,1,0,0,0,1,0,1,0,0,0 +0,3,40.0,1,4,27.9,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,2,29.0,1,0,27.7208,False,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,3,45.0,0,1,14.4542,False,1,0,1,0,0,0,0,1,0,0,1,0,0 +0,3,35.0,0,0,7.05,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,1,0,15.5,False,0,1,0,1,0,0,1,0,0,0,1,0,0 +0,3,30.0,0,0,7.25,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,1,60.0,1,0,75.25,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,3,29.69911764705882,0,0,7.2292,True,1,0,1,0,0,0,0,1,1,0,0,0,0 +1,3,29.69911764705882,0,0,7.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +1,1,24.0,0,0,69.3,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,1,25.0,1,0,55.4417,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,18.0,1,0,6.4958,False,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,19.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,22.0,0,0,135.6333,True,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,3.0,3,1,21.075,False,1,0,0,0,1,1,0,0,0,0,1,0,0 +1,1,29.69911764705882,1,0,82.1708,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,3,22.0,0,0,7.25,True,1,0,0,0,1,0,0,1,1,0,0,0,0 +0,1,27.0,0,2,211.5,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,20.0,0,0,4.0125,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,3,19.0,0,0,7.775,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,1,42.0,0,0,227.525,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,3,1.0,0,2,15.7417,False,1,0,1,0,0,1,0,0,0,0,1,0,0 +0,3,32.0,0,0,7.925,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,35.0,1,0,52.0,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,18.0,0,0,73.5,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,1.0,5,2,46.9,False,0,1,0,0,1,1,0,0,0,0,0,0,1 +1,2,36.0,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.7292,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,2,17.0,0,0,12.0,True,1,0,1,0,0,0,0,1,0,0,1,0,0 +1,1,36.0,1,2,120.0,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,3,21.0,0,0,7.7958,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,28.0,2,0,7.925,False,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,23.0,1,0,113.275,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,3,24.0,0,2,16.7,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,22.0,0,0,7.7958,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,31.0,0,0,7.8542,True,1,0,0,0,1,0,0,1,1,0,0,0,0 +0,2,46.0,0,0,26.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,2,23.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,28.0,0,0,12.65,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,3,39.0,0,0,7.925,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,26.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,21.0,1,0,9.825,False,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,28.0,1,0,15.85,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,20.0,0,0,8.6625,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,2,34.0,1,0,21.0,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,51.0,0,0,7.75,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,2,3.0,1,1,18.75,False,0,1,0,0,1,1,0,0,0,0,1,0,0 +0,3,21.0,0,0,7.775,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,3,1,25.4667,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,6.8583,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,1,33.0,1,0,90.0,False,1,0,0,1,0,0,0,1,0,0,0,0,1 +0,2,29.69911764705882,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,3,44.0,0,0,7.925,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,8.05,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +1,2,34.0,1,1,32.5,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,2,18.0,0,2,13.0,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,2,30.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,10.0,0,2,24.15,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,3,29.69911764705882,0,0,7.8958,True,0,1,1,0,0,0,1,0,0,1,0,0,0 +0,3,21.0,0,0,7.7333,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +0,3,29.0,0,0,7.875,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,28.0,1,1,14.4,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,18.0,1,1,20.2125,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.25,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,2,28.0,1,0,26.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,2,19.0,0,0,26.0,True,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,29.69911764705882,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,3,32.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,28.0,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,3,29.69911764705882,1,0,16.1,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,2,42.0,1,0,26.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,17.0,0,0,7.125,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,1,50.0,1,0,55.9,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,1,14.0,1,2,120.0,False,1,0,0,0,1,1,0,0,0,0,0,0,1 +0,3,21.0,2,2,34.375,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,2,24.0,2,3,18.75,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,1,64.0,1,4,263.0,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,2,31.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,45.0,1,1,26.25,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,20.0,0,0,9.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,25.0,1,0,7.775,False,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,2,28.0,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,3,29.69911764705882,0,0,8.1125,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,4.0,0,2,81.8583,False,0,1,0,0,1,1,0,0,0,0,0,0,1 +1,2,13.0,0,1,19.5,False,1,0,0,0,1,1,0,0,0,0,1,0,0 +1,1,34.0,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,3,5.0,2,1,19.2583,False,1,0,1,0,0,1,0,0,0,0,1,0,0 +1,1,52.0,0,0,30.5,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,2,36.0,1,2,27.75,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,29.69911764705882,1,0,19.9667,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,1,30.0,0,0,27.75,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +1,1,49.0,1,0,89.1042,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,29.69911764705882,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,29.0,0,0,7.8958,True,0,1,1,0,0,0,1,0,0,1,0,0,0 +0,1,65.0,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,1,29.69911764705882,1,0,51.8625,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,2,50.0,0,0,10.5,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,29.69911764705882,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,1,48.0,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,34.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,47.0,0,0,38.5,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,2,48.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,29.69911764705882,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,38.0,0,0,7.05,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,2,29.69911764705882,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,1,56.0,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,29.69911764705882,0,0,7.725,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,3,0.75,2,1,19.2583,False,1,0,1,0,0,1,0,0,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.25,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,38.0,0,0,8.6625,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,33.0,1,2,27.75,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,2,23.0,0,0,13.7917,True,1,0,1,0,0,0,0,1,0,0,1,0,0 +0,3,22.0,0,0,9.8375,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,1,29.69911764705882,0,0,52.0,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,2,34.0,1,0,21.0,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,29.0,1,0,7.0458,False,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,22.0,0,0,7.5208,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,3,2.0,0,1,12.2875,False,1,0,0,0,1,1,0,0,0,0,1,0,0 +0,3,9.0,5,2,46.9,False,0,1,0,0,1,1,0,0,0,0,0,0,1 +0,2,29.69911764705882,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,50.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,63.0,0,0,9.5875,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +1,1,25.0,1,0,91.0792,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,29.69911764705882,3,1,25.4667,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,1,35.0,1,0,90.0,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,1,58.0,0,0,29.7,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,3,30.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,9.0,1,1,15.9,False,0,1,0,0,1,1,0,0,0,0,1,0,0 +0,3,29.69911764705882,1,0,19.9667,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,21.0,0,0,7.25,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,1,55.0,0,0,30.5,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,1,71.0,0,0,49.5042,True,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,21.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,14.4583,True,0,1,1,0,0,0,1,0,0,0,1,0,0 +1,1,54.0,1,0,78.2667,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,3,29.69911764705882,0,0,15.1,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,1,25.0,1,2,151.55,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,24.0,0,0,7.7958,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,17.0,0,0,8.6625,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,21.0,0,0,7.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,3,29.69911764705882,0,0,7.6292,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,3,37.0,0,0,9.5875,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +1,1,16.0,0,0,86.5,True,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,1,18.0,1,0,108.9,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +1,2,33.0,0,2,26.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,1,29.69911764705882,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,28.0,0,0,22.525,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,3,26.0,0,0,56.4958,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,3,29.0,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,36.0,0,0,26.2875,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,1,54.0,1,0,59.4,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,3,24.0,0,0,7.4958,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,1,47.0,0,0,34.0208,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,2,34.0,0,0,10.5,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,29.69911764705882,0,0,24.15,True,0,1,0,1,0,0,1,0,0,0,0,1,0 +1,2,36.0,1,0,26.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,32.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,30.0,0,0,93.5,True,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,22.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,7.225,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +1,1,44.0,0,1,57.9792,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,3,29.69911764705882,0,0,7.2292,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,3,40.5,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,2,50.0,0,0,10.5,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,1,29.69911764705882,0,0,221.7792,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,39.0,0,0,7.925,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,23.0,2,1,11.5,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,2,2.0,1,1,26.0,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,3,29.69911764705882,0,0,7.2292,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,3,17.0,1,1,7.2292,False,0,1,1,0,0,0,1,0,1,0,0,0,0 +1,3,29.69911764705882,0,2,22.3583,False,1,0,1,0,0,0,0,1,0,0,0,1,0 +0,3,30.0,0,0,8.6625,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +1,2,7.0,0,2,26.25,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,1,45.0,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,1,30.0,0,0,106.425,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,3,29.69911764705882,0,0,14.5,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,1,22.0,0,2,49.5,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,1,36.0,0,2,71.0,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,9.0,4,2,31.275,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,3,11.0,4,2,31.275,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +1,2,32.0,1,0,26.0,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,1,50.0,1,0,106.425,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,1,64.0,0,0,26.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,2,19.0,1,0,26.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,2,29.69911764705882,0,0,13.8625,True,0,1,1,0,0,0,1,0,0,0,1,0,0 +0,3,33.0,1,1,20.525,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,2,8.0,1,1,36.75,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +1,1,17.0,0,2,110.8833,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,2,27.0,0,0,26.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,29.69911764705882,0,0,7.8292,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,3,22.0,0,0,7.225,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +1,3,22.0,0,0,7.775,True,1,0,0,0,1,0,0,1,1,0,0,0,0 +0,1,62.0,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,1,48.0,1,0,39.6,False,1,0,1,0,0,0,0,1,0,0,0,1,0 +0,1,29.69911764705882,0,0,227.525,True,0,1,1,0,0,0,1,0,0,0,0,0,1 +1,1,39.0,1,1,79.65,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,3,36.0,1,0,17.4,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +0,3,40.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,28.0,0,0,13.5,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,29.69911764705882,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,8.05,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,24.0,2,0,24.15,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,19.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.0,0,4,21.075,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.2292,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +1,3,32.0,0,0,7.8542,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,2,62.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,53.0,2,0,51.4792,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,1,36.0,0,0,26.3875,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,3,29.69911764705882,0,0,7.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,3,16.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,19.0,0,0,14.5,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,2,34.0,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,1,39.0,1,0,55.9,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,29.69911764705882,1,0,14.4583,False,1,0,1,0,0,0,0,1,0,0,1,0,0 +1,3,32.0,0,0,7.925,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,25.0,1,1,30.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,1,39.0,1,1,110.8833,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,2,54.0,0,0,26.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,1,36.0,0,0,40.125,True,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,29.69911764705882,0,0,8.7125,True,0,1,1,0,0,0,1,0,0,1,0,0,0 +1,1,18.0,0,2,79.65,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,2,47.0,0,0,15.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,1,60.0,1,1,79.2,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,22.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,35.0,0,0,7.125,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,1,52.0,1,0,78.2667,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,3,47.0,0,0,7.25,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,0,2,7.75,False,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,2,37.0,1,0,26.0,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,36.0,1,1,24.15,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,2,29.69911764705882,0,0,33.0,True,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,49.0,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,0,0,7.225,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +1,1,49.0,1,0,56.9292,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +1,2,24.0,2,1,27.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,29.69911764705882,0,0,42.4,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,44.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,35.0,0,0,26.55,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,3,36.0,1,0,15.55,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,30.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,27.0,0,0,30.5,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,2,22.0,1,2,41.5792,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,1,40.0,0,0,153.4625,True,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,39.0,1,5,31.275,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,29.69911764705882,0,0,7.05,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,3,29.69911764705882,1,0,15.5,False,1,0,0,1,0,0,0,1,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +0,3,35.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,24.0,1,2,65.0,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,34.0,1,1,14.4,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,26.0,1,0,16.1,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,2,4.0,2,1,39.0,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,2,26.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,27.0,1,0,14.4542,False,0,1,1,0,0,0,1,0,0,0,1,0,0 +1,1,42.0,1,0,52.5542,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,3,20.0,1,1,15.7417,False,0,1,1,0,0,0,1,0,0,0,1,0,0 +0,3,21.0,0,0,7.8542,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,21.0,0,0,16.1,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,1,61.0,0,0,32.3208,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,2,57.0,0,0,12.35,True,0,1,0,1,0,0,1,0,0,0,1,0,0 +1,1,21.0,0,0,77.9583,True,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,26.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,7.7333,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,1,80.0,0,0,30.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,51.0,0,0,7.0542,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,1,32.0,0,0,30.5,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,1,29.69911764705882,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,9.0,3,2,27.9,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +1,2,28.0,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,32.0,0,0,7.925,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,31.0,1,1,26.25,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,41.0,0,5,39.6875,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,29.69911764705882,1,0,16.1,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,20.0,0,0,7.8542,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,1,24.0,0,0,69.3,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,3,2.0,3,2,27.9,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +1,3,29.69911764705882,0,0,56.4958,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,3,0.75,2,1,19.2583,False,1,0,1,0,0,1,0,0,0,0,1,0,0 +1,1,48.0,1,0,76.7292,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,19.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,56.0,0,0,35.5,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,3,29.69911764705882,0,0,7.55,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,3,23.0,0,0,7.55,True,1,0,0,0,1,0,0,1,1,0,0,0,0 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,18.0,0,1,23.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,21.0,0,0,8.4333,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,29.69911764705882,0,0,7.8292,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,3,18.0,0,0,6.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,2,24.0,2,0,73.5,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,32.0,1,1,15.5,False,1,0,0,1,0,0,0,1,0,0,1,0,0 +0,2,23.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,1,58.0,0,2,113.275,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +1,1,50.0,2,0,133.65,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,40.0,0,0,7.225,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,1,47.0,0,0,25.5875,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,36.0,0,0,7.4958,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,3,20.0,1,0,7.925,False,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,32.0,2,0,73.5,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,2,25.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.775,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,43.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,29.69911764705882,1,0,52.0,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,2,40.0,1,1,39.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,1,31.0,1,0,52.0,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,2,70.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,31.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,2,29.69911764705882,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,18.0,0,0,7.775,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,24.5,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,18.0,0,0,9.8417,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,43.0,1,6,46.9,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,1,36.0,0,1,512.3292,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,29.69911764705882,0,0,8.1375,True,1,0,0,1,0,0,0,1,0,1,0,0,0 +1,1,27.0,0,0,76.7292,True,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,20.0,0,0,9.225,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,14.0,5,2,46.9,False,0,1,0,0,1,1,0,0,0,0,0,0,1 +0,2,60.0,1,1,39.0,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,2,25.0,1,2,41.5792,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,14.0,4,1,39.6875,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +0,3,19.0,0,0,10.1708,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,18.0,0,0,7.7958,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,1,15.0,0,1,211.3375,False,1,0,0,0,1,1,0,0,0,0,0,0,1 +1,1,31.0,1,0,57.0,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,3,4.0,0,1,13.4167,False,1,0,1,0,0,1,0,0,0,0,1,0,0 +1,3,29.69911764705882,0,0,56.4958,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,25.0,0,0,7.225,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,1,60.0,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,2,52.0,0,0,13.5,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,44.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,29.69911764705882,0,0,7.7333,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,1,49.0,1,1,110.8833,False,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,42.0,0,0,7.65,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,1,18.0,1,0,227.525,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,1,35.0,0,0,26.2875,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,18.0,0,1,14.4542,False,1,0,1,0,0,0,0,1,0,0,1,0,0 +0,3,25.0,0,0,7.7417,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +0,3,26.0,1,0,7.8542,False,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,2,39.0,0,0,26.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,2,45.0,0,0,13.5,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,1,42.0,0,0,26.2875,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,1,22.0,0,0,151.55,True,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,3,29.69911764705882,1,1,15.2458,False,0,1,1,0,0,0,1,0,0,0,1,0,0 +1,1,24.0,0,0,49.5042,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,1,29.69911764705882,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,1,48.0,1,0,52.0,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,29.0,0,0,9.4833,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,52.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,19.0,0,0,7.65,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,1,38.0,0,0,227.525,True,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,2,27.0,0,0,10.5,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,29.69911764705882,0,0,15.5,True,0,1,0,1,0,0,1,0,0,0,1,0,0 +0,3,33.0,0,0,7.775,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,2,6.0,0,1,33.0,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,3,17.0,1,0,7.0542,False,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,2,34.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,2,50.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,1,27.0,1,0,53.1,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,20.0,0,0,8.6625,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,30.0,3,0,21.0,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,3,29.69911764705882,0,0,7.7375,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,2,25.0,1,0,26.0,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,25.0,1,0,7.925,False,1,0,0,0,1,0,0,1,0,1,0,0,0 +1,1,29.0,0,0,211.3375,True,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,11.0,0,0,18.7875,True,0,1,1,0,0,1,0,0,0,0,1,0,0 +0,2,29.69911764705882,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,2,23.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,2,23.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,28.5,0,0,16.1,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,48.0,1,3,34.375,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,1,35.0,0,0,512.3292,True,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,29.69911764705882,0,0,30.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,1,36.0,1,0,78.85,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,1,21.0,2,2,262.375,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,3,24.0,1,0,16.1,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,3,31.0,0,0,7.925,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,70.0,1,1,71.0,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,16.0,1,1,20.25,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,2,30.0,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,1,19.0,1,0,53.1,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,31.0,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,2,4.0,1,1,23.0,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +1,3,6.0,0,1,12.475,False,0,1,0,0,1,1,0,0,0,0,1,0,0 +0,3,33.0,0,0,9.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,23.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,48.0,1,2,65.0,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,2,0.67,1,1,14.5,False,0,1,0,0,1,1,0,0,0,0,1,0,0 +0,3,28.0,0,0,7.7958,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,2,18.0,0,0,11.5,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,34.0,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,33.0,0,0,86.5,True,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,29.69911764705882,0,0,14.5,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,3,41.0,0,0,7.125,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,3,20.0,0,0,7.2292,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +1,1,36.0,1,2,120.0,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,16.0,0,0,7.775,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,1,51.0,1,0,77.9583,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,1,29.69911764705882,0,0,39.6,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,3,30.5,0,0,7.75,True,1,0,0,1,0,0,0,1,1,0,0,0,0 +0,3,29.69911764705882,1,0,24.15,False,0,1,0,1,0,0,1,0,0,0,0,1,0 +0,3,32.0,0,0,8.3625,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,24.0,0,0,9.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,48.0,0,0,7.8542,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,2,57.0,0,0,10.5,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,29.69911764705882,0,0,7.225,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +1,2,54.0,1,3,23.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,18.0,0,0,7.75,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,3,5.0,0,0,12.475,True,1,0,0,0,1,1,0,0,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.7375,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,1,43.0,0,1,211.3375,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,3,13.0,0,0,7.2292,True,1,0,1,0,0,1,0,0,1,0,0,0,0 +1,1,17.0,1,0,57.0,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,1,29.0,0,0,30.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,29.69911764705882,1,2,23.45,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,25.0,0,0,7.05,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,25.0,0,0,7.25,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,3,18.0,0,0,7.4958,True,1,0,0,0,1,0,0,1,1,0,0,0,0 +0,3,8.0,4,1,29.125,False,0,1,0,1,0,1,0,0,0,0,0,1,0 +1,3,1.0,1,2,20.575,False,0,1,0,0,1,1,0,0,0,0,1,0,0 +0,1,46.0,0,0,79.2,True,0,1,1,0,0,0,1,0,0,0,0,0,1 +0,3,29.69911764705882,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +0,2,16.0,0,0,26.0,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,3,29.69911764705882,8,2,69.55,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,1,29.69911764705882,0,0,30.6958,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,3,25.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,39.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,1,49.0,0,0,25.9292,True,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,3,31.0,0,0,8.6833,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,3,30.0,0,0,7.2292,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,3,30.0,1,1,24.15,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,2,34.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,2,31.0,1,1,26.25,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,1,11.0,1,2,120.0,False,0,1,0,0,1,1,0,0,0,0,0,0,1 +1,3,0.42,0,1,8.5167,False,0,1,1,0,0,1,0,0,0,1,0,0,0 +1,3,27.0,0,0,6.975,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,31.0,0,0,7.775,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,1,39.0,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,18.0,0,0,7.775,True,1,0,0,0,1,0,0,1,1,0,0,0,0 +0,2,39.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,1,33.0,1,0,53.1,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,3,26.0,0,0,7.8875,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,39.0,0,0,24.15,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +0,2,35.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,6.0,4,2,31.275,False,1,0,0,0,1,1,0,0,0,0,0,1,0 +0,3,30.5,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,29.69911764705882,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,23.0,0,0,7.925,True,1,0,0,0,1,0,0,1,0,1,0,0,0 +0,2,31.0,1,1,37.0042,False,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,3,43.0,0,0,6.45,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,10.0,3,2,27.9,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +1,1,52.0,1,1,93.5,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,3,27.0,0,0,8.6625,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,1,38.0,0,0,0.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +1,3,27.0,0,1,12.475,False,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,3,2.0,4,1,39.6875,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +0,3,29.69911764705882,0,0,6.95,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,0,0,56.4958,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,2,1.0,0,2,37.0042,False,0,1,1,0,0,1,0,0,0,0,0,1,0 +1,3,29.69911764705882,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 +1,3,15.0,1,0,14.4542,False,1,0,1,0,0,1,0,0,0,0,1,0,0 +1,2,0.83,1,1,18.75,False,0,1,0,0,1,1,0,0,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.2292,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,3,23.0,0,0,7.8542,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,18.0,0,0,8.3,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,39.0,1,1,83.1583,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,3,21.0,0,0,8.6625,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,8.05,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,32.0,0,0,56.4958,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +1,1,29.69911764705882,0,0,29.7,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,3,20.0,0,0,7.925,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,2,16.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,30.0,0,0,31.0,True,1,0,1,0,0,0,0,1,0,0,0,1,0 +0,3,34.5,0,0,6.4375,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,3,17.0,0,0,8.6625,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,42.0,0,0,7.55,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,29.69911764705882,8,2,69.55,False,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,35.0,0,0,7.8958,True,0,1,1,0,0,0,1,0,0,1,0,0,0 +0,2,28.0,0,1,33.0,False,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,1,29.69911764705882,1,0,89.1042,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +0,3,4.0,4,2,31.275,False,0,1,0,0,1,1,0,0,0,0,0,1,0 +0,3,74.0,0,0,7.775,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,9.0,1,1,15.2458,False,1,0,1,0,0,1,0,0,0,0,1,0,0 +1,1,16.0,0,1,39.4,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,2,44.0,1,0,26.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,3,18.0,0,1,9.35,False,1,0,0,0,1,0,0,1,0,1,0,0,0 +1,1,45.0,1,1,164.8667,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +1,1,51.0,0,0,26.55,True,0,1,0,0,1,0,1,0,0,0,0,1,0 +1,3,24.0,0,3,19.2583,False,1,0,1,0,0,0,0,1,0,0,1,0,0 +0,3,29.69911764705882,0,0,7.2292,True,0,1,1,0,0,0,1,0,1,0,0,0,0 +0,3,41.0,2,0,14.1083,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +0,2,21.0,1,0,11.5,False,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,1,48.0,0,0,25.9292,True,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,29.69911764705882,8,2,69.55,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,2,24.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,2,42.0,0,0,13.0,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +1,2,27.0,1,0,13.8583,False,1,0,1,0,0,0,0,1,0,0,1,0,0 +0,1,31.0,0,0,50.4958,True,0,1,0,0,1,0,1,0,0,0,0,0,1 +0,3,29.69911764705882,0,0,9.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,3,4.0,1,1,11.1333,False,0,1,0,0,1,1,0,0,0,0,1,0,0 +0,3,26.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,47.0,1,1,52.5542,False,1,0,0,0,1,0,0,1,0,0,0,0,1 +0,1,33.0,0,0,5.0,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,47.0,0,0,9.0,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,2,28.0,1,0,24.0,False,1,0,1,0,0,0,0,1,0,0,0,1,0 +1,3,15.0,0,0,7.225,True,1,0,1,0,0,1,0,0,1,0,0,0,0 +0,3,20.0,0,0,9.8458,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,19.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,29.69911764705882,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +1,1,56.0,0,1,83.1583,False,1,0,1,0,0,0,0,1,0,0,0,0,1 +1,2,25.0,0,1,26.0,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,33.0,0,0,7.8958,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,22.0,0,0,10.5167,True,1,0,0,0,1,0,0,1,0,0,1,0,0 +0,2,28.0,0,0,10.5,True,0,1,0,0,1,0,1,0,0,1,0,0,0 +0,3,25.0,0,0,7.05,True,0,1,0,0,1,0,1,0,1,0,0,0,0 +0,3,39.0,0,5,29.125,False,1,0,0,1,0,0,0,1,0,0,0,1,0 +0,2,27.0,0,0,13.0,True,0,1,0,0,1,0,1,0,0,0,1,0,0 +1,1,19.0,0,0,30.0,True,1,0,0,0,1,0,0,1,0,0,0,1,0 +0,3,29.69911764705882,1,2,23.45,False,1,0,0,0,1,0,0,1,0,0,0,1,0 +1,1,26.0,0,0,30.0,True,0,1,1,0,0,0,1,0,0,0,0,1,0 +0,3,32.0,0,0,7.75,True,0,1,0,1,0,0,1,0,1,0,0,0,0 diff --git a/ME-390-Exercises/ME-390-09-trees/helpers.py b/ME-390-Exercises/ME-390-09-trees/helpers.py new file mode 100644 index 0000000..56f97ca --- /dev/null +++ b/ME-390-Exercises/ME-390-09-trees/helpers.py @@ -0,0 +1,35 @@ +import numpy as np +import matplotlib.pyplot as plt +import sklearn + +# Source: https://jakevdp.github.io/PythonDataScienceHandbook/05.07-support-vector-machines.html +def plot_svc_decision_function(model, ax=None, plot_support=True): + """Plot the decision function for a 2D SVC""" + + if ax is None: + ax = plt.gca() + xlim = ax.get_xlim() + ylim = ax.get_ylim() + + # create grid to evaluate model + x = np.linspace(xlim[0], xlim[1], 250) + y = np.linspace(ylim[0], ylim[1], 250) + Y, X = np.meshgrid(y, x) + xy = np.vstack([X.ravel(), Y.ravel()]).T + P = model.decision_function(xy).reshape(X.shape) + preds = model.predict(xy).reshape(X.shape) + + + # plot decision boundary and margins + ax.contour(X, Y, P, colors='k', + levels=[-1, 0, 1], alpha=0.5, + linestyles=['--', '-', '--']) + + pcol = plt.pcolormesh(X, Y, preds, cmap="viridis", vmin=-1, vmax=1, alpha=0.03, shading='nearest', antialiased=True) + + # plot support vectors + if plot_support: + ax.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1], s=300, linewidth=1, edgecolors="black", facecolors="none") + + ax.set_xlim(xlim) + ax.set_ylim(ylim) diff --git a/ME-390-Exercises/ME-390-09-trees/images/simple_tree.png b/ME-390-Exercises/ME-390-09-trees/images/simple_tree.png new file mode 100644 index 0000000..00f522c Binary files /dev/null and b/ME-390-Exercises/ME-390-09-trees/images/simple_tree.png differ diff --git a/ME-390-Exercises/ME-390-09-trees/images/thats_all_folks.png b/ME-390-Exercises/ME-390-09-trees/images/thats_all_folks.png new file mode 100644 index 0000000..4e64c7b Binary files /dev/null and b/ME-390-Exercises/ME-390-09-trees/images/thats_all_folks.png differ diff --git a/ME-390-Exercises/ME-390-09-trees/trees.ipynb b/ME-390-Exercises/ME-390-09-trees/trees.ipynb new file mode 100644 index 0000000..1aa01d6 --- /dev/null +++ b/ME-390-Exercises/ME-390-09-trees/trees.ipynb @@ -0,0 +1,888 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "horizontal-strategy", + "metadata": {}, + "source": [ + "# Intro to scikit-learn and decision trees" + ] + }, + { + "cell_type": "markdown", + "id": "breeding-punch", + "metadata": {}, + "source": [ + "
\n", + "\n", + "This notebook is part of a series of exercises for the CIVIL-226 Introduction to Machine Learning for Engineers course and for the ME-390 Course at EPFL. Copyright (c) 2021 [VITA](https://www.epfl.ch/labs/vita/) lab at EPFL \n", + "Use of this source code is governed by an MIT-style license that can be found in the LICENSE file or at https://www.opensource.org/licenses/MIT\n", + "\n", + "**Author(s):** David Mizrahi\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "synthetic-granny", + "metadata": {}, + "source": [ + "This is the final exercise of this course. In this exercise, we'll introduce the scikit-learn package, and use it to train decision trees. We'll end with a small note on how to use scikit-learn for unsupervised learning.\n" + ] + }, + { + "cell_type": "markdown", + "id": "dated-drink", + "metadata": {}, + "source": [ + "## 1. Intro to scikit-learn" + ] + }, + { + "cell_type": "markdown", + "id": "younger-yugoslavia", + "metadata": {}, + "source": [ + "[scikit-learn](https://scikit-learn.org/stable/index.html) is a very popular Python package, built on top of NumPy, which provides efficient implementations of many popular machine learning algorithms.\n", + "\n", + "It can be used for:\n", + "- Generating and loading popular datasets\n", + "- Preprocessing (feature extraction and expansion, normalization)\n", + "- Supervised learning (classification and regression)\n", + "- Unsupervised learning (clustering and dimensionality reduction)\n", + "- Model selection (grid search, train/test split, cross-validation)\n", + "- Evaluation (with many metrics for all kinds of tasks)" + ] + }, + { + "cell_type": "markdown", + "id": "parallel-triple", + "metadata": {}, + "source": [ + "### 1.1. Data representation in scikit-learn" + ] + }, + { + "cell_type": "markdown", + "id": "enabling-magnitude", + "metadata": {}, + "source": [ + "In scikit-learn, data is represented in the same way it was in the previous exercises. That is:\n", + "- The features are represented as a 2D features matrix (usually named `X`), most often contained in a NumPy array or Pandas DataFrame. \n", + "- The label (or target) array is often called `y`, and is usually contained in a NumPy array or Pandas Series.\n", + "- Note: For more information on Pandas package, you can optionally complete the 08-pandas exercises. Both the exercise questions and solutions are provided to you. \n", + "\n", + "In mathematical notation, this is:\n", + "- features: $\\boldsymbol{X} \\in \\mathbb{R}^{N \\times d}$, $\\forall \\ \\boldsymbol{x}^{i} \\in \\boldsymbol{X}: \\boldsymbol{x}^{i} \\in \\mathbb{R}^{d}$\n", + "- label (or target): $\\boldsymbol{y} \\in \\mathbb{R}^{N}$ \n", + "where $N$ is the number of examples in our dataset, and $d$ is the number of features per example \n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "suffering-replication", + "metadata": {}, + "source": [ + "scikit-learn offers many utilities for splitting and preprocessing data. \n", + "- For splitting data, there are functions such as [`model_selection.train_test_split()`](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html#sklearn.model_selection.train_test_split) which splits arrays or matrices into random train and test subsets, or [`model_selection.KFold()`](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html#sklearn.model_selection.KFold) and similar functions which provides train/test indices for cross-validation. These functions are extremely handy, and are often used to split NumPy or Pandas arrays even when the training and models come from a library other than scikit-learn.\n", + "- For preprocessing data, scikit-learn offers many utility functions which can standardize data (e.g. [`preprocessing.StandardScaler()`](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html#sklearn.preprocessing.StandardScaler)), impute, discretize and perform feature expansion. For more information, refer to the [official preprocessing tutorial](https://scikit-learn.org/stable/modules/preprocessing.html#)." + ] + }, + { + "cell_type": "markdown", + "id": "jewish-survival", + "metadata": {}, + "source": [ + "### 1.2. Estimator API\n", + "\n", + "\n", + "For **supervised learning**, scikit-learn implements many algorithms we've seen in this class such as:\n", + "- Nearest neighbors\n", + "- Linear regression\n", + "- Logistic regression\n", + "- Decision trees\n", + "\n", + "\n", + "In scikit-learn, these algorithms are called **estimators**, and they use a uniform programming approach, which makes it very easy to switch to a new model or algorithm. An estimator is what we referred to as a **predictor** in our course. It specifies the function $f$ that maps a given feature $x \\in \\mathbb{R}^d$ to its associated label $f(x) \\in \\mathbb{R}$. \n", + "\n", + "Here is an example of many of the estimators available with scikit-learn. [Source](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html)\n", + "![](https://scikit-learn.org/stable/_images/sphx_glr_plot_classifier_comparison_001.png)\n" + ] + }, + { + "cell_type": "markdown", + "id": "animal-gallery", + "metadata": {}, + "source": [ + "Here are the steps to follow when using the scikit-learn estimator API:\n", + "1. Arrange data into a features matrix (`X`) and target vector (`y`).\n", + "2. Choose a class of model by importing the appropriate estimator class (e.g. `linear_model.LogisticRegression()`, `svm.SVC()`, etc...)\n", + "3. Choose model hyperparameters by instantiating this class with desired values.\n", + "4. Fit the model to your data by calling the `fit()` method of the model instance.\n", + "5. Apply the model to new data: for supervised learning, we predict labels for unknown data using the `predict()` method.\n", + "\n", + "The steps to follow when using scikit-learn estimators for unsupervised learning are almost identical." + ] + }, + { + "cell_type": "markdown", + "id": "eccfabd5-0ce9-4da6-a8e1-4fd11dd54e8f", + "metadata": {}, + "source": [ + "**Question**: Take a look at the first two datasets shown on the left of rows 1 and 2 above? Note that these are test datasets and the accuracy with resepct to this dataset is written. Which approaches have the best performance in the first row? What about in the second row? Notice that we have not covered all these approaches. Don't worry about it. Simply take this as an output given to you and try to analyze the output. How do you expect logistic regression would perform for these two datasets? " + ] + }, + { + "cell_type": "markdown", + "id": "81d8efa1-f80a-4997-8dcb-350cbb4e4a7a", + "metadata": {}, + "source": [ + "**Answer**: For the first row data set, Nearest neighbor, RBF SVM and Gaussian process achieve the highest accuracy of 97%. For the second row data set, Nearest neighbor approach achieves the highest accuracy of 90%. The data does not look linearly separable. Since logistic regression (without any nonlinear transformation of features), separates the data using a affine function, we don't expect it to perform too well. " + ] + }, + { + "cell_type": "markdown", + "id": "designing-wagon", + "metadata": {}, + "source": [ + "### 1.3. Example - Logistic regression on the Iris dataset." + ] + }, + { + "cell_type": "markdown", + "id": "answering-institution", + "metadata": {}, + "source": [ + "As an example, we'll walk through how to use scikit-learn to train a logistic regression model for multi-class classification on the Iris dataset. You can simply run the following cells and there is **no need to write any code here**. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fixed-shannon", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "sns.set_theme(style=\"white\", context=\"notebook\", palette=\"dark\")\n", + "# !!! sklearn is how the scikit-learn package is called in Python\n", + "import sklearn" + ] + }, + { + "cell_type": "markdown", + "id": "unable-investigation", + "metadata": {}, + "source": [ + "#### 1.3.1. Loading the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "reliable-packing", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn import datasets\n", + "# Iris is a dataset , which is directly available in sklearn.datasets\n", + "iris = datasets.load_iris()\n", + "\n", + "X = iris.data[:, :2] # we only take the first two features for simpler visualizations\n", + "y = iris.target\n", + "\n", + "print(f\"Type of X: {type(X)} | Shape of X: {X.shape}\")\n", + "print(f\"Type of y: {type(y)} | Shape of y: {y.shape}\")" + ] + }, + { + "cell_type": "markdown", + "id": "absent-command", + "metadata": {}, + "source": [ + "#### 1.3.2. Splitting and scaling" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ordered-blind", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "# Split data using train_test_split, use 30% of the data as a test set and set a random state for reproducibility\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n", + "\n", + "print(f\"Shape of X_train: {X_train.shape} | Shape of y_train: {y_train.shape}\")\n", + "print(f\"Shape of X_test: {X_test.shape} | Shape of y_test: {y_test.shape}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "miniature-brunswick", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "# Fit with the mean / std of the training data\n", + "scaler.fit(X_train)\n", + "\n", + "# Scale both the training / test data\n", + "X_train = scaler.transform(X_train)\n", + "X_test = scaler.transform(X_test)\n", + "\n", + "print(f\"Mean of X_train: {X_train.mean():.3f}| Std of X_train: {X_train.std():.3f}\")\n", + "print(f\"Mean of X_test: {X_test.mean():.3f}| Std of X_test: {X_test.std():.3f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "bc775bf4-2211-4fa4-bdc5-6ab54d21f619", + "metadata": { + "tags": [] + }, + "source": [ + "**Question**: What does the function StandardScalar() above do? You can read about standardization in sklearn [Here](https://scikit-learn.org/stable/modules/preprocessing.html#)" + ] + }, + { + "cell_type": "markdown", + "id": "frozen-indonesia", + "metadata": { + "tags": [] + }, + "source": [ + "#### 1.3.3. Training" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "neither-disposition", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import LogisticRegression\n", + "\n", + "# Initialize a logistic regression model with L2 regularization \n", + "# and regularization strength 1e-4 ( C is inverse of regularization weight)\n", + "logreg = LogisticRegression(penalty=\"l2\", C=1e4)\n", + "\n", + "# Train the model\n", + "logreg.fit(X_train, y_train)\n", + "\n", + "# Get train accuracy\n", + "train_acc = logreg.score(X_train, y_train)\n", + "print(f\"Train accuracy: {train_acc * 100:.2f}%\")" + ] + }, + { + "cell_type": "markdown", + "id": "otherwise-snowboard", + "metadata": {}, + "source": [ + "#### 1.3.4. Decision boundaries" + ] + }, + { + "cell_type": "markdown", + "id": "beneficial-impression", + "metadata": {}, + "source": [ + "We can use matplotlib to view the decision boundaries of our trained model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "posted-contents", + "metadata": {}, + "outputs": [], + "source": [ + "# This code is beyond the scope of this class, no need to understand what it does.\n", + "# Source: https://scikit-learn.org/stable/auto_examples/linear_model/plot_iris_logistic.html\n", + "# Plot the decision boundary. For that, we will assign a color to each\n", + "# point in the mesh [x_min, x_max]x[y_min, y_max].\n", + "x_min, x_max = X_train[:, 0].min() - .5, X_train[:, 0].max() + .5\n", + "y_min, y_max = X_train[:, 1].min() - .5, X_train[:, 1].max() + .5\n", + "h = .02 # step size in the mesh\n", + "xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n", + "Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])\n", + "\n", + "# Put the result into a color plot\n", + "Z = Z.reshape(xx.shape)\n", + "plt.figure()\n", + "plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired, shading='auto', alpha=0.1, antialiased=True)\n", + "\n", + "# Plot also the training points\n", + "scatter = plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors='k', cmap=plt.cm.Paired)\n", + "plt.xlabel('Sepal length')\n", + "plt.ylabel('Sepal width')\n", + "\n", + "plt.xlim(xx.min(), xx.max())\n", + "plt.ylim(yy.min(), yy.max())\n", + "plt.legend(handles=scatter.legend_elements()[0], labels=list(iris.target_names))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "forty-portsmouth", + "metadata": {}, + "source": [ + "#### 1.3.5. Test accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "deadly-recorder", + "metadata": {}, + "outputs": [], + "source": [ + "# Get test accuracy\n", + "test_acc = logreg.score(X_test, y_test)\n", + "print(f\"Test accuracy: {test_acc * 100:.2f}%\")" + ] + }, + { + "cell_type": "markdown", + "id": "electric-tradition", + "metadata": {}, + "source": [ + "#### 1.3.6. Other metrics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "global-basis", + "metadata": {}, + "outputs": [], + "source": [ + "# We can easily use other metrics using sklearn.metrics\n", + "from sklearn.metrics import balanced_accuracy_score\n", + "\n", + "# First we'll use the balanced accuracy\n", + "y_pred_train = logreg.predict(X_train)\n", + "train_balanced_acc = balanced_accuracy_score(y_train, y_pred_train)\n", + "\n", + "y_pred_test = logreg.predict(X_test)\n", + "test_balanced_acc = balanced_accuracy_score(y_test, y_pred_test)\n", + "\n", + "print(f\"Train balanced acc: {train_balanced_acc*100:.2f}%\")\n", + "print(f\"Test balanced acc: {test_balanced_acc*100:.2f}%\")" + ] + }, + { + "cell_type": "markdown", + "id": "48e59a8d-dd43-4802-9a7d-cadf7c33af8b", + "metadata": {}, + "source": [ + "**Question:** Under which condition on data labels would the balanced accuracy be the same as the accuracy computed originally? You may read about balanced_accuracy_score [Here](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.balanced_accuracy_score.html)" + ] + }, + { + "cell_type": "markdown", + "id": "4fa2c674-f64c-4b79-8380-be9d0aafd8b0", + "metadata": {}, + "source": [ + "Recall that we saw the confusion matrix in a binary classification setting. \n", + "For $K$ classes (also referred to as categories), the confusion matrix $C$ is a $K$ by $K$ matrix, where\n", + "the diagonal element $C_{ii}$ denotes the number of correctly labelled class $i$ samples. The off-diagonal entri $C_{ij}$ denotes the number of class $j$ samples that are labelled mistakenly as class $i$. " + ] + }, + { + "cell_type": "markdown", + "id": "65154a84-97b3-4850-bd59-dcad839329fc", + "metadata": {}, + "source": [ + "**Question:** based on the accuracy score above, and given that the test dataset has 45 samples, what would be the sum of diagonal entries of the confusion matrix for this particular probnlem? What about the sum of off-diagonal entries? You can verify your answers with the matrix below. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "designing-indonesian", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sklearn.metrics import plot_confusion_matrix\n", + "# Now we'll plot the confusion matrix of the testing data\n", + "\n", + "plot_confusion_matrix(logreg, X_test, y_test, display_labels=iris.target_names, cmap=plt.cm.Blues)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c6695c47-6bec-4117-8a48-d3c7a3f88348", + "metadata": {}, + "source": [ + "### 1.4 A note on unsupervised learning: \n", + "While we won't cover them in this exercise, most of the unsupervised learning techniques seen in class can be easily implemented with scikit-learn.\n", + "\n", + "To learn more about how to practically implement these techniques, check out these resources:\n", + "\n", + "**For dimensionality reduction:**\n", + "- [PCA from the Python Data Science handbook](https://jakevdp.github.io/PythonDataScienceHandbook/05.09-principal-component-analysis.html)\n", + "- [Decomposition page on scikit-learn's website](https://scikit-learn.org/stable/modules/decomposition.html)\n", + "\n", + "**For clustering:**\n", + "- [k-means from the Python Data Science handbook](https://jakevdp.github.io/PythonDataScienceHandbook/05.11-k-means.html)\n", + "- [Clustering page on scikit-learn's website](https://scikit-learn.org/stable/modules/clustering.html)\n" + ] + }, + { + "cell_type": "markdown", + "id": "varying-retro", + "metadata": {}, + "source": [ + "### 1.5. Additional scikit-learn resources\n", + "\n", + "This tutorial very briefly covers the scikit-learn package, and how it can be used to train a simple classifier. This package is capable of a lot more than what was shown here, as you will see in the rest of this exercise. If you want a more in-depth look at scikit-learn, take a look at these resources:\n", + "\n", + "- scikit-learn Getting Started tutorial: https://scikit-learn.org/stable/getting_started.html\n", + "- scikit-learn User Guide: https://scikit-learn.org/stable/user_guide.html\n", + "- scikit-learn cheatsheet by Datacamp: https://s3.amazonaws.com/assets.datacamp.com/blog_assets/Scikit_Learn_Cheat_Sheet_Python.pdf\n", + "- scikit-learn tutorial from the Python Data Science Handbook: https://jakevdp.github.io/PythonDataScienceHandbook/05.02-introducing-scikit-learn.html" + ] + }, + { + "cell_type": "markdown", + "id": "suspected-badge", + "metadata": {}, + "source": [ + "## 2. Decision Trees" + ] + }, + { + "cell_type": "markdown", + "id": "played-canberra", + "metadata": {}, + "source": [ + "Decision trees are a very intuitive way to classify objects: they ask a series of questions to infer the target variable. \n", + "\n", + "A decision tree is a set of nested decision rules. At each node $i$, the $d_i$-th feature of the input vector $ \\boldsymbol{x}$ is compared to a treshold value $t$. The vector $\\boldsymbol{x}$ is passed down to the left or right branch depending on whether $d_i$ is less than or greater than $t$. This process is repeated for each node encountered until a reaching leaf node, which specifies the predicted output." + ] + }, + { + "cell_type": "markdown", + "id": "fixed-bride", + "metadata": {}, + "source": [ + "\n", + "\n", + "*Example of a simple decision tree on the Palmer Penguins dataset*" + ] + }, + { + "cell_type": "markdown", + "id": "developmental-month", + "metadata": {}, + "source": [ + "Decision trees are usually constructed from the top-down, by choosing a feature at each step that best splits the set of items. The problem of choosing the best feature and threshold is a very challenging optimization problem. Hence, there has been a number of different criteria for measuring the \"best\" feature to pick, such as the Gini impurity and the entropy / information gain. We won't dive into them in this course. You should just understand that there are different ways to measure \"best\" and often algorithms provide an approximation of the \"optimal\" decision tree. For further information, you may see StatQuest videos on decision trees and you can also see Chapter 18 of [\"Probabilistic Machine Learning: An Introduction\"](https://probml.github.io/pml-book/) by K.P. Murphy.\n", + "\n", + "Decision trees are popular for several reasons:\n", + "- They are **easy to interpret**.\n", + "- They can handle mixed discrete and continuous inputs. \n", + "- They are insensitive to monotone transformations of the inputs, so there is no need to standardize the data.\n", + "- They perform automatic feature selection.\n", + "- They are fast to fit, and scale well to large data sets.\n", + "\n", + "Unfortunately, trees usually do not predict as accurately as other models we have seen previously, such as neural networks and SVMs.\n", + "\n", + "It is however possible to significantly improve their performance through an ensemble learning method called **random forests**, which consists of constructing a multitude of decision trees at training time and averaging their outputs at test time. While random forests usually perform better than a single decision tree, they are much less interpretable. We won't cover random forests in this exercise, but keep in mind that they can be easily implemented in scikit-learn using the [`ensemble` module](https://scikit-learn.org/stable/modules/ensemble.html). " + ] + }, + { + "cell_type": "markdown", + "id": "supposed-respondent", + "metadata": {}, + "source": [ + "### 2.1. Training decision trees" + ] + }, + { + "cell_type": "markdown", + "id": "unexpected-dictionary", + "metadata": {}, + "source": [ + "In this part, we will work on the Titanic dataset obtained at the end of the `08-pandas` exercise. Notice that going through the `08-pandas` is not required but can help you understand the dataset better. In particular, the data set contains the following entries in its columns:\n", + "- **survived**: Survival of the passenger (0 = No, 1 = Yes)\n", + "- **pclass**: Ticket class (1= 1st, 2 = 2nd, 3 = 3rd)\n", + "- **age**: Age\n", + "- **sibsp**: # of siblings / spouses aboard the Titanic\n", + "- **parch**: # of parents / children aboard the Titanic\n", + "- **fare**: Passenger fare\n", + "- **alone**: Whether the passenger is alone or not\n", + "- **sex**: Sex in {female, male} (2 columns one-hot)\n", + "- **embark_town**: Port of embarkation in {Southampton, Cherbourg, Queenstown} (3 columns one-hot)\n", + "- **who**: Child, man, or woman (3 columns one-hot)\n", + "- **fare_group**: Fare group in {(-0.001,7.854], (7.854, 10.5], (10.5, 21.679], (21.679, 39.688], (39.688, 512.329]} (5 columns one-hot)\n", + "\n", + "Note, that some of the features here differ from those in exercise 08-pandas. In the following, our goal is to train a model to predict whether or not a passenger survived the shipwreck and to find out which features are the most useful for predicting this." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "behind-practice", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "titanic = pd.read_csv(\"data/titanic.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "short-engagement", + "metadata": {}, + "outputs": [], + "source": [ + "titanic.head(5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "polish-supply", + "metadata": {}, + "outputs": [], + "source": [ + "# Split into X and y\n", + "X = titanic.drop(columns=\"survived\")\n", + "y = titanic[\"survived\"]\n", + "\n", + "# Convert to NumPy (needed for interpretability function later on)\n", + "X_numpy, y_numpy = X.to_numpy(), y.to_numpy()\n", + "\n", + "# Use 80% of data for train/val, 20% for test\n", + "X_trainval, X_test, y_trainval, y_test = train_test_split(X_numpy, y_numpy, test_size=0.2, random_state=42)\n", + "# Use 80% of trainval for train, 20% for val\n", + "X_train, X_val, y_train, y_val = train_test_split(X_trainval, y_trainval, test_size=0.2, random_state=42)\n" + ] + }, + { + "cell_type": "markdown", + "id": "sitting-consciousness", + "metadata": {}, + "source": [ + "It is now your turn to train decision trees in scikit-learn. They follow the same estimator API as all other supervised learning models, so the implementation is very straightforward. For more information, check out the [`tree` module](https://scikit-learn.org/stable/modules/tree.html#tree) and the [documentation of `DecisionTreeClassifier`](https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html).\n", + "\n", + "**Your task:** Initialize a `DecisionTreeClassifier` and train it on `X_train` and `y_train`.\n", + "For the initialization of the `DecisionTreeClassifier`, provide the following optional arguments:\n", + "- Use \"gini\" as the `criterion`\n", + "- Try out different values for the `max_depth` of the tree. How does it affect the train and validation accuracy?" + ] + }, + { + "cell_type": "markdown", + "id": "c6e1faea-6d77-450a-a66e-ea8cff86bba7", + "metadata": {}, + "source": [ + "**Question:** What fraction of the original data set is used for validation? Why is the test set not used for validation? " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "known-bronze", + "metadata": {}, + "outputs": [], + "source": [ + "import sklearn.tree as tree\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "\n", + "# Initialize and train your decision tree model\n", + "# Try varying the max_depth parameter\n", + "max_depth = 3\n", + "model = DecisionTreeClassifier(criterion=\"gini\", max_depth=max_depth)\n", + "model.fit(X_train,y_train)\n", + "\n", + "train_acc = model.score(X_train, y_train)\n", + "print(f\"Train accuracy: {train_acc * 100:.2f}%\")\n", + "\n", + "val_acc = model.score(X_val, y_val)\n", + "print(f\"Validation accuracy: {val_acc * 100:.2f}%\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "boolean-quick", + "metadata": {}, + "outputs": [], + "source": [ + "test_acc = model.score(X_test, y_test)\n", + "print(f\"Test accuracy: {test_acc * 100:.2f}%\")" + ] + }, + { + "cell_type": "markdown", + "id": "legislative-monroe", + "metadata": {}, + "source": [ + "**Answer:** YOUR ANSWER HERE" + ] + }, + { + "cell_type": "markdown", + "id": "continued-general", + "metadata": {}, + "source": [ + "### 2.2. Interpretability of trees" + ] + }, + { + "cell_type": "markdown", + "id": "respective-velvet", + "metadata": {}, + "source": [ + "In this section, we'll show you how to visualize decision trees and interpret the decision made for some examples of our test set.\n", + "\n", + "**Your task:** Run the next few cells to better understand the structure of the tree you just built. Can you identify which features are the most important for predicting whether or not a passenger survived? Note that some data point is passed to the left of some non-leaf node if the condition corresponding to the node is true and to the right if it is false.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abstract-strain", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Plots the decision tree\n", + "# Try out a max plot depth of 2 or 3, tree will be hard to read otherwise\n", + "plt.figure(figsize=(30, 10))\n", + "tree.plot_tree(model, max_depth=max_depth, filled=True, feature_names=X.columns, class_names=[\"Perished\", \"Survived\"], \n", + " impurity=True, proportion=True, rounded=True)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "driving-ebony", + "metadata": {}, + "outputs": [], + "source": [ + "# Prints the decision tree as text\n", + "# Will be very long if max depth is high\n", + "# Class 0 = Perished, Class 1 = Survived\n", + "print(tree.export_text(model, feature_names=list(X.columns)))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "local-billion", + "metadata": {}, + "outputs": [], + "source": [ + "# Explaining the decisions (complicated code, no need to understand what it does exactly)\n", + "def explain_decision(sample_id: int = 0):\n", + " \"\"\"Prints rules followed to obtain prediction for a sample of the test set\n", + " \n", + " Code adapted from: \n", + " https://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html\n", + " \"\"\"\n", + " sample_id = sample_id\n", + " class_names=[\"Perished\", \"Survived\"]\n", + " n_nodes = model.tree_.node_count\n", + " children_left = model.tree_.children_left\n", + " children_right = model.tree_.children_right\n", + " feature = model.tree_.feature\n", + " threshold = model.tree_.threshold\n", + "\n", + " node_indicator = model.decision_path(X_test)\n", + " leaf_id = model.apply(X_test)\n", + " # obtain ids of the nodes `sample_id` goes through, i.e., row `sample_id`\n", + " node_index = node_indicator.indices[node_indicator.indptr[sample_id]:\n", + " node_indicator.indptr[sample_id + 1]]\n", + "\n", + " prediction = class_names[model.predict(X_test[sample_id:sample_id+1])[0]]\n", + " print(f\"Prediction for sample {sample_id}: {prediction}\\n\")\n", + " print(\"Rules used:\")\n", + " for node_id in node_index:\n", + " # continue to the next node if it is a leaf node\n", + " if leaf_id[sample_id] == node_id:\n", + " continue\n", + "\n", + " # check if value of the split feature for sample 0 is below threshold\n", + " if (X_test[sample_id, feature[node_id]] <= threshold[node_id]):\n", + " threshold_sign = \"<=\"\n", + " else:\n", + " threshold_sign = \">\"\n", + "\n", + " print(\"- node {node}: ({feature} = {value}) \"\n", + " \"{inequality} {threshold}\".format(\n", + " node=node_id,\n", + " feature=X.columns[feature[node_id]],\n", + " value=X_test[sample_id, feature[node_id]],\n", + " inequality=threshold_sign,\n", + " threshold=threshold[node_id]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "advised-track", + "metadata": {}, + "outputs": [], + "source": [ + "# For binary variables, 1 = True, 0 = False\n", + "# e.g. sex_male = 1 -> male, sex_male = 0 -> female\n", + "# Many of the features are redundant (e.g. sex_male and sex_female)\n", + "# so the tree doesn't always choose the same features \n", + "\n", + "explain_decision(sample_id=0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "correct-venezuela", + "metadata": {}, + "outputs": [], + "source": [ + "explain_decision(sample_id=1)" + ] + }, + { + "cell_type": "markdown", + "id": "disabled-vietnam", + "metadata": {}, + "source": [ + "**Answer:** \n", + "YOUR ANSWER HERE" + ] + }, + { + "cell_type": "markdown", + "id": "specific-astronomy", + "metadata": {}, + "source": [ + "**To go further:** Decision trees and random forests can also be used for regression, check out the scikit-learn pages on [trees](https://scikit-learn.org/stable/modules/tree.html#tree) and [ensemble methods](https://scikit-learn.org/stable/modules/ensemble.html#ensemble) for more info." + ] + }, + { + "cell_type": "markdown", + "id": "ac55de89-829f-4d96-a0d8-79c76354d367", + "metadata": {}, + "source": [ + "## 3. A small note on unsupervised learning" + ] + }, + { + "cell_type": "markdown", + "id": "754d0834-4ca3-4d2f-ab26-ce4498a5afb1", + "metadata": {}, + "source": [ + "While we won't cover them in this exercise, most of the unsupervised learning techniques seen in class can be easily implemented with scikit-learn." + ] + }, + { + "cell_type": "markdown", + "id": "d3e9dd7e-83f7-4cf1-9347-6cdedcbdda6b", + "metadata": {}, + "source": [ + "As an example, here is how to use the k-means clustering algorithm on a toy dataset consisting of 7 unlabeled blobs of points. \n", + "When choosing $k=7$, k-means manages to almost perfectly recover the original blobs.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cbe2d12f-62e7-4b3d-8827-8b5f3576e817", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.cluster import KMeans\n", + "from sklearn.datasets import make_blobs\n", + "\n", + "# Generate unlabeled data\n", + "X_blobs, _ = make_blobs(n_samples=200, centers=7, random_state=0, cluster_std=0.60)\n", + "plt.scatter(X_blobs[:, 0], X_blobs[:, 1], c=\"grey\", alpha=0.5)\n", + "plt.title(\"Unlabeled data\")\n", + "plt.show()\n", + "\n", + "# Run k-means on data to find the blobs\n", + "\n", + "# Try changing the value of k\n", + "k = 7\n", + "kmeans = KMeans(n_clusters=k)\n", + "labels = kmeans.fit_predict(X_blobs)\n", + "\n", + "# Display clusters and their centers\n", + "plt.scatter(X_blobs[:,0], X_blobs[:,1], c=labels, cmap=\"viridis\", alpha=0.5)\n", + "for c in kmeans.cluster_centers_:\n", + " plt.scatter(c[0], c[1], marker=\"*\", s=80, color=\"blue\")\n", + "plt.title(f\"K-Means with {k} clusters\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "6b17292a-3a09-46ba-b29f-de5c09b82d4d", + "metadata": {}, + "source": [ + "To learn more about how to practically implement these techniques, check out these resources:\n", + "\n", + "**For dimensionality reduction:**\n", + "- [PCA from the Python Data Science handbook](https://jakevdp.github.io/PythonDataScienceHandbook/05.09-principal-component-analysis.html)\n", + "- [Manifold learning from the Python Data Science handbook](https://jakevdp.github.io/PythonDataScienceHandbook/05.10-manifold-learning.html)\n", + "- [Decomposition page on scikit-learn's website](https://scikit-learn.org/stable/modules/decomposition.html)\n", + "- [Manifold learning page on scikit-learn's website](https://scikit-learn.org/stable/modules/manifold.html)\n", + "\n", + "**For clustering:**\n", + "- [k-means from the Python Data Science handbook](https://jakevdp.github.io/PythonDataScienceHandbook/05.11-k-means.html)\n", + "- [Gaussian mixtures from the Python Data Science handbook](https://jakevdp.github.io/PythonDataScienceHandbook/05.12-gaussian-mixtures.html)\n", + "- [Clustering page on scikit-learn's website](https://scikit-learn.org/stable/modules/clustering.html)\n" + ] + }, + { + "cell_type": "markdown", + "id": "a0cd7f25-a3a5-4f8e-bc33-5342f3fda1eb", + "metadata": {}, + "source": [ + "## Concluding remarks\n", + "Using scikit-learn and several other python packages and libraries can help save your time in writing your own code for various machine learning algorithms. However, keep in mind that to properly use and interpret the results, you need to understand the mathematics used to implement various functions (loss functions, predictors, regularizers) and training algorithms (optimization approaches such as gradient descent or Newton methods) and accuracy metrics (e.g. accuracy, balanced accuracy). " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python", + "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.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}