-
Notifications
You must be signed in to change notification settings - Fork 12
/
classification_v2.ipynb.save
1031 lines (1030 loc) · 94.2 KB
/
classification_v2.ipynb.save
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import TIdatabase as ti\n",
"%matplotlib inline \n",
"import numpy as np\n",
"import pandas as pd\n",
"import scipy.stats as stats\n",
"import matplotlib.pyplot as plt\n",
"import sklearn\n",
"import statsmodels.api as sm\n",
"import seaborn as sns\n",
"sns.set_style(\"whitegrid\")\n",
"sns.set_context(\"poster\")\n",
"from matplotlib import rcParams\n",
"from sklearn.cross_validation import train_test_split\n",
"from sklearn import linear_model\n",
"from sklearn import svm\n",
"from sklearn.preprocessing import Imputer\n",
"from sklearn import metrics\n",
"from sklearn.cross_validation import cross_val_score\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.tree import DecisionTreeClassifier"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Read the data. "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Unnamed: 0</th>\n",
" <th>studentID</th>\n",
" <th>classrank</th>\n",
" <th>admissionstest</th>\n",
" <th>AP</th>\n",
" <th>averageAP</th>\n",
" <th>SATsubject</th>\n",
" <th>GPA</th>\n",
" <th>GPA_w</th>\n",
" <th>program</th>\n",
" <th>...</th>\n",
" <th>alumni</th>\n",
" <th>outofstate</th>\n",
" <th>acceptStatus</th>\n",
" <th>acceptProb</th>\n",
" <th>name</th>\n",
" <th>acceptrate</th>\n",
" <th>size</th>\n",
" <th>public</th>\n",
" <th>finAidPct</th>\n",
" <th>instatePct</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>PWY05BUB4I</td>\n",
" <td>NaN</td>\n",
" <td>0.926899</td>\n",
" <td>7</td>\n",
" <td>1.067339</td>\n",
" <td>0.324272</td>\n",
" <td>-0.187110</td>\n",
" <td>0.059947</td>\n",
" <td>Biomedical engineering</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>Rice</td>\n",
" <td>0.151</td>\n",
" <td>6621</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>3UVDFVI9Z0</td>\n",
" <td>NaN</td>\n",
" <td>0.293054</td>\n",
" <td>7</td>\n",
" <td>0.660575</td>\n",
" <td>-0.440777</td>\n",
" <td>0.493474</td>\n",
" <td>0.398944</td>\n",
" <td>Classics</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>Rice</td>\n",
" <td>0.151</td>\n",
" <td>6621</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>BCCBHJUP0M</td>\n",
" <td>NaN</td>\n",
" <td>0.293054</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>0.324272</td>\n",
" <td>0.396247</td>\n",
" <td>-1.035273</td>\n",
" <td>Biological Science</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>Rice</td>\n",
" <td>0.151</td>\n",
" <td>6621</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>WZFPWHSQMS</td>\n",
" <td>NaN</td>\n",
" <td>1.387878</td>\n",
" <td>7</td>\n",
" <td>0.863957</td>\n",
" <td>1.089320</td>\n",
" <td>0.104569</td>\n",
" <td>-0.383356</td>\n",
" <td>Physics</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>Rice</td>\n",
" <td>0.151</td>\n",
" <td>6621</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>5W1JNQA7G0</td>\n",
" <td>NaN</td>\n",
" <td>0.408299</td>\n",
" <td>1</td>\n",
" <td>-0.356334</td>\n",
" <td>-0.440777</td>\n",
" <td>0.542087</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>Rice</td>\n",
" <td>0.151</td>\n",
" <td>6621</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 35 columns</p>\n",
"</div>"
],
"text/plain": [
" Unnamed: 0 studentID classrank admissionstest AP averageAP \\\n",
"0 0 PWY05BUB4I NaN 0.926899 7 1.067339 \n",
"1 1 3UVDFVI9Z0 NaN 0.293054 7 0.660575 \n",
"2 2 BCCBHJUP0M NaN 0.293054 0 NaN \n",
"3 3 WZFPWHSQMS NaN 1.387878 7 0.863957 \n",
"4 4 5W1JNQA7G0 NaN 0.408299 1 -0.356334 \n",
"\n",
" SATsubject GPA GPA_w program ... alumni \\\n",
"0 0.324272 -0.187110 0.059947 Biomedical engineering ... 0 \n",
"1 -0.440777 0.493474 0.398944 Classics ... 0 \n",
"2 0.324272 0.396247 -1.035273 Biological Science ... 0 \n",
"3 1.089320 0.104569 -0.383356 Physics ... 0 \n",
"4 -0.440777 0.542087 NaN NaN ... 0 \n",
"\n",
" outofstate acceptStatus acceptProb name acceptrate size public \\\n",
"0 0 1 NaN Rice 0.151 6621 0 \n",
"1 1 1 NaN Rice 0.151 6621 0 \n",
"2 1 0 NaN Rice 0.151 6621 0 \n",
"3 1 0 NaN Rice 0.151 6621 0 \n",
"4 1 1 NaN Rice 0.151 6621 0 \n",
"\n",
" finAidPct instatePct \n",
"0 0 0 \n",
"1 0 0 \n",
"2 0 0 \n",
"3 0 0 \n",
"4 0 0 \n",
"\n",
"[5 rows x 35 columns]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv(\"collegedata_normalized.csv\")\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We now check for NaNs. The code below shows that 23% of all entries are null. This is way too high. "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.225931657684\n"
]
}
],
"source": [
"x = df.isnull().sum(axis=1).tolist()\n",
"y = float(sum(x)) / (df.shape[0]*df.shape[1])\n",
"print y"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To decrease the proportion of NaNs, we get rid of columns which are almost all null. From the `df.head()` above, we see that either a column is almost all null, or it is almost all non-null. Therefore the 23% above is probably driven mainly by columns that are basically all null. \n",
"\n",
"So we remove any column that has 50% or more null values. This takes out any predictors that would have been useless anyway. "
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['classrank', 'canAfford', 'firstinfamily', 'artist', 'workexp', 'visited', 'acceptProb']\n"
]
}
],
"source": [
"cols_to_drop = []\n",
"for i in df.columns:\n",
" if 1.0* df[i].isnull().sum() / len(df[i]) >= 0.5:\n",
" cols_to_drop.append(i)\n",
"print cols_to_drop\n",
"dfr = df.drop(cols_to_drop,axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now drop all columns where the accept status is NaN. "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"dfr = dfr[pd.notnull(df[\"acceptStatus\"])]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0304018831218\n"
]
}
],
"source": [
"x = dfr.isnull().sum(axis=1).tolist()\n",
"y = float(sum(x)) / (dfr.shape[0]*dfr.shape[1])\n",
"print y"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we have only 3% null values. Good! The next step is to choose which columns we want to use to predict. Obviously columns like `studentID`, while crucial, are not actually predictors. Also, we remove weighted GPA in favour of GPA, as we have already normalised everything. "
]
},
{
"cell_type": "code",
<<<<<<< HEAD
"execution_count": 61,
=======
"execution_count": 7,
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index([u'Unnamed: 0', u'studentID', u'admissionstest', u'AP', u'averageAP',\n",
" u'SATsubject', u'GPA', u'GPA_w', u'program', u'schooltype',\n",
" u'intendedgradyear', u'addInfo', u'female', u'MinorityGender',\n",
" u'MinorityRace', u'international', u'sports', u'collegeID',\n",
" u'earlyAppl', u'alumni', u'outofstate', u'acceptStatus', u'name',\n",
" u'acceptrate', u'size', u'public', u'finAidPct', u'instatePct'],\n",
<<<<<<< HEAD
" dtype='object')\n",
"25\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/morganhenry/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:6: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame\n",
"\n",
"See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
=======
" dtype='object')\n"
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
}
],
"source": [
"print dfr.columns\n",
<<<<<<< HEAD
"print np.unique(dfr.name)[1]\n",
"i=1\n",
"dfr[\"collegeID\"]=0\n",
"for element in np.unique(dfr.name):\n",
" dfr[\"collegeID\"][dfr.name==element]=i\n",
" i+1\n",
" \n",
"predictor_cols = [\"admissionstest\",\"AP\",\"averageAP\",\"SATsubject\",\"GPA\",\"schooltype\",\"intendedgradyear\",\"female\",\"MinorityRace\",\"international\",\"sports\",\"earlyAppl\",\"alumni\",\"outofstate\",\"acceptrate\",\"size\",\"public\",\"finAidPct\",\"instatePct\",\"collegeID\"]\n",
=======
"predictor_cols = [\"admissionstest\",\"AP\",\"averageAP\",\"SATsubject\",\"GPA\",\"schooltype\",\"intendedgradyear\",\"female\",\"MinorityRace\",\"international\",\"sports\",\"earlyAppl\",\"alumni\",\"outofstate\",\"acceptrate\",\"size\",\"public\",\"finAidPct\",\"instatePct\"]\n",
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"dfpredict = dfr[predictor_cols]\n",
"dfresponse = dfr[\"acceptStatus\"]"
]
},
{
<<<<<<< HEAD
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" admissionstest AP averageAP SATsubject GPA schooltype \\\n",
"0 0.926899 7 1.067339 0.324272 -0.187110 0 \n",
"1 0.293054 7 0.660575 -0.440777 0.493474 0 \n",
"2 0.293054 0 NaN 0.324272 0.396247 1 \n",
"3 1.387878 7 0.863957 1.089320 0.104569 1 \n",
"4 0.408299 1 -0.356334 -0.440777 0.542087 1 \n",
"\n",
" intendedgradyear female MinorityRace international sports earlyAppl \\\n",
"0 2017 1 0 0 0 0 \n",
"1 2013 0 0 0 0 0 \n",
"2 2016 1 1 0 0 0 \n",
"3 2015 0 0 0 0 0 \n",
"4 2011 0 0 0 0 1 \n",
"\n",
" alumni outofstate acceptrate size public finAidPct instatePct \\\n",
"0 0 0 0.151 6621 0 0 0 \n",
"1 0 1 0.151 6621 0 0 0 \n",
"2 0 1 0.151 6621 0 0 0 \n",
"3 0 1 0.151 6621 0 0 0 \n",
"4 0 1 0.151 6621 0 0 0 \n",
"\n",
" collegeID \n",
"0 1 \n",
"1 1 \n",
"2 1 \n",
"3 1 \n",
"4 1 \n"
]
}
],
"source": [
"print dfpredict.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The code below demonstrates that if we remove all the rows with ANY nulls in it, we reduce our dataset from 16k to 13k. This reduces our dataset too much. So we will have to impute the missing values. We initially tried to do this using the `mice` package in R, but there does not seem to be an equivalent in Python. Since the % of nulls is just 4%, it shouldn't matter too much what method we use. Since some of the variables are factor, not numerical, we can't use mean or media. We are looking into KNN imputation, but for the time being, just use median. As stated, it shouldn't matter too much what method we use. "
=======
"cell_type": "markdown",
"metadata": {},
"source": [
"The code below demonstrates that if we remove all the rows with ANY nulls in it, we reduce our dataset from 13k to 11k. This reduces our dataset too much. So we will have to impute the missing values. We initially tried to do this using the `mice` package in R, but there does not seem to be an equivalent in Python. Since the % of nulls is just 4%, it shouldn't matter too much what method we use. Since some of the variables are factor, not numerical, we can't use mean or media. We are looking into KNN imputation, but for the time being, just use median. As stated, it shouldn't matter too much what method we use. "
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
},
{
"cell_type": "code",
<<<<<<< HEAD
"execution_count": 52,
=======
"execution_count": 8,
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
<<<<<<< HEAD
"(10897, 20)\n",
"(13291, 20)\n"
=======
"(10897, 19)\n",
"(13291, 19)\n"
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
}
],
"source": [
"print dfpredict.dropna(axis=0,how=\"any\").shape\n",
"print dfpredict.shape"
]
},
{
"cell_type": "code",
<<<<<<< HEAD
"execution_count": 53,
=======
"execution_count": 9,
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
<<<<<<< HEAD
"((13291, 20), (13291,))"
]
},
"execution_count": 53,
=======
"((13291, 19), (13291,))"
]
},
"execution_count": 9,
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"imp = Imputer(missing_values=\"NaN\", strategy=\"median\", axis=1)\n",
"imp.fit(dfpredict)\n",
"X = imp.transform(dfpredict)\n",
"y = dfresponse\n",
"X.shape, y.shape"
]
},
{
"cell_type": "code",
<<<<<<< HEAD
"execution_count": 59,
=======
"execution_count": 10,
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
<<<<<<< HEAD
" admissionstest AP averageAP SATsubject GPA schooltype \\\n",
"0 0.926899 7 1.067339 0.324272 -0.187110 0 \n",
"1 0.293054 7 0.660575 -0.440777 0.493474 0 \n",
"2 0.293054 0 0.293054 0.324272 0.396247 1 \n",
"3 1.387878 7 0.863957 1.089320 0.104569 1 \n",
"4 0.408299 1 -0.356334 -0.440777 0.542087 1 \n",
"\n",
" intendedgradyear female MinorityRace international ... alumni \\\n",
"0 2017 1 0 0 ... 0 \n",
"1 2013 0 0 0 ... 0 \n",
"2 2016 1 1 0 ... 0 \n",
"3 2015 0 0 0 ... 0 \n",
"4 2011 0 0 0 ... 0 \n",
"\n",
" outofstate acceptrate size public finAidPct instatePct collegeID \\\n",
"0 0 0.151 6621 0 0 0 1 \n",
"1 1 0.151 6621 0 0 0 1 \n",
"2 1 0.151 6621 0 0 0 1 \n",
"3 1 0.151 6621 0 0 0 1 \n",
"4 1 0.151 6621 0 0 0 1 \n",
"\n",
" acceptStatus name \n",
"0 1 CalTech \n",
"1 1 CalTech \n",
"2 0 CalTech \n",
"3 0 CalTech \n",
"4 1 CalTech \n",
"\n",
"[5 rows x 22 columns]\n"
=======
"(10632, 19) (2659, 19) (10632,) (2659,) (13291,)\n"
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
}
],
"source": [
<<<<<<< HEAD
"imputeddf = pd.DataFrame(X,columns=predictor_cols)\n",
"imputeddf[\"acceptStatus\"] = y\n",
"imputeddf[\"name\"] = np.unique(dfr.name)[imputeddf.collegeID]\n",
"print imputeddf.head()\n",
"imputeddf.to_csv(\"collegedata_imputed.csv\")"
=======
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n",
"print X_train.shape, X_test.shape, y_train.shape, y_test.shape, y.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Run a logistic regression, and loop through different c values. "
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
},
{
"cell_type": "code",
<<<<<<< HEAD
"execution_count": 56,
=======
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"cdict = {}\n",
"for c in [0.001,0.01,0.1,1,10,100,1000]:\n",
" clf = linear_model.LogisticRegression(C=c)\n",
" clf.fit(X_train,y_train)\n",
" predicted = clf.predict(X_test)\n",
" cdict[c] = metrics.accuracy_score(y_test, predicted)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pick the best C-value. Note that for all $C > 0.1$ the accuracy is the same. "
]
},
{
"cell_type": "code",
"execution_count": 12,
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
<<<<<<< HEAD
"(10632, 20) (2659, 20) (10632,) (2659,) (13291,)\n"
=======
"{1: 0.68033095148552092, 100: 0.68033095148552092, 0.1: 0.6807070327190673, 1000: 0.68033095148552092, 10: 0.68033095148552092, 0.001: 0.66792027077848815, 0.01: 0.68108311395261378}\n",
"0.01\n"
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
}
],
"source": [
<<<<<<< HEAD
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n",
"print X_train.shape, X_test.shape, y_train.shape, y_test.shape, y.shape"
=======
"print cdict\n",
"best_c = max(cdict, key=cdict.get)\n",
"print best_c\n",
"clf = linear_model.LogisticRegression(C=best_c)\n",
"clf.fit(X_train,y_train)\n",
"predicted = clf.predict(X_test)"
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
<<<<<<< HEAD
"Run a logistic regression, and loop through different c values. "
=======
"Now we try a random forest, and optimise for the number of trees. "
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
},
{
"cell_type": "code",
<<<<<<< HEAD
"execution_count": 92,
=======
"execution_count": 27,
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
<<<<<<< HEAD
"cdict = {}\n",
"for c in [0.001,0.01,0.1,1,10,100,1000]:\n",
" clf = linear_model.LogisticRegression(C=c)\n",
" clf.fit(X_train,y_train)\n",
" predicted = clf.predict(X_test)\n",
" cdict[c] = metrics.accuracy_score(y_test, predicted)"
=======
"ntdict = {}\n",
"for nt in [5,10,25,50,100,250,500,1000]:\n",
" clf = RandomForestClassifier(n_estimators=nt,criterion=\"gini\")\n",
" clf.fit(X_train,y_train)\n",
" predicted = clf.predict(X_test)\n",
" ntdict[nt] = metrics.accuracy_score(y_test, predicted)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{100: 0.74840165475742759, 5: 0.70251974426476116, 1000: 0.75404287326062425, 10: 0.73223016171493038, 50: 0.75780368559608879, 500: 0.75629936066190295, 25: 0.74426476118841667, 250: 0.75103422339225268}\n",
"50 0.757803685596\n"
]
}
],
"source": [
"print ntdict\n",
"best_nt = max(ntdict, key=ntdict.get)\n",
"print best_nt, ntdict[best_nt]\n",
"clf = RandomForestClassifier(n_estimators=nt)\n",
"clf.fit(X_train,y_train)\n",
"predicted = clf.predict(X_test)"
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
<<<<<<< HEAD
"Pick the best C-value. Note that for all $C > 0.1$ the accuracy is the same. "
=======
"Now do the same thing using `entropy` instead of `gini` in the random forest. "
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
},
{
"cell_type": "code",
<<<<<<< HEAD
"execution_count": 96,
=======
"execution_count": 26,
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
<<<<<<< HEAD
"{1: 0.67506581421587064, 100: 0.67506581421587064, 0.1: 0.67506581421587064, 1000: 0.67506581421587064, 10: 0.67506581421587064, 0.001: 0.66829635201203463, 0.01: 0.67581797668296351}\n",
"0.01\n"
=======
"{100: 0.74727341105678824, 5: 0.72809326814591957, 1000: 0.75554719819481009, 10: 0.72433245581045502, 50: 0.75253854832643852, 500: 0.75705152312899582, 25: 0.73373448664911622, 250: 0.75742760436254231}\n",
"250 0.757427604363\n"
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
}
],
"source": [
<<<<<<< HEAD
"print cdict\n",
"best_c = max(cdict, key=cdict.get)\n",
"print best_c\n",
"clf = linear_model.LogisticRegression(C=c)\n",
=======
"ntdict = {}\n",
"for nt in [5,10,25,50,100,250,500,1000]:\n",
" clf = RandomForestClassifier(n_estimators=nt,criterion=\"entropy\")\n",
" clf.fit(X_train,y_train)\n",
" predicted = clf.predict(X_test)\n",
" ntdict[nt] = metrics.accuracy_score(y_test, predicted)\n",
"print ntdict\n",
"best_nt = max(ntdict, key=ntdict.get)\n",
"print best_nt, ntdict[best_nt]\n",
"clf = RandomForestClassifier(n_estimators=nt)\n",
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"clf.fit(X_train,y_train)\n",
"predicted = clf.predict(X_test)"
]
},
{
<<<<<<< HEAD
"cell_type": "code",
"execution_count": 57,
=======
"cell_type": "markdown",
"metadata": {},
"source": [
"So `entropy` is pretty much the same as `gini`. Let's try viewing feature importance. "
]
},
{
"cell_type": "code",
"execution_count": 54,
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
<<<<<<< HEAD
"text/plain": [
"0.72320421210981567"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rf = RandomForestClassifier()\n",
"rf.fit(X_train,y_train)\n",
"predicted = rf.predict(X_test)\n",
"metrics.accuracy_score(y_test, predicted)"
=======
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA4UAAAI9CAYAAACNPt0MAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl0jHf///HXEMSShFiLtJaSiTAJEVulIWJruSmqKUJp\nLaWopajb2truoLZEUi1KRTX2trSWotVaSmy/9o5bLaGpfUtKEEnm94eT+XYaSzJJJMzzcY5zzHV9\nPp/rPW85PX3lc801BrPZbBYAAAAAwC7ly+0CAAAAAAC5h1AIAAAAAHaMUAgAAAAAdoxQCAAAAAB2\njFAIAAAAAHaMUAgAAAAAdswhtwsAACC7rVmzRqNHj37oGCcnJ+3bty/Hazl9+rSee+65HL9OZsTF\nxSkwMFC+vr76/PPPc7ucLMmL/QWAJw2hEADw1GrRooWaN29+33MFChTI8ev37dtXd+/e1aJFi3L8\nWrYwGAy5XUKW5PX+AsCTglAIAHhqVa9eXW3bts216//www9q1KhRrl3/aUd/ASB78JlCAAAAALBj\nhEIAACQdP35cgwcPVv369VWrVi29/PLL+uSTT5SSkmI17s6dO4qIiNArr7yi2rVrq1atWgoMDNTU\nqVOVmJgoSdq7d6+MRqMkadeuXTIajVq3bp0kyWg0qmfPnumuP2rUKBmNRl24cMFqjRUrVqh79+6q\nVauWAgICdOPGDUnSuXPn9P7776tx48aqVauWmjdvro8++ki3bt2y6f2nXW/jxo2aNWuWXnzxRXl5\nealTp07at2+fEhMTNWnSJL3wwguqW7eu3nzzTZ08eTLd/O3bt2vSpElq0KCBfHx81L179/t+dvPP\nP/+01F+zZk0FBARoypQpio+PtxoXEBCgAQMGaO7cufLx8ZGvr6/Wr1//wP6mpqYqMjJSr732murW\nrauaNWvK399fY8aM0ZUrV9LV+9133yk0NFTNmjVTrVq11LJly/vejnrjxg2FhIQoMDBQXl5eCgwM\n1LRp05SQkGA1LqM/RwCQl3D7KADgqXXr1i1dvXo13fF8+fKpePHilteHDh1Sz549VaJECfXs2VMu\nLi7avXu3Zs6cqYMHDyosLMzy+btBgwZp586d6ty5s7p06aLExERt2rRJS5Ys0eXLlzVz5kw9//zz\nCgkJ0YgRI1StWjX16dNHtWvXtlzvQZ/lu9/xkJAQNW7cWOPGjdPVq1dVrFgxnTlzRkFBQZKk1157\nTeXKldPhw4f16aefavfu3Vq2bJkKFSpkU8+mT58uZ2dn9e3bV9evX9enn36q/v37y93dXQaDQQMG\nDNDZs2e1ePFiDRw4UF9//bXy5fu/3zFPmjRJZrNZvXr1kiRFRkaqZ8+eCgsLk7+/v6R7walr1666\nc+eOXnvtNVWpUkWHDx/W559/rh07dmjFihVydXW1rLl7927973//09ChQ3Xx4kX5+vo+sL8ffvih\nvvjiC7388svq2LGj7t69q507d2rVqlU6fvy4VqxYke79Ojg46PXXX1fhwoW1YsUKhYSEqGjRonrt\ntdckSYmJiercubNOnTqlV155RV5eXjp+/LiWLVumAwcOaNmyZSpYsGCmfo4AIE8xAwDwlFm9erXZ\n3d39gX98fX0tY1NTU82tW7c2N2vWzPzXX39ZrTN//nyzu7u7ecOGDWaz2WyOiYkxu7u7m6dPn241\nLjk52dykSROzj4+P1XF3d3dzz549H3nMbDabR44caXZ3dzefP3/ebDabzXv27DG7u7ubX3rppXRj\ne/XqZa5Xr5757NmzVsfXr19vdnd3Ny9YsOCh/fnjjz/M7u7u5uDgYMuxtOv5+/ubb926ZTk+ffp0\ns7u7u7lTp05WawwfPtzs7u5uPnPmjNX8Bg0amK9cuWIZd/HiRbOPj4+5WbNmlmPdunUze3h4mA8c\nOGC15po1a8zu7u7m0aNHW441bdrUbDQazYcOHUr3Pv7Zy6tXr5o9PT3N7777brqxQUFBZnd3d3N8\nfLxVvU2aNDHfvHnTql4PDw9zUFCQ5dicOXPM7u7u5rVr11qt+emnn5qNRqN506ZNZrPZnOGfIwDI\na9gpBAA8tdq3b6927dqlO/73J48ePXpUJ0+eVLdu3ZSUlGS1s9iqVSvNmTNHW7Zs0UsvvSSj0ajo\n6Gjlz5/far1Lly7JxcXFcutndqpfv77V6/j4eP38888KDAyUo6OjVb2NGzdWkSJFtGXLFvXu3dum\n6/n7+8vR0dHyukqVKpLuPcn179K+BuLChQtyc3OzHO/atavVLl/p0qXVvn17LVu2TDExMSpbtqz2\n7dunF1980Wr3VJJeeeUVRUREaPPmzZo8ebLleOHCheXl5fXI2kuUKKHo6GglJydbHU/bYZXu7fo5\nOztbzgUEBKhIkSJW9ZYuXdrqVtMtW7aoVKlSat++vdW6Xbp0UaNGjVSpUiXFxMRk+OcIAPIaQiEA\n4KlVsWJFNWzY8KFjTp06JUlatmyZli1bdt8x586ds/y9QIEC+uqrr7R7926dPn1af/zxh+VzcDlx\na2DJkiWtXp8+fVqStHXrVm3duvW+c86ePWvz9UqXLm31Oi0AlypVyup42i2jZrPZ6ri7u3u6NStX\nrixJOnPmjO7evStJev755+97/apVq+r06dO6fv265Rbfv4fMR3FwcNC2bdv0ww8/KDY2VnFxcbp8\n+bKke/8+qampVuP/2V9JKliwoNVnAOPi4uTp6ZluXOHCheXh4SEp8z9HAJCXEAoBAHYtLdR0795d\nTZs2ve+YokWLSpKuX7+uoKAgnTlzRvXq1VPdunUVFBQkb29vffDBB/d9oEpG/XN3K80/dyXTQs3L\nL7+sTp063XdOVr6D0cHh/v9rkNHAW7BgwXTH0gJW/vz504XIf0p7f39f5589eJCkpCS98cYbOnDg\ngLy9veXp6al27drJZDJp2bJlWrt2bbo5f/885IMkJyc/8v1n5ucIAPIaQiEAwK6l3fpoMBjS7Sre\nuXNH27Zts+yeLV++XLGxsZoyZYo6dOhgNfbSpUsZul6+fPl0+/btdMfTdrMepUKFCpLuBaD77YJ+\n9913qlixYobWygmnTp2yPFAmTdpTSitXrmzZ/fv999/TzTWbzTp58qRcXFysbunMqG+//VYHDhzQ\ngAEDNHDgQKtzGf33uZ8KFSpYdgL/7saNGxo9erRatGihZ599VlLGfo4AIK/hKykAAHatZs2aKl++\nvFatWpXutstPPvlEQ4YM0Y4dOyRJ165dkyRVq1bNatzWrVstoeHvtyfe73bFMmXK6MSJE1bB8I8/\n/tCBAwcytBtXunRp1alTR9u2bdOvv/5qdW7t2rV69913tXr16keuk1OWLVtm9bUYZ8+e1fr16+Xu\n7q6qVauqZMmSqlu3rn766ScdOHDAau66det05swZNW/ePEPX+md/H/Tvc+TIEe3Zs0cGg8Gmr4YI\nDAzU5cuX9e2336ard/PmzZIy93MEAHkNO4UAALuWL18+ffjhh+rXr59eeeUVBQUFqXz58oqOjtbX\nX3+tGjVqqEuXLpLuPZTk888/17Bhw9SlSxcVLlxY0dHR2rRpk6pWraoTJ04oISHBshtWqlQp/fbb\nb/riiy/k6+ur559/Xq+88orCw8PVs2dPtWvXTleuXNEXX3whNzc3nThxIkM1jx8/Xl27dlW3bt0U\nFBSkKlWqKCYmRitXrlSFChXUv3//HOvXo1y6dEmvvvqqOnXqpJs3b2r58uWSpIkTJ1rGjBs3Tt26\ndVPPnj0VFBSkSpUq6ddff9XatWtVsWJFDR06NEPX+md//fz8NHPmTE2aNEmnT5+Wq6urfvvtN61f\nv15VqlTRsWPH0n2vYEb07dtXW7du1fDhw7Vnzx55eHjo2LFjioqKUsOGDfXSSy9l6ucIAPIadgoB\nAE8dg8GQqYe+vPDCC1qxYoV8fX315ZdfavLkyTpy5Ih69+6tJUuWWG5lbNiwoWbOnKkiRYpozpw5\nli+L//LLL9W7d28ZDAbt2rXLsu6IESNUpEgRTZ06VVu2bJEkDRgwQH379tWFCxc0efJkfffddxo6\ndKg6d+6c4Zrd3d21Zs0atWjRQt98840+/PBDy3cnfvHFF9l6m+KDevmg40OHDlXdunUVFhampUuX\nytvbWytWrJC3t7dlTPXq1bV69Wq1atVKGzZs0JQpU7Rv3z698cYbWrt2bYYfLPPP/latWlUff/yx\nKlasqAULFmjatGn6448/FBERoXHjxkmSfv755wy9579zcnLSihUr9Prrr+vHH3/UlClTtGvXLvXt\n21fh4eGWzyVm9OcIAPIag/lRn/gGAAB4hL1796pHjx6aOHGi5UvfAQBPBnYKAQAAAMCOEQoBAAAA\nwI4RCgEAQLbIzOc4AQB5B58pBAAAAAA7xldSIM+Jjo7O7RIAAACAPMnHxyfb1yQUIk/KiR/2p11M\nTIwkycPDI5creTLRP9vRO9vRu6yhf7ajd7ajd1lD/2wXExOjxMTEHFmbzxQCAAAAgB0jFAIAAACA\nHSMUAgAAAIAdIxQCAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQCAAAAgB0jFAIAAACAHSMUAgAAAIAd\nIxQCAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQCAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQCAAAAgB0j\nFAIAAACAHSMUAgAAAIAdIxQCAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQCAAAAgB0jFAIAAACAHSMU\nAgAAAIAdIxQCAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQCAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQC\nAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQCAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQCAAAAgB0jFAIA\nAACAHSMUAgAAAIAdIxQCAAAAgB0jFGYzo9GoxYsXZ9t658+f15tvvqlr165lal5UVJRmz56dqTnz\n5s2T0Wi0+lOrVi0FBgZq6tSpunXrVobX2rp1q8aNG5ep6wMAAAB4/Bxyu4CnTVRUlMqXL59t6+3a\ntUs///yzDAZDpuZFREQoICAg09dzdHTU0qVLLa+TkpK0f/9+zZ07V+fOndPcuXMztM6SJUtUtGjR\nTF8fAAAAwONFKMxmJpMpR9Y1m82PZY7BYEj3HurWras///xTq1at0uXLl1WqVKlMrwsAAAAgb+L2\n0Wz299tH582bp44dO+qbb75Ry5YtZTKZ1KlTJx08eNAyPjExUf/+97/VuHFjeXl5qUOHDtqyZYsk\nac2aNRo9erQkqWHDhgoNDZUkXbx4Ue+//778/PxUs2ZN+fn5acqUKUpKSpIkBQQE6OzZs4qMjJTR\naLRc69dff1WPHj3k7e2thg0batKkSbp9+3aG3peHh4fMZrPOnj0rSUpJSVFERIQCAwPl7e2t9u3b\na+vWrZKk4OBg7du3Tzt27JDRaLTMAQAAAJD3EApzWGxsrObNm6dBgwZp3rx5unPnjgYPHqzU1FRJ\n0uTJk7V3716NHTtWn3zyiapWrarBgwfr5MmTatKkid5++21J0sKFC/Xqq68qNTVVb731lo4eParx\n48dr4cKFateunZYuXaqoqChJUlhYmEqVKqVWrVpZjh0/flzdunVT/vz5NWfOHA0fPlwbN27Uu+++\nm6H3cfr0aUlSxYoVJUlTp05VWFiYOnXqpIiICJlMJg0ePFjR0dGaMGGCatSoIR8fH0VFRbGzCAAA\nAORh3D6aw27evKnPPvtMtWrVknRvh61///46evSoatSooejoaL3wwgtq2bKlJKl27doqVaqUUlJS\n5OrqKjc3N0mSp6enihcvrnPnzql48eIaM2aMqlevLkmqX7++du7cqV9++UXdunWTh4eHChYsqFKl\nSlluBZ0/f77KlCmjBQsWyMHh3j/7c889p27dumn//v2qW7eupeaUlBTLrafx8fH66aefFBUVpcDA\nQLm6uur69etavny5Bg4cqH79+kmSGjRooNjYWEVHR6tPnz4qWrSoihYtmmO30wIAAADIHoTCHObg\n4GAJhJJUtmxZSfduG5UkX19fRUVF6eLFi2ratKn8/f01cuTIB673zDPPaOnSpUpNTVVsbKxiY2N1\n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\nVZJUrVo1ubm5ZalnAAAAAHIWoTCP8fLysnpdpkwZ3b592/L6zJkzOnTokKZNm6aEhARJUtOmTTVn\nzhytX79ewcHB6dY8cOCAJOnFF1+0HCtdurS8vb3TjZ0xY4ZmzJhhdax06dKaNGmS5SEzBw8elK+v\nryUQSvdujc3q5yT/7kpc7j65NOFSrGJj3VSqVKlcrSMzbt26Jeneg36QefTPdvTOdvQua+if7eid\n7ehd1tA/26X1LicQCvOYwoULW73Oly+fUlNTLa/XrVsnSRo1alS6uatWrbpvKExISJCDg4NViJPu\nhb1/6tGjh/71r39JkvLnzy9nZ2eVL18+3XoZeQppVrzdJrd3GN3k7u6eyzUAAAAAOY9Q+AQxm836\n6quvFBAQoJ49e1qd27Vrl8LDw3XkyJF0Tw8tXry4kpOTdePGDRUrVsxy/Nq1a+meUFquXDl5eno+\ntI5ixYrp6tWrVseSkpK0e/du1alTx5a3ls79wi0eLu03bjkd2J9W9M929M529C5r6J/t6J3t6F3W\n0D/bxcTEKDExMUfW5kEzT5Do6GjFxcWpc+fO8vX1tfrTs2dPFShQQKtWrUo3r169epKkTZs2WY7F\nx8fr0KFDNtVRu3Zt7du3z+qHcteuXerbt6+uXr2q/Pnz27QuAAAAgMePUPgESHsYzbp16+Ts7KzG\njRunG+Ps7KwXX3xRGzZsSHe/cZUqVfSvf/1LU6ZM0fLly7V9+3b17ds33VddZNQbb7yhlJQU9enT\nR9u3b9fXX3+t8ePHq0WLFnruuefk5OQkSdq+fbtOnDhh0zUAAAAAPB7cPvqY/fMrKP75+n7jDQaD\nkpKStGnTJjVr1kwODvf/Z2vbtq22bdumb7/91jIvzeTJk+Xq6qp58+YpOTlZHTt2VIUKFWx6DxUr\nVtSyZcsUEhKiIUOGyMnJSa1atdLQoUMlSdWrV1e7du20YMEC/frrr4qIiMj0NXbu3GlTbY+TyWSS\ni4tLbpcBAAAAZInB/M/vRAByWXR0tAaGbHr0wFyUcClW4ROD5efnl9ulWHCPftbQP9vRO9vRu6yh\nf7ajd7ajd1lD/2yX9plCHx+fbF+bnULkSSUrPvxhNwAAAACyB58pBAAAAAA7RigEAAAAADtGKAQA\nAAAAO0YoBAAAAAA7RigEAAAAADtGKAQAAAAAO0YoBAAAAAA7RigEAAAAADtGKAQAAAAAO0YoBAAA\nAAA7RigEAAAAADtGKIQkae/evTIajTp79uwDx6xZs0ZGo1HXr1+XJAUHB6tfv36Pq0QAAAAAOcAh\ntwvAk2vChAnKnz9/bpcBAAAAIAsIhbBZ1apVc7sEAAAAAFnE7aNPAaPRqHXr1qlXr17y8vJS8+bN\ntWLFCsv5uLg4GY1Gbd682Wpeu3bt9P7771sd++WXX9S2bVuZTCa9+uqr2rt37wOv+8/bR69fv65/\n//vfeuGFF+Tj46M333xTx44dy6Z3CQAAACAnEAqfEpMnT1a5cuUUFhYmf39/TZgwQatWrXroHIPB\nkO7YxIkT9corryg0NFQuLi566623MhTskpOT1bNnT+3cuVPDhg3TnDlzdPv2bfXq1UsJCQk2vy8A\nAAAAOYvbR58SJpNJU6ZMkSQ1btxYFy9eVEREhDp16pSpdd5991316NFDktSgQQMFBgZq8eLFmjp1\n6kPn7dixQzExMYqMjJSPj48kqUaNGurcubN+++03NWzY0IZ3BQAAACCnEQqfEm3atLF63axZM23e\nvFkXLlzI1DqtWrWy/L1gwYLy8/N76C2kaQ4ePChnZ2dLIJQkV1dXbd26NVPXT3Ml7jeb5j0uCZdi\nFRvrplKlSuV2KRa3bt2SJMXExORyJU8m+mc7emc7epc19M929M529C5r6J/t0nqXEwiFT4kyZcpY\nvXZ1dZUkJSQkqHDhwhle558hx9XVNUO3f8bHx6tEiRIZvs6jvN3GLdvWyhlucnd3z+0iAAAAgCwj\nFD4l0r47MM2VK1ck3Qt1t2/fliSlpqZajbl582a6deLj4y2BUpIuX75s9fpBnJycdO3atXTH9+zZ\nIzc3N1WoUOHRb+JvgoODMzUe//cbNw8Pj1yu5MlE/2xH72xH77KG/tmO3tmO3mUN/bNdTEyMEhMT\nc2RtHjTzlNi2bZvV6y1btqhatWoqWbKkihUrJklWt5JeuHBBf/75Z7p1fvzxR8vfb926pR9++EH1\n6tV75PVr166thIQEHTx40HLs+vXr6t27t3bt2pXp9wMAAADg8WCn8Cnx7bffqkyZMnrhhRe0bds2\nbdu2TfPmzZMkubi4yMvLS4sWLdIzzzyjfPnyKTQ0VM7OzunWmTVrllJSUlSyZEktXLhQSUlJ6t27\n9yOvHxAQoBo1amjIkCEaMmSIihcvro8//ljlypVT69ats/39AgAAAMgehMKnxDvvvKO9e/cqMjJS\nlStX1ty5cxUYGGg5P3XqVE2YMEHDhw9X6dKl1bdvX/30009WaxgMBn344YeaMmWKzp49K5PJpM8/\n/1xubm5+C3CkAAAgAElEQVRWY+7HwcFBCxcuVEhIiKZMmaLU1FT5+voqJCTEslOZGTt37sz0HHsX\nGxsr6d4tv8g8+mc7emc7W3pnMpnk4uKSQxUBAOyRwWw2m3O7CGSN0WjUpEmTMv31E3lVdHS0BoZs\nyu0yACDPSbgUq/CJwfLz88vtUvIEPptkO3pnO3qXNfTPdmmfKfz70/6zCzuFyJNKVvTM7RIAAAAA\nu8CDZgAAAADAjrFT+BQ4evRobpcAAAAA4AnFTiEAAAAA2DFCIQAAAADYMUIhAAAAANgxQiEAAAAA\n2DFCIQAAAADYMUIhAAAAANgxQiEAAAAA2DFCIQAAAADYMUIhHshoNGrx4sW5XQYAAACAHOSQ2wUg\n74qKilL58uVzuwwAAAAAOYhQiAcymUy5XQIAAACAHMbto3bu8OHD6tq1q+rUqaP69etr8ODBOnv2\nrCTr20cDAgJkNBrT/QkICLCsdfr0afXv31916tSRr6+vRowYoWvXruXK+wIAAACQMewU2rG//vpL\nffr0UePGjTVo0CDFx8dr+vTpGjp0qFasWGE1NiwsTHfv3rW8/u9//6sJEyaoQ4cOkqTLly+rS5cu\nKlu2rEJCQpSUlKTZs2frzTff1JdffqkCBQo81vcGAAAAIGMIhXbsxIkTio+PV3BwsLy9vSVJJUqU\n0N69e2U2m63Genh4WP5+7do1vfvuu/Lz89M777wjSVqyZInu3r2rRYsWqXjx4pLu3X7asmVLbdiw\nQe3bt39M7woAAABAZhAK7Vi1atXk4uKifv366eWXX5a/v78aNGggX1/fB85JSUnRkCFDZDAYNGPG\nDMvxvXv3ysvLS05OTkpOTpYklStXTlWqVNGePXsyHQqvxP1m25sCgKdYwqVYxca6qVSpUrldSp5w\n69YtSVJMTEwuV/LkoXe2o3dZQ/9sl9a7nEAotGNFixZVZGSkwsLCtHbtWkVGRsrZ2Vl9+vTRW2+9\ndd85ISEhOnDggJYvXy4XFxfL8evXr+vIkSPy9PS0Gm8wGFSmTJlM1/Z2G7dMz7F3SUlJkqSCBQvm\nciVPJvpnO3pnu8z3zk3u7u45VxAAwC4RCu3c888/r1mzZik5OVn79u3T0qVLNWPGDNWrVy/d2PXr\n12vJkiWaOHGiatasaXXOyclJ/v7+GjRokNVxs9msokWLZrqu4ODgTM+xd2m/cfv7rb7IOPpnO3pn\nO3qXNfTPdvTOdvQua+if7WJiYpSYmJgja/P0UTu2fft21a9fX1evXpWDg4MaNmyoMWPGSJLlCaRp\nfvvtN40bN07t27fXa6+9lm4tHx8fnThxQtWqVZOnp6c8PT1VrVo1zZ8/XwcOHHgs7wcAAABA5rFT\naMe8vb1lMBg0cOBA9e7dWw4ODlqyZIlcXFxUv359y7hr167pnXfeUcmSJdWlSxcdPnzY6kE0NWrU\nUM+ePbV+/Xr17t1b3bt3l4ODgxYvXqzDhw+n2z0EAAAAkHcQCu1YiRIl9Mknn2jmzJkaMWKE7t69\nK29vb3322WcqUaKEZdzvv/+uc+fOyWAwqHPnzlZrGAwGff/99ypfvryWL1+u6dOn67333pPBYFDN\nmjW1ePFiGY3GTNe2c+fOLL8/exMbGyvp3teDIPPon+3one3oXdbQP9s96b0zmUxWzzYAkDUG8z+/\newDIZdHR0RoYsim3ywAAAHlQwqVYhU8Mlp+fX65cn8/EZQ39s13aZwp9fHyyfW12CpEnlazo+ehB\nAAAAALKMB80AAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQCAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQC\nAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQCAAAAgB0jFAIAAACAHSMU2pHQ0FBFRkZmeZ2kpCRNmjRJ\nW7duzYaqAAAAAOQmQqEdCQ0NVVJSUpbXuXjxopYtW6bU1NRsqAoAAABAbiIU2hmz2Zwn1wIAAACQ\nOwiF2eDGjRuaNGmSAgICVLNmTTVs2FCjRo3SX3/9JUlKSUlRRESEAgMD5e3trfbt21vdevmo85K0\ndOlStWjRQrVq1VKbNm20ceNGy7m4uDgZjUZt375dnTt3lpeXl9q2bavNmzdbxhiNRklSSEiImjVr\nJkkKDg7WuHHj9Oabb8rLy0uTJk2SJB05ckS9e/eWr6+vatasqVatWunLL7+0XCswMFCSNHjwYHXv\n3t1yjW+++UZt27ZVrVq11Lx5cy1btizbegwAAAAgZxAKs8GwYcO0bds2DR8+XIsXL1avXr30zTff\naP78+ZKkqVOnKiwsTJ06dVJERIRMJpMGDx6s6OjoDJ0PDQ1VSEiI2rRpo48//liNGjXSsGHD9N13\n31nVMXLkSPn6+iosLEzVq1fX4MGDtWvXLkmyhLrg4GCFhYVZ5qxZs0ZVq1ZVeHi42rdvr7Nnz6p7\n9+4qVqyY5s6dq/DwcFWqVEnjx4/XsWPHVKZMGYWGhkqShg4dqvHjx0uS1q5dq+HDh6t+/fr6+OOP\n1b59e02dOlULFy7Mwc4DAAAAyCqH3C7gSXfnzh0lJyfrgw8+UOPGjSVJvr6+OnDggPbt26f4+Hgt\nX75cAwcOVL9+/SRJDRo0UGxsrKKjo1W1atWHnq9WrZoWLFig3r17a9CgQZKkRo0a6ebNm5o5c6Za\ntWplqaVVq1Z67733JEmNGzfWqVOnFBERoUaNGsnLy0uSVL58ecuuoSQVLVpUo0ePtrz+4YcfVKdO\nHc2YMUP58+eXJJlMJtWvX1/79u1T9erVLfMrVaqkqlWrKjU1VR999JH+9a9/acyYMZYaDQaD5s+f\nry5duqhw4cLZ33wAAAAAWUYozKJChQpZdsPi4uIUGxur33//XSdPnlShQoV0+PBhpaamqmnTplbz\nli5dKuleCHvY+R9//FFJSUny9/dXcnKy5byfn59Wr16tP//803KsTZs2VmsEBgZadisf5LnnnrN6\n7e/vL39/f925c0e///67YmNjdeTIEUnS3bt377vGqVOndOnSpfvWOHfuXB05ckT169d/aB3/dCXu\nt0yNBwAA9iHhUqxiY91UqlSpXLn+rVu3JEkxMTG5cv0nHf2zXVrvcgKhMBt8//33mjp1quLi4lSi\nRAnVrFlTjo6OSk1NVXx8vCSpZMmS9537qPPXr1+XJAUFBaU7ZzAYdOnSJct/FMuUKWN13tXVVcnJ\nyUpMTFSRIkXuu76rq6vV65SUFE2bNk1RUVG6e/eunn32WdWtW1fSgx8sk1bjsGHDNGzYsHQ1Xr58\n+b7zHubtNm6ZnmPv0p4sW7BgwVyu5MlE/2xH72xH77KG/tnuye6dm9zd3XO7COCpQijMotjYWA0e\nPFgdOnTQgAEDVLZsWUn3HsJy8uRJOTk5SZKuXr2q0qVLW+al/XbE2dk5Q+fDwsJUrlw5q2ubzWZV\nrlxZ165dk/R/4SzN5cuXVahQoQcGwvsJDw/XypUrFRISIn9/fzk6Our27dtatWrVA+ekvcfx48fL\nZDKlq7FixYoZvn6a4ODgTM+xd2k/Mx4eHrlcyZOJ/tmO3tmO3mUN/bMdvbMdvcsa+me7mJgYJSYm\n5sjaPGgmi/773/8qOTlZffr0sQTCxMREy0NiTCaTHBwctH37dqt5Y8eO1cKFCzN8/sqVK/L09LT8\nOX78uMLDw63m/HONrVu3qmHDhpbX+fI9+p/70KFDqlWrllq2bClHR0dJ925hlf5vpzDts4ZpqlSp\nouLFi+v8+fNWNcbHx2vevHm6cePGI68LAAAAIHewU5hFNWrUUP78+TV9+nQFBQXp2rVrWrRokeW2\nTVdXVwUFBSk8PFwODg6qUaOGvv32Wx07dkwTJ07M0Png4GBNmzZN8fHxqlWrlo4eParZs2erWbNm\nKlq0qGWncPHixSpSpIhq1Kih1atX68SJE5avmZDu7ejt379ftWvXlre3933fj8lk0oIFCxQZGalq\n1arp//2//6eFCxeqcOHClt9MpO0M/vzzz3Jzc5OHh4cGDhyoqVOnSrr3oJy4uDjNnDlTlStXtmmn\nEAAAAMDjQSjMokqVKuk///mPQkND1adPH7m5uSk4OFiurq4aOnSoLl26pNGjR6t48eKKjIzUtWvX\nVL16dX3yySfy9PSUpEeeHzFihEqWLKmoqCjNnTtXZcqUUY8ePfTOO+9Y1TJixAitWbNG8+fPl4eH\nhxYvXqyaNWtazg8cOFCzZ8/W/v37LV9V8U99+vTRpUuXFBoaqtu3b8vHx0cLFy7UnDlzdPjwYUlS\nsWLF1Lt3by1btkwHDx7UV199pa5du8rR0VGfffaZFi1apOLFi+ull17SkCFDbOrrzp07bZr3tDOZ\nTHJxccntMgAAAPAUMZgf9PQQPDHSvlB+8eLFVreLPqmio6M1MGRTbpeR5yRcilX4xGD5+fnd9zz3\n6GcN/bMdvbMdvcsa+mc7emc7epc19M92aZ8p9PHxyfa12SlEnlSyomdulwAAAADYBR4085QwGAy5\nXQIAAACAJxA7hU+BihUr8gWgAAAAAGzCTiEAAAAA2DFCIQAAAADYMUIhAAAAANgxQiEAAAAA2DFC\nIQAAAADYMUIhAAAAANgxQiEAAAAA2DFCIQAAAADYMUIhAAAAANgxQmEeFRoaqsjIyEzNSUhIUO/e\nveXl5aUXXnhBycnJDx2flJSkSZMmaevWrZm6zv79+zVo0KBMzQEAAACQNxEK86jQ0FAlJSVlas76\n9eu1c+dOffDBBwoLC5ODg8NDx1+8eFHLli1Tampqpq6zatUqnTp1KlNzAAAAAORND08NyFVmszlT\n4+Pj41W4cGG1a9cuR68DAAAA4OnBTmEOuHv3rhYsWKCWLVvKZDKpbdu2+uabbyRJcXFxMhqN2rx5\ns9Wcdu3a6f3335ckGY1GSVJISIgCAgIsY7Zs2aKOHTuqdu3aatKkiebMmaOUlBRJUnBwsEJDQ3Xr\n1i0ZjUaFhoZKkj799FM1b95cJpNJzZs31/z582U2mxUXF6fAwEBJ0uDBg9W9e3dL7XPnzlXLli1V\nq1Yt1atXTwMHDtT58+clSaNGjdK6dev0+++/y2g0at++fZKkK1euaMSIEapfv75q166tt99+W3Fx\ncTnSXwAAAADZh1CYA0aOHKnw8HAFBQUpIiJCderU0fDhw7Vy5coHzjEYDJa/f/nll5LuBb358+db\njg0cOFDe3t4KCwtTt27dtGjRIo0aNUqSNGHCBHXq1EmOjo6KiorSq6++qvXr12vu3Lnq1auXFi1a\npFdffVXz5s1TVFSUypQpYwmOQ4cO1fjx4yVJU6dOVWRkpPr27avFixfr3Xff1e7duzVlyhRJ0oAB\nA+Tv7y83NzdFRUXJw8NDt2/fVvfu3XXw4EGNHTtW06dP1+XLl9WtWzclJCRkf4MBAAAAZBtuH81m\n//vf/7Rx40Z98MEH6ty5sySpUaNGunHjhmbNmqUGDRo8cg0vLy9JUvny5WU0GpWSkqLZs2fr5Zdf\n1tixYy1rOjk5afz48erdu7eqV6+usmXLymAwyGQySZKio6NVoUIFvf7665KkunXrqkCBAipbtqwK\nFixo2ZGsVKmSqlatKkm6du2aRo4cqQ4dOljmnDx50rLT6ebmphIlSsjR0dFynRUrVig2NlbffPON\nKleuLElq0KCBAgIC9Pnnn2vAgAGZ7uOVuN8yPedpl3ApVrGxbipVqtR9z9+6dUuSFBMT8zjLemrQ\nP9vRO9vRu6yhf7ajd7ajd1lD/2yX1rucQCjMZvv375cktWrVyup469attWHDBt2+fTvTa548eVLX\nrl1T69atrY6/9NJLGj9+vPbt26fq1aunm+fr66uoqCh17NhRLVu2VJMmTdSzZ8+HXmvWrFmSpAsX\nLujkyZM6efKkDhw4oLt37z5wzt69e/Xcc8/p2WeftTzx1NHRUXXq1NGePXtsCoVvt3HL9Jynn5vc\n3d1zuwgAAAA8ZQiF2Sw+Pl4ODg5ydna2Op62u3Pjxg2b1pSkkiVLWh13cnJSwYIFdfPmzfvOa9u2\nrVJSUhQZGalZs2bpo48+kru7uyZPnqyaNWved86BAwc0YcIEHTt2TE5OTvLw8JCjo+NDn1B6/fp1\nnTx5Up6enunOVapUKYPv0lpwcLBN8+xZ2m/cPDw8crmSJxP9sx29sx29yxr6Zzt6Zzt6lzX0z3Yx\nMTFKTEzMkbUJhdnMxcVFycnJSkhIsAqGly9fliTLTto/Q9aDgp0kFS9eXNK9h7n8XUJCgpKSkizn\n76d9+/Zq3769rl69qm3btiksLEwjRozQxo0b043966+/1K9fP9WtW1dhYWFyc7u3WxcSEvLQLX4n\nJycZjUZNnjzZ6rjZbFbBggUfOA8AAABA7uNBM9msbt26kqRvv/3W6vjGjRtVqlQpVatWTdK92zPT\nXLhwQX/++afV+Hz5/u+fpnLlyipRosR915SkOnXq3LeWkSNHWr5k3tXVVZ06dVLHjh117tw5SVL+\n/Pmtxp88eVIJCQnq0aOHJRCmpqZq165dD6xNknx8fBQXF6fy5cvL09NTnp6eqlGjhj7//HPt2LHj\nvrUBAAAAyBvYKcxm7u7uatGihaZNm6abN2+qevXq+v7777Vx40aNHz9exYsXl5eXlxYtWqRnnnlG\n+fLlU2hoaLrbTZ2cnLR//37Vrl1b3t7eeuedd/Thhx/KxcVFAQEB+t///qfQ0FC1bt1azz///H1r\nqV+/vkaPHq1Zs2apYcOGOn/+vFasWKEWLVpYriFJP//8s9zc3FS1alUVLVpUYWFhSklJ0a1bt7R8\n+XKdP39ed+7csazr4uKi8+fPa9euXfL09FTHjh31+eefq1evXurTp49cXFwUFRWlzZs3KyIiwqY+\n7ty506Z5j5vJZJKLi0tulwEAAADYjFCYA2bMmKG5c+fqs88+0/Xr11W1alXNmDFDbdq0kXTvax8m\nTJig4cOHq3Tp0urbt69++uknqzUGDhyo2bNna//+/dq9e7e6du0qR0dHLVq0SCtXrlSZMmXUq1cv\n9e/f3zLHYDBYfbVFhw4ddOPGDX3xxRdavHixnJ2d1bp1aw0bNkySVKxYMfXu3VvLli3TwYMH9dVX\nX2nevHkKCQnR22+/rVKlSqlTp04aNGiQgoKCdOTIEZlMJr322mvavn27+vXrp2nTpumll15SZGSk\nQkJCNGHCBCUlJal69eoKDw/Xiy++aFMPR4bm/VCYcClW4ROD5efnl9ulAAAAADYzmM1mc24XAfxd\ndHS0JizP+198fyXuN/3nHb88Ewr54HbW0D/b0Tvb0busoX+2o3e2o3dZQ/9sl/agGR8fn2xfm88U\nAgAAAIAdIxQCAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQCAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQC\nAAAAgB0jFAIAAACAHSMUAgAAAIAdIxQCAAAAgB0jFD6FjEajFi1alNtlaM2aNTIajbp+/XpulwIA\nAADgAQiFTymDwZDbJahJkyaKioqSk5NTbpcCAAAA4AEccrsAPL1cXV3l6uqa22UAAAAAeAh2Cp9A\nN27c0KRJkxQQEKCaNWuqYcOGGjVqlP766690Y+93C2dCQoKMRqPWrVsnSZo3b546duyodevWqXnz\n5vLy8lLPnj116dIlrVixQk2aNFHdunX13nvv6fbt25KkvXv3ymg0av/+/QoKCpLJZFJgYKBWrlz5\n0GsDAAAAyFvYKXwCDRs2TL///ruGDx+u0qVL69ChQ5ozZ45KlCihkSNH2rTmqVOntHDhQo0cOVK3\nbt3SuHHj1K1bNxUvXlwTJ05UbGyspk2bpmrVqqlPnz6WeUOHDlWvXr00ZMgQRUZGauzYsapTp46q\nVq2aXW8XAAAAQA4iFD5h7ty5o+TkZH3wwQdq3LixJMnX11cHDhzQvn37bF43MTFRkydPlslkkiTt\n2LFDGzZs0GeffaZnnnlG/v7+2rx5sw4fPmw1r0ePHnrjjTckSTVq1NCWLVu0c+dOQiEAAADwhCAU\nPmEKFSqkhQsXSpLi4uIUGxur33//XSdOnJCjo6PN6xoMBtWqVcvy2tXVVSVLltQzzzxjOebi4pLu\nFlUvLy/L352cnFSkSBElJibaXEeaK3G/ZXmNnJZwKVaxsW4qVapUbpciSbp165YkKSYmJpcreTLR\nP9vRO9vRu6yhf7ajd7ajd1lD/2yX1rucQCh8An3//feaOnWq4uLiVKJECdWsWVOFCxdWamqqzWs6\nOjqme2JpoUKFHjmvcOHCVq/z5cuXpTrSvN3GLctr5Dw3ubu753YRAAAAQJYQCp8wsbGxGjx4sDp0\n6KABAwaobNmykqTBgwfr5MmT6canBb2/B7Xs2MnLacHBwbldwhMn7TduHh4euVzJk4n+2Y7e2Y7e\nZQ39sx29sx29yxr6Z7uYmJgc+/94nj76hPnvf/+r5ORk9enTxxIIExMTFR0dfd/xxYoVkyRdvHjR\ncmz//v05XygAAACAJwI7hU+YGjVqKH/+/Jo+fbqCgoJ07do1LVq0SMnJyfe9z7h+/foqVKiQJk+e\nrH79+uns2bMKDw9XwYIFbbq+2WzO0nkAAAAAeQuh8AlTqVIl/ec//1FoaKj69OkjNzc3BQcHy9XV\nVUOHDrXaEZQkZ2dnzZ49WzNmzFC/fv1UrVo1hYSE6J133rGMMRgM6T5PmJFj/zx/v2P3G5MRO3fu\ntGmePYuNjZUkXb58OcNzTCaTXFxccqgiAAAAPAkMZrZ2kMdER0drYMim3C7jqZdwKVbhE4Pl5+eX\n26XkCXzGwXb0znb0Lmvon+3one3oXdbQP9ulfabQx8cn29dmpxB5UsmKnrldAgAAAGAXeNAMAAAA\nANgxQiEAAAAA2DFCIQAAAADYMUIhAAAAANgxQiEAAAAA2DFCIQAAAADYMUIhAAAAANgxQiEAAAAA\n2DFCIQAAAADYMUIhAAAAANgxQiEAAAAA2DFC4RMuODhY/fr1y/S85ORkNWzYUJ6enrp06VIOVHaP\nrfUBAAAAeDwIhXbqxx9/1N27d1WmTBmtWbMmt8sBAAAAkEsIhXZq3bp1atiwoQIDA7V69ercLgcA\nAABALiEUPkZLly5VixYtVKtWLbVp00YbN260nLt48aLef/99+fn5qWbNmvLz89OUKVOUlJQkSYqL\ni5PRaNTSpUsVEBCgunXrKjo62mr9gQMHqm3btumu27JlS/3nP/+xvE5ISNCOHTvk5+entm3b6syZ\nM9qzZ4/VnHnz5qlLly764osv5Ofnpzp16qh///46d+6cZcyoUaP03nvvad68eapfv77q1aunESNG\nKCEhIVv6BQAAACDnOeR2AfYiNDRUERER6tOnj+rWrasdO3Zo2LBhypcvn1q2bKm33npL+fPn1/jx\n4+Xk5KSdO3fq008/1bPPPqtu3bpZ1gkPD9e4ceOUlJSkWrVqWV2jffv2GjBggI4dO6bq1atLko4c\nOaLTp0+rffv2lnEbN26U2WxWq1at5OzsrEqVKmnlypVq0KCB1XrHjh1TeHi43nvvPRUoUEAzZ87U\nG2+8oa+//loFCxaUJO3YsUOlS5fWpEmT9NdffykkJET9+/fXsmXLcqqVAAAAALIRofAxSEhI0IIF\nC9S7d28NGjRIktSoUSPdvHlTM2fOlLe3t4oXL64xY8ZYwlz9+vW1c+dO/fLLL1ahsG3btmrduvV9\nr/Piiy+qRIkS+uabbzR06FBJ0tdffy13d3e5u7tbxq1bt05NmzaVs7OzJKldu3aKiIhQQkKC5Zgk\n3bhxQ5988olq164tSapSpYrat2+vjRs3WkLm7du39emnn6p8+fKSpBIlSujtt9/W/v37Vbdu3Wzp\nHwAAAICck+lQaDabdfz4cZ0/f16enp4qXLiwDAaDHB0dc6K+p8KhQ4eUlJQkf39/JScnW477+flp\n9erVSklJ0dKlS5WamqrY2FjFxsbq6NGjunLliiVspalcufIDr1OgQAG9/PLL2rBhg4YOHaqUlBRt\n3LhRb775pmXMmTNndOjQIU2bNs1ym2fTpk01Z84crV+/XsHBwZax5cuXtwRCSXJ3d5ebm5uio6Mt\nodDb29uqRn9/fzk4OGQ5FF6J+83muciYhEuxio11U6lSpXK7lDzh1q1bkqSYmJhcruTJQ+9sR++y\nhv7Zjt7Zjt5lDf2zXVrvckKmQuGOHTs0adIkxcXFyWAwaNGiRbp7966GDh2qIUOGqGvXrjlV5xPt\n+vXrkqSgoKB05wwGgy5evKhdu3Zp9uzZunLlikqXLi0vLy8VKlRIZrPZanzJkiUfeq1XXnlFy5Yt\n06FDh/TXX3/p2rVratOmjeX8unXrJN37POA/rVq1yioUlilTJt2YEiVKKD4+/oFj8uXLp+LFi1uN\nscXbbdyyNN8epX3+NO3W3kdzs9pBBgAAgH3KcCjcvXu3BgwYoFq1aqlz58766KOPJEkVKlRQ1apV\n9eGHH8rFxcUqgOAeJycnSVJYWJjKlStndc5sNisxMVFjx47VO+/8f/buPKzKav///3MrKo4IGGqK\npWai4AZBQxQcyDHUY84dJc2Bj5qIOaWW39Q0B1QMFXLAMSvI41CmoeaYGaKZWlE5REcqCxXFgVSG\n3x/+2KcdqLiZtP16XBfXxV73vdb9vt94rtN7r3WveyT9+vXD3t4egJ49ez7wtVxdXalXrx6xsbFc\nu3YNHx8fU+GWlZXFRx99hL+/Py+99JJZvy+++ILIyEhOnDiB0WgEICUlJcf4Fy5coGHDhqbP2QVv\ntszMTC5fvnzf4vV+/lqcSt5kf+PWoEGDYo7k0aT8WU65s5xylz/Kn+WUO8spd/mj/FkuISGBGzdu\nFMrYed59NDw8nIYNG/Luu++aFSt169Zl/fr1NG3alFWrVhVKkI86d3d3bGxsuHjxIq6urqaf06dP\nExkZyeHDhylRogTDhw83FYS///47P/74o0XX69q1K7t27WLfvn107drV1H706FGSkpLo3bs3TZs2\nNcHjOkkAACAASURBVPt56aWXKFWqFBs2bDCdf+7cOc6ePWv6nJCQwC+//GK2Ic2xY8fMZgV3795N\nenp6jk1rRERERETk4ZTnmcKEhATGjBmDjU3OLjY2NnTq1InQ0NACDe6fwsHBgcDAQGbPns2VK1do\n1KgR33//PQsXLuTZZ5+lSZMmZGZmMnPmTDp06MBvv/1GZGQk5cqVs+jbgK5du7JgwQJsbW1p3769\nqX3z5s1UqlQJX1/fHH0qVapEy5Yt+eSTT5g0aRJwZ2ZxxIgRvPLKK6SnpzN//nzc3NzMxkxLSyMo\nKIhhw4Zx4cIF5s+fT9u2bXFzc7MgU/9z4MCBfPV/UEajETs7uyK9poiIiIjIwyDPRWGZMmW4efPm\nXY9funTpAZ5lsj4TJkzA0dGRmJgYwsPDcXJyYsCAAYwcOZJSpUoxceJE1q5dy4YNG3jqqad45ZVX\nTMXh7du3H+haVatWxcXFhXr16lG2bFkAbt68SWxsLM8++2yuhT3c2dl09+7dbN++HYPBYIpx2rRp\npKen8+yzzzJp0iQMBoOpj4eHB82aNWPChAmULl2abt26mXY+zY9XFxddUZianEjktED8/PyK7Joi\nIiIiIg+LPBeFzZs354MPPqBXr15mRQFAYmIi69atw9vbu8AD/KcwGAwMGTKEIUOG5Hp84MCBDBw4\nMEd79rN/NWvW5Pvvv89xfN26dTnaspeeTpgwwdRWpkwZ4uPj7xljx44d6dixI3Dn5fUAL7zwAi+8\n8MJd+xgMBkJCQggJCcn1eG7x5YVjTVeL+omIiIiIyIPJc1E4ZswY+vTpQ+fOnU3F38aNG9mwYQM7\nd+6kTJkyjB49utAClfs7d+4cW7ZsYdeuXdStWxcfH5/iDklERERERB5yed5oxtnZmf/85z/4+Piw\nd+9e4M6L0T/77DNatmxJTEwMderUKaw4JQ+ysrJYu3Ytt27dyvfznQaDIceMsCXniIiIiIjIwy3P\nM4V79uyhcePGhIaGkpmZSUpKChkZGTg4ONz1GTUpWrVq1eLw4cMFMtbIkSMZOXLkPc+ZNWtWgVxL\nRERERESKT55nCidMmGB65USJEiVwdHTEyclJBaGIiIiIiMgjLM9FYYkSJUzv0BMREREREZF/hjxP\n873++uvMnj2bUqVK0aRJExwcHChRImdN6ejoWKABioiIiIiISOHJc1E4ffp00tLSePPNN+96jsFg\nICEhoUACExERERERkcKX56LwxRdfvO852olSRERERETk0ZLnojA4OLgw4xAREREREZFikOei8OLF\ni3k6T88UioiIiIiIPDryXBS2aNHirscMBgNZWVl6plBEREREROQRk+ei8OWXX87RlpGRwaVLl9i/\nfz9lypQhJCSkQIOTh9eRI0dYu3Yt4eHhxR2KiIiIiIjkQ4E8U3jjxg369OnD2bNnCyQoefht2LCB\nn376qbjDEBERERGRfMrzy+vvpVy5cvTu3ZuYmJiCGE5ERERERESKSIEUhQDXr1/nypUrBTWc5NHx\n48fp168fnp6eeHt7ExISwq+//gqAi4sLmzdvZtCgQbi7u9OuXTs++OADs/7Xr19nzpw5+Pv74+7u\nTq9evTh48KDpeFxcHC4uLkRHR9OiRQu8vb2ZOHEimzdv5tSpU7i4uBAfHw/AihUraNeuHUajkXbt\n2hEREUFWVlbRJUNERERERB5YnpePnjhxItf2W7dukZCQwPLly3F3dy+wwOT+rl69SlBQEL6+vowa\nNYorV64QGhrKmDFjTMXfzJkzadeuHUuWLGHv3r1MnToVGxsbevbsSWZmJkOGDCExMZFXXnmF6tWr\n8+GHHxIUFMTSpUvx9fU1XWvFihXMnDmT1NRUGjduTEpKCmfPnmX+/PnUqVOHLVu2EB4ezqRJk6hX\nrx5fffUVYWFhODo60qdPn+JKkYiIiIiI3Eeei8LevXvf83iVKlWYNGlSvgOSvDtz5gxXrlwhMDAQ\nDw8PAOzt7YmLizPN0BmNRt566y0AfH19+eOPP3jnnXfo2bMne/fu5dixY0RFRZl2l/Xz86Nv374s\nWLDArCjs378/rVu3Nn22t7fH1tYWo9EIwNGjR6lRowYvvPACAE2aNKFUqVJUrVq10PMgIiIiIiKW\ny3NRmF1Y/F2JEiV47LHH8Pb2xsYmz8NJAahXrx52dnYMGzaMgIAAWrVqRbNmzWjatKnpnM6dO5v1\nefbZZ9mxYwe///478fHxVKhQIcfrRjp16sTs2bO5ceOGqa127dr3jKVp06bExMTQo0cPOnToQOvW\nrXnppZcsvreLSd9a3PdBpSYnkpjoTJUqVYrsmoUhLS0NQK+FsZDyZznlznLKXf4of5ZT7iyn3OWP\n8me57NwVhjxXcd7e3jg4OFC2bNlcj6empvLjjz/SpEmTAgtO7q18+fKsX7+eJUuWsGnTJtavX0+l\nSpUICgpiyJAhADg5OZn1cXBwAODKlSukpqbi6OiYY9wqVaqQlZXF9evXTW25nfdXXbp0ISMjg/Xr\n1xMWFsaCBQuoX78+M2fOxM3N7YHvbXhn5wfuYzln6tevX4TXExERERF5eOS5KHz22WcJDQ2lS5cu\nuR6PjY3lrbfe4tixYwUWnNzfU089RVhYGOnp6cTHx7N27VrmzZvHM888A8Dly5fNzr948SJwp8iz\ns7PjwoULOcZMTk4GwM7O7oFi6datG926dePSpUvs3r2bJUuWMGHCBLZt2/bA9xUYGPjAfaxd9jdu\nDRo0KOZIHk3Kn+WUO8spd/mj/FlOubOccpc/yp/lEhISzFbyFaS7FoVJSUksX74cg8Fgej5t48aN\nHD16NMe5mZmZHDp06K6ziFI49uzZw8SJE9m+fTsODg74+PhQq1Yt9uzZY9qBdPfu3QQEBJj67Ny5\nk3r16uHo6IiXlxcrV67k888/N3t+cPv27bi5uVG6dOm7XrtECfONa1999VXS0tIIDw/HwcGBnj17\ncv78eaKiogr4rkVEREREpCDdtSisWbMm586d44svvjC1HTp0iEOHDuU4t0SJEjg4ODB27NjCiVJy\n5eHhgcFgIDg4mKFDh2JjY8OaNWuws7PD29sbuFPgOTk50aJFC3bv3s3u3btZtGgRAG3atMHd3Z3x\n48fzyiuvUK1aNTZu3MjJkyeJjIy857Xt7Ow4f/48X3zxBa6urnh7ezN58mTCwsLw8fHh/PnzfPDB\nB7Rv377Q8yAiIiIiIpa75/LRlStXmn53cXFh7ty5dO3atdCDkryxt7dn+fLlzJ8/nwkTJnD79m08\nPDxYvXo19vb2AIwcOZK4uDjWr19P7dq1CQ8Pp23btsCdYn7FihWEhoYSFhZGWloaDRo0YNmyZWYz\nhwaDIce1+/Tpw549exg2bBizZ8+me/fuXLt2jffff59Vq1ZRqVIlOnXqZPEXBQcOHLCoX2ExGo0P\nvJxWRERERORRkOdnCnft2nXfzUak6DVq1IjVq1ff9biTkxNr1qy56/GKFSsyffp0pk+fnutxb2/v\nXHeHevLJJ/n000/N2l588UVefPHFvAV+H68ufniKwtTkRCKnBeLn51fcoYiIiIiIFLg8F4U1a9Yk\nNTWV+Ph4bty4QWZmpulYRkYG165dIz4+ngULFhRKoGJdHGu6FncIIiIiIiJWIc9F4ddff83gwYPN\nXlPwd4/6e95ERERERESsTZ6LwrCwMAwGA9OnT+f27du8+eabLF68mJs3b/LBBx9w+fJl/vOf/xRm\nrPKAvv/+++IOQUREREREHnIl7n/KHd988w3//ve/6d27N7169cLGxgaDwUBAQAArV67EYDCwbNmy\nwoxVRERERERECliei8Jbt27xxBNPAFC6dGmcnZ1NG5CUKlWK559/ns2bNxdOlCIiIiIiIlIo8lwU\nVqtWjV9++cX0uXbt2mbLE21tbfnjjz8KNjoREREREREpVHkuCtu2bcu6dev4+OOPycjI4JlnnuHg\nwYMcP36c1NRUtmzZwuOPP16YsYqIiIiIiEgBy3NROHz4cOrWrcv48eO5ceMGvXr1wt7enj59+uDt\n7c3XX3/NoEGDCjNWERERERERKWB53n20UqVKvP/++5w4cYKKFSsCEBMTY9p51M/Pj1atWhVaoCIi\nIiIiIlLw8lwUAhgMBtzd3YE7G8/Y29szcuTIQglMRERERERECl+el48C/Pbbb0ycOJFmzZrh7u7O\n4cOHOXLkCC+99BInT54srBhFRERERESkkOS5KDx37hw9evRg165deHh4kJWVBUBWVhYnTpwgMDCQ\nEydOFFqgIiIiIiIiUvDyXBSGhoZSsmRJtm3bxltvvWVqb9q0Kdu2bcPR0ZHw8PBCCbKoubi4sGrV\nqjyff/78eQYPHkxKSkohRvVgdu3axf/7f//P9HnRokU0bty4yOOIi4vDxcWFb7/9tsivLSIiIiIi\n95fnZwq//PJLBg4ciJOTE5cuXTI7VrVqVfr168fSpUsLPMDiEBMT80Cv1/jiiy84ePAgBoOhEKN6\nMGvWrKF8+fKmz71796ZNmzbFGJGIiIiIiDyM8lwU3r59Gzs7u7seNxgM3Lp1q0CCKm5Go9GiftlL\nah9GVatWpWrVqsUdhoiIiIiIPGTyvHzU1dWV7du353rs5s2bbNy4kQYNGhRYYMXpr8tHFy1aRI8e\nPdi6dSsdOnTAaDTSs2dPjh07BsDGjRuZPHkyAD4+PixevBiA9PR03n77bVq3bo3RaKRHjx4cOnTI\ndI3sZZXR0dG0aNECb29vkpKS8Pf3Z8WKFbzxxht4e3vj5eXFxIkTuX79uqnvtWvXmDFjBv7+/ri5\nueHj48PEiRO5evUqAIGBgcTHx7N3715cXFz45ZdfciwfvX37NsuWLTPdU5cuXdi6davpeFJSEi4u\nLuzZs4fBgwfj4eFBy5Yteeedd8xydfbsWUaNGoWPjw9ubm74+/sTERFRkH8OEREREREpRHkuCoOD\ngzl27BiDBw82FYffffcd0dHRdO/endOnTzNs2LBCC7Q4JSYmsmjRIkaNGsWiRYu4efMmISEhZGRk\n0Lp1a4YPHw5AVFQUvXr1AmDKlCmsXr2agQMHEhERQZ06dRg6dKipmMy2YsUKZs6cyWuvvUbNmjUB\nWLp0KdeuXSMsLIzRo0ezdetWIiMjTX3Gjh3L7t27GTduHKtWrWLQoEFs3brVVIxNnTqVhg0b4uXl\nRUxMDI899liOe3r11VeJjIykb9++vPPOO3h6ejJu3Dg+/PBDs/MmTZpE48aNWbp0KW3atGHhwoXs\n378fgOvXr/Piiy+SmprKnDlzWL58Oc2aNSM8PJw9e/YUUPZFRERERKQw3XX5aHR0ND4+PtSqVQsA\nb29vIiIimDZtGm+++SZwZ/MZAEdHR0JDQ2nZsmURhFz0rl+/zurVq2nUqBEAGRkZjBgxgh9++IGG\nDRvi7OwM3JlNrVy5MmfOnGHTpk3MmDGDnj17AuDr60tycjILFy5kzZo1prH79+9P69atza5XrVo1\n5s+fD0Dz5s05fPgw+/btY9y4cdy8eZP09HSmT5+Or68vcGezn6+++orDhw8DULduXcqXL0/58uVz\nXQr7ww8/sG3bNqZPn07v3r1N18kuRLNjBnjuuedM76J85plniI2NZf/+/bRs2ZKffvqJJ598krCw\nMOzt7YE7/0527dpFfHy8nmEUEREREXkE3LUonD17Nq+99pqpKPT39+e1115j586dJCQk8N///pfM\nzEyqV6+O0WikVKlSRRZ0UbOxsTEVhIDp2bwbN27ken52cdayZUvS09NN7S1btmTBggVmbbVr187R\n/++FXNWqVUlISACgTJkyREVFAXeWeCYmJnLq1CnOnj1LmTJl8nQ/R44cAaBjx45m7Z06deKTTz7h\nzJkz2NraAuDu7m46bjAYcHJyIi0tDQA3Nzfeffddbt++zenTp0lMTOS7777j9u3b+X6+9GLSw7Nb\naWpyIomJzlSpUqW4Q7mn7L9L9r8VeTDKn+WUO8spd/mj/FlOubOccpc/yp/lsnNXGO5aFJYqVYq9\ne/fyzDPPUK5cOX799Vd+//13Ll++TPXq1alevbrp3NTUVNPvjo6OhRZscfl7wVuixJ1Vt3fbWOby\n5csAuc6cGgwGs1dX5JavsmXL5uiTmZlp+vzZZ58xa9YskpKSsLe3x83NDVtbW7Nz7uXKlSvY2NhQ\nqVIls/bsoufatWumovDvsZQoUcLsOpGRkURFRXHt2jVq1KiBh4dHgXxBMLyzc77HKDjO1K9fv7iD\nEBEREREpFHctCnv06MGqVavYtWuXqW369OlMnz79roMZDAZV/UDFihUxGAxER0dTsmRJU3t2EVm5\ncmWLx05MTCQkJITu3bvz8ssvm2YtQ0JCOHv2bJ7GsLOzIz09ndTUVLPC8MKFCw8U3+bNmwkPD2fq\n1KkEBARQoUIF4M5S1PwKDAzM9xjWJvt/e/+UDZ+KmvJnOeXOcspd/ih/llPuLKfc5Y/yZ7mEhIS7\nrlTMr7sWha+++ipNmzblxx9/5Pbt2yxZsoR27drx9NNP33Wwh+k9fUUpe+Ywm5eXF1lZWVy9epUW\nLVqY2qOiovjhhx+YM2fOA18jO7ffffcd6enpBAUFmS1jPXr0qOm5vtxi+nt8ANu3b6dPnz6m9m3b\ntlGlShWefPJJkpKS7hvTsWPHqFatmtkY3377LZcuXXqoX88hIiIiIiL/c8/3FPr7++Pv7w/Apk2b\n+Ne//kXbtm2LJLBHSfZs244dO/Dx8aFBgwa0b9+e8ePHM3LkSOrUqcPhw4dZunQpQ4YMsah4zi6y\nGjRoQMmSJQkNDaVv376kpKSwcuVK0tPTzb45sLOzIyEhgbi4OLPnAuHOKzfat2/P7NmzuX79Ok8/\n/TSfffYZ27Zt44033shTHHDn2cfo6GiWLFlC06ZNOXPmDJGRkdjZ2RXatxgiIiIiIlKw8vzy+t27\ndxdmHA8tg8GQaxH317bmzZvj6+vLm2++Se/evZkyZQrz5s0jPDycZcuWcfHiRWrUqMHYsWMZNGhQ\nrmPkNYbatWszZ84cFi9eTFBQEM7OzgQGBuLg4MCYMWNITk7mscceY+DAgbzyyisEBQWxevXqHPeR\nHd/q1au5fPkydevWZd68eXTu3Pm+sWTr3r07iYmJfPDBByxduhQ3Nzfmzp3Lrl27zN7JaEkRfODA\ngQfuY+0SExOB/y0DtpTRaMTOzq4AIhIRERGRR4EhS+v85CFz9OhRgufGFncYVik1OZHIaYH4+fkV\ndyhFTs84WE65s5xylz/Kn+WUO8spd/mj/Fku+5nC7EfBClKeZwpFipJjTdfiDkFERERExCrcfTcS\nERERERER+cdTUSgiIiIiImLFVBSKiIiIiIhYMRWFIiIiIiIiVkxFoYiIiIiIiBVTUSgiIiIiImLF\nVBSKiIiIiIhYMRWFIiIiIiIiVkxFoYiIiIiIiBVTUSgiIiIiImLFrLYo9Pf3x8XFhTlz5uR6/Jdf\nfsHFxQUXFxdSUlIIDAxk2LBhhR5XUlISLi4u7NixA4Dz588zePBgUlJS8jxG9r399cfNzQ0/Pz/G\njx/PH3/8UVjhi4iIiIjII8amuAMoTgaDgZ07d/Lqq6/mOBYbG2s6x2AwMHXqVEqWLFnoMTk5ORET\nE8OTTz4JwBdffMHBgwcxGAwPNE7Hjh0ZNGiQ6XNaWhpff/01ERERJCYm8uGHHxZk2CIiIiIi8oiy\n6qKwcePGfPXVVyQkJNCgQQOzY59++in169fnhx9+AKBu3bpFElPp0qUxGo052rOysh5onCpVquQY\nx9vbm7S0NN555x3OnDlTZPckIiIiIiIPL6tdPgrQoEEDnJ2dTbOC2X799Ve++eYbOnbsCNwpyP66\nfDQuLg4XFxeOHDlC3759MRqNtG3bNsfsW1JSEiEhITRv3hxPT09GjBjBzz//bDq+aNEievTowVtv\nvYWnpyfdu3c3LVuNjY1l48aNTJ48GQAfHx8WL15McHAwXbp0yXEvHTp0uOtS2L8qV65cjraPPvqI\nHj164OHhgYeHB3379uXIkSNm58TFxdGvXz8aN25Mq1atmD17Nrdu3TId/+abbxgwYAAeHh74+Pgw\nY8YM/vzzz/vGIyIiIiIixcuqi0KA9u3bs3PnTrO22NhY3N3dqVat2j37jhkzho4dO7J8+XIaNmzI\nlClTOHPmDHDnWcBevXpx7tw5pk2bxqxZs0hKSuLf//632TN9P/zwAz/++CMRERGEhISYZgQNBgOt\nW7dm+PDhAERFRdGrVy+6devGqVOn+PHHH01jnDhxgp9//plu3bqZ2jIzM8nIyCA9PZ309HSuXr3K\nnj17WLlyJY0aNTLNEn766ae8+uqrtGnThuXLl/PWW29x9epVRo8eze3bt03jDxo0iEqVKrFw4UKC\ng4PZsGEDM2fOBOD06dP079+fkiVL8vbbbzNu3Di2bdvG6NGjLfqbiIiIiIhI0bHq5aMGg4EOHToQ\nFRXF2bNnqVOnDnCnUHruuefuu2RzwIABDBw4EICGDRuyc+dODhw4QN26dVm9ejW3bt1i5cqVVK5c\nGYBnnnmGtm3bsmrVKtNzjOnp6UycOBEXFxfgzuxiNgcHB5ydnQFwdXWlcuXKODg4YG9vz9atWxkz\nZgwAH3/8MfXr16d+/fqmvu+99x7vvfeeWbzly5fn2WefZeLEiaa2//73v/Tr14+RI0ea2kqVKkVw\ncDA///wzTz31FEuXLsXZ2ZmIiAjTs403b95k8+bNZGZmEhERgZOTE8uWLcPG5s4/qSeeeIL+/ftz\n5MgRmjRpkpc/h4iIiIiIFAOrLgoBjEYj1atXZ8eOHQwbNozffvuNkydPEh4ezsGDB+/Z193d3fR7\nxYoVKVeuHDdu3AAgPj4eb29vU0EIYG9vj4+PD4cPHzYbJ3tTmbwoVaoUAQEBfPLJJ4wZM4aMjAy2\nbdvG4MGDzc577rnnGDx4MFlZWRw7dox58+bRs2dPJk2aZHZeUFAQAKmpqZw9e5affvqJ3bt3A5iW\nhx47dowuXbqYbXbTr18/+vXrB9xZWtq2bVvgTpEL4OHhQYUKFTh06JBFReHFpG8fuI/kX2pyIomJ\nzlSpUqW4QylyaWlpACQkJBRzJI8e5c5yyl3+KH+WU+4sp9zlj/JnuezcFQarLwrhzhLS7KIwNjYW\no9FI1apV79uvbNmyZp9LlChBZmYmcKfIcnV1zdHHwcGB06dPm41ha2v7QPE+//zzvPvuu3z99ddc\nvXqVlJQUOnfunOM62dd3c3OjQoUKTJo0ifLlyzNq1CjTecnJybz22mscOHCAUqVKUa9ePWrUqAH8\nb3Ob1NRUHB0d7xrP5cuXiY6OJjo62qzdYDCQnJz8QPeWbXhnZ4v6WbPsIr506dL5GMXZbMZZRERE\nRP75VBQC7dq1Y82aNfzyyy/ExsbSqVOnfI9ZuXLlXAuiCxcumM0eWsLV1ZV69eoRGxvLtWvX8PHx\nwcnJ6Z59nn/+ebZu3crSpUtp166dabfVsWPH8scffxAdHY2bmxslSpRg3759pvckAlSoUIGLFy+a\njXflyhW+/fZbPD09qVixIm3btuWFF14wOycrKwt7e3uL7jEwMNCiftYs+xu3v++kK3mj/FlOubOc\ncpc/yp/llDvLKXf5o/xZLiEhwbQqsaBZ/UYzAJ6enjz22GO8//77nDhxwrTraH54eXkRFxdn9tL5\nS5cucejQITw9PfM8TokSuf+Junbtyq5du9i3bx9du3bN01iTJ0/GYDDw1ltvmdqOHz9OQEAARqPR\ndK0DBw4A/5spbNy4Mfv37zd7xnLr1q383//9HxkZGXh5eXHmzBlcXV1NP9WrVycsLIxTp07l+V5F\nRERERKToqSjkTuHVrl07Vq9eTaNGjfK0dDQ3fy2aBg4cSKlSpRg0aBA7duwgNjaWQYMGUaZMGQYM\nGJDnMStVqgTAjh07OHfunKm9a9euJCUlcfXqVdq3b5+nserWrUuvXr2Ij483vYajUaNGbNy4kdjY\nWA4dOsT06dPZtm0b8L91y8OGDePcuXOMGjWK/fv3Ex0dzdtvv03//v0pX748I0aM4JtvviEkJIR9\n+/axc+dOBg8eTEJCAg0bNszzvYqIiIiISNHT8tH/X/v27Xn//fdzzBL+dXOV+7X/ta1atWqsX7+e\n0NBQXn31VWxsbGjWrBlvv/22qeg0GAx3HT9b8+bN8fX15c0336R3795MmTIFgKpVq+Li4kK9evVy\nPNt4L8HBwXz88cfMmzcPf39/Zs2axdSpU5k0aRKlS5embdu2bNmyhU6dOvH111/TtGlT3N3diYqK\nIiwsjJEjR1KlShVefPFF0+syXF1dWbNmDWFhYYSEhFCmTBk8PT2ZN2/efZe13k32bKXkXWJiInBn\niXJRMxqN2NnZFfl1RURERCT/DFn3e++CPJR+//13/P39WbFiBT4+PsUdToE6evQowXNjizsMyaPU\n5EQipwXi5+dX3KHki55xsJxyZznlLn+UP8spd5ZT7vJH+bNc9jOFXl5eBT62ZgofMefOnWPLli3s\n2rWLunXr/uMKwmyONXPu3CoiIiIiIgVPzxQ+YrKysli7di23bt0iNDS0uMMREREREZFHnGYKHzG1\natXi8OHDxR2GiIiIiIj8Q2imUERERERExIqpKBQREREREbFiKgpFRERERESsmIpCERERERERK6ai\nUERERERExIqpKBQREREREbFiKgpFRERERESsmIpCERERERERK6aiUERERERExIqpKHyE/Prrr/Tt\n2xej0Ui3bt2KLY6NGzfi4uLC5cuXiy0GEREREREpGDbFHYDk3dq1a/n+++9ZuHAh1apVK+5wRERE\nRETkH0BF4SPkypUr1KxZE39//+IORURERERE/iG0fPQR4e/vz6ZNmzh9+jQuLi5s3ryZn3/+mREj\n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\nd2+fcY/fg/z555906tSJM2fOUL9+fQICAjCZTDz77LPm+xPvZmdn98D+0tLSHjq7aXp6OvXr17/v\nsx3vVfSKiEjWqSgUERF5gp0/fx4PDw/z++joaODOJahFixalUKFCnDt3LtN2v/zyCwClSpV6pP1t\n27aNkydP8uGHH9KyZUvz8qioKCuihzJlyvDtt9+SkpJicbZwz549bN++nbFjx1K2bFmSkpIynSm8\ndOkSp06domDBglbtW0RE7tA9hSIiIk+wVatWWbxftmwZjo6O+Pv7Y29vT6NGjdi9ezdnz541t0lJ\nSWHZsmUUKlSIevXqPbB/e3t7i0tCr1+/DmBxj6JhGKxevRr432WhWdW0aVNu375NZGSkxfKPP/6Y\ngwcP4uLiQtOmTYmKiuLbb7+1aDNt2jQGDhxIcnLyI+1TREQs6UyhiIjIE+zTTz8lMTGR2rVrs3//\nfnbv3k1ISAjFixcHYMSIEXzzzTe88cYb5kdSfPbZZ/z4449MmDCBZ555xtzXvS7jLFasGKmpqSxY\nsIAGDRpQv3598uXLx8iRI+nUqROGYbBt2zYuX75M/vz5SUxMfKT4AwMDqVevHu+99x6nT5+mcuXK\n7Nu3j0OHDjFr1iwA+vbty5dffkmfPn144403KF++PPv27WPXrl10796dMmXKZCODIiKiM4UiIiJ/\nM3Z2dve8F+9ey+bOnUtsbCwzZswgJiaGyZMn079/f/P65557jn//+9+8+OKLrFy5kvDwcBwdHZk3\nbx5vvPHGQ/vv0KED1atXZ/78+WzatAkPDw/Cw8NxcHBgxowZLFmyhBo1arBu3TqqV6/Od999l6Xj\nu/vfCxcupGvXruzYsYPp06fz+++/M2fOHFq1agXcmazmk08+oUWLFmzevJlp06YRExPD22+/zejR\nox+6PxEReTA9vF5EROQJlPHw+q+++gp3d/fcDkdERJ5gOlMoIiIiIiKSh6koFBERERERycNUFIqI\niDyhHvYMQBERkazQPYUiIiIiIiJ5mM4UioiIiIiI5GEqCkVERERERPIwFYUiIiIiIiJ5mIpCERER\nERGRPExFoYiIiIiISB6molBERERERCQP+38dB+tfQVO9lAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x130ae5fd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.barh(range(len(dfpredict.columns)),clf.feature_importances_)\n",
"plt.ylim([0,20])\n",
"plt.yticks(range(len(dfpredict.columns)), dfpredict.columns)\n",
"plt.ylabel(\"feature\")\n",
"plt.xlabel(\"importance\")\n",
"plt.title(\"Feature Importance\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Below is a decision tree classifier. Intuitively I think this should be worse than the random forest, because in some sense a decision tree is just a subset of a random forest. "
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
},
{
"cell_type": "code",
<<<<<<< HEAD
"execution_count": 99,
=======
"execution_count": 14,
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
<<<<<<< HEAD
"0.65174877773599094"
]
},
"execution_count": 99,
=======
"0.67168108311395258"
]
},
"execution_count": 14,
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dt = DecisionTreeClassifier()\n",
"dt.fit(X_train,y_train)\n",
"predicted = dt.predict(X_test)\n",
"metrics.accuracy_score(y_test, predicted)"
]
},
{
<<<<<<< HEAD
"cell_type": "code",
"execution_count": 103,
=======
"cell_type": "markdown",
"metadata": {},
"source": [
"Last one. Let's try Linear SVM. "
]
},
{
"cell_type": "code",
"execution_count": 18,
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
"metadata": {
"collapsed": false
},
"outputs": [
{
<<<<<<< HEAD
"ename": "AttributeError",
"evalue": "'LinearSVC' object has no attribute 'LinearSVC'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-103-792d9d76ea61>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msvmm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msvm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mLinearSVC\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mloss\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"hinge\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0msvmm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mpredicted\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msvmm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_test\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mmetrics\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maccuracy_score\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_test\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpredicted\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mAttributeError\u001b[0m: 'LinearSVC' object has no attribute 'LinearSVC'"
=======
"data": {
"text/plain": [
"0.63144039112448291"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.svm import LinearSVC\n",
"from sklearn.grid_search import GridSearchCV\n",
"svmm = LinearSVC(loss=\"hinge\")\n",
"C = [0.001,0.01,0.1,1,10,100,1000]\n",
"fitmodel = GridSearchCV(svmm, param_grid={\"C\":C}, cv=5, scoring=\"accuracy\")\n",
"fitmodel.fit(X_train, y_train)\n",
"fitmodel.best_estimator_, fitmodel.best_params_, fitmodel.best_score_, fitmodel.grid_scores_\n",
"\n",
"svm_best=LinearSVC(loss=\"hinge\",C=fitmodel.best_params_['C'])\n",
"svm_best.fit(X_train, y_train)\n",
"ypred_svm = svm_best.predict(X_test)\n",
"metrics.accuracy_score(ypred_svm, y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Given that our data stretches back only as far as 2009, it is worth seeing whether dropping `intendedgradyear` as a predictor will help. This assumes that the admissions regime at all of the top 25 colleges has not drastically changed over the last few years. "
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{100: 0.7295975930801053, 5: 0.69198946972546072, 1000: 0.73260624294847687, 10: 0.71004136893569014, 50: 0.72320421210981567, 500: 0.73072583678074465, 25: 0.72470853704400151, 250: 0.72433245581045502}\n",
"1000 0.732606242948\n"
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
}
],
"source": [
<<<<<<< HEAD
"svmm = svm.LinearSVC(loss=\"hinge\")\n",
"svmm.fit(X_train,y_train)\n",
"predicted = svmm.predict(X_test)\n",
"metrics.accuracy_score(y_test, predicted)"
=======
"dfpredict1 = dfpredict.drop(\"intendedgradyear\",axis=1)\n",
"X = imp.transform(dfpredict1)\n",
"y = dfresponse\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n",
"ntdict = {}\n",
"for nt in [5,10,25,50,100,250,500,1000]:\n",
" clf = RandomForestClassifier(n_estimators=nt,criterion=\"gini\")\n",
" clf.fit(X_train,y_train)\n",
" predicted = clf.predict(X_test)\n",
" ntdict[nt] = metrics.accuracy_score(y_test, predicted)\n",
"print ntdict\n",
"best_nt = max(ntdict, key=ntdict.get)\n",
"print best_nt, ntdict[best_nt]\n",
"clf = RandomForestClassifier(n_estimators=nt)\n",
"clf.fit(X_train,y_train)\n",
"predicted = clf.predict(X_test)"
>>>>>>> f47037e505ae5ecdf91ba7883e1caa0efe27df95
]
},
{
"cell_type": "code",