596 KiB
596 KiB
In [1]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
steps=250
distance=0
x=0
distance_list=[]
steps_list=[]
while x<steps:
distance+=np.random.randint(-1,2)
distance_list.append(distance)
x+=1
steps_list.append(x)
plt.plot(steps_list,distance_list, color='green', label="Random Walk Data")
steps_list=np.asarray(steps_list)
distance_list=np.asarray(distance_list)
X=steps_list[:,np.newaxis]
#Polynomial fits
#Degree 2
poly_features=PolynomialFeatures(degree=2, include_bias=False)
X_poly=poly_features.fit_transform(X)
lin_reg=LinearRegression()
poly_fit=lin_reg.fit(X_poly,distance_list)
b=lin_reg.coef_
c=lin_reg.intercept_
print ("2nd degree coefficients:")
print ("zero power: ",c)
print ("first power: ", b[0])
print ("second power: ",b[1])
z = np.arange(0, steps, .01)
z_mod=b[1]*z**2+b[0]*z+c
fit_mod=b[1]*X**2+b[0]*X+c
plt.plot(z, z_mod, color='r', label="2nd Degree Fit")
plt.title("Polynomial Regression")
plt.xlabel("Steps")
plt.ylabel("Distance")
#Degree 10
poly_features10=PolynomialFeatures(degree=10, include_bias=False)
X_poly10=poly_features10.fit_transform(X)
poly_fit10=lin_reg.fit(X_poly10,distance_list)
y_plot=poly_fit10.predict(X_poly10)
plt.plot(X, y_plot, color='black', label="10th Degree Fit")
plt.legend()
plt.show()
#Decision Tree Regression
from sklearn.tree import DecisionTreeRegressor
regr_1=DecisionTreeRegressor(max_depth=2)
regr_2=DecisionTreeRegressor(max_depth=5)
regr_3=DecisionTreeRegressor(max_depth=11)
regr_1.fit(X, distance_list)
regr_2.fit(X, distance_list)
regr_3.fit(X, distance_list)
X_test = np.arange(0.0, steps, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
y_3=regr_3.predict(X_test)
# Plot the results
plt.figure()
plt.scatter(X, distance_list, s=2.5, c="black", label="data")
plt.plot(X_test, y_1, color="red",
label="max_depth=2", linewidth=2)
plt.plot(X_test, y_2, color="green", label="max_depth=5", linewidth=2)
plt.plot(X_test, y_3, color="m", label="max_depth=7", linewidth=2)
plt.xlabel("Data")
plt.ylabel("Darget")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()2nd degree coefficients: zero power: 7.069813447337733 first power: -0.169654380239669 second power: 0.00048141857827328896
In [2]:
import os
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.tree import export_graphviz
from IPython.display import Image
from pydot import graph_from_dot_data
import pandas as pd
import numpy as np
cancer = load_breast_cancer()
X = pd.DataFrame(cancer.data, columns=cancer.feature_names)
print(X)
y = pd.Categorical.from_codes(cancer.target, cancer.target_names)
y = pd.get_dummies(y)
print(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
tree_clf = DecisionTreeClassifier(max_depth=5)
tree_clf.fit(X_train, y_train)
export_graphviz(
tree_clf,
out_file="DataFiles/cancer.dot",
feature_names=cancer.feature_names,
class_names=cancer.target_names,
rounded=True,
filled=True
)
cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
os.system(cmd)Out [2]:
mean radius mean texture mean perimeter mean area mean smoothness \
0 17.990 10.38 122.80 1001.0 0.11840
1 20.570 17.77 132.90 1326.0 0.08474
2 19.690 21.25 130.00 1203.0 0.10960
3 11.420 20.38 77.58 386.1 0.14250
4 20.290 14.34 135.10 1297.0 0.10030
5 12.450 15.70 82.57 477.1 0.12780
6 18.250 19.98 119.60 1040.0 0.09463
7 13.710 20.83 90.20 577.9 0.11890
8 13.000 21.82 87.50 519.8 0.12730
9 12.460 24.04 83.97 475.9 0.11860
10 16.020 23.24 102.70 797.8 0.08206
11 15.780 17.89 103.60 781.0 0.09710
12 19.170 24.80 132.40 1123.0 0.09740
13 15.850 23.95 103.70 782.7 0.08401
14 13.730 22.61 93.60 578.3 0.11310
15 14.540 27.54 96.73 658.8 0.11390
16 14.680 20.13 94.74 684.5 0.09867
17 16.130 20.68 108.10 798.8 0.11700
18 19.810 22.15 130.00 1260.0 0.09831
19 13.540 14.36 87.46 566.3 0.09779
20 13.080 15.71 85.63 520.0 0.10750
21 9.504 12.44 60.34 273.9 0.10240
22 15.340 14.26 102.50 704.4 0.10730
23 21.160 23.04 137.20 1404.0 0.09428
24 16.650 21.38 110.00 904.6 0.11210
25 17.140 16.40 116.00 912.7 0.11860
26 14.580 21.53 97.41 644.8 0.10540
27 18.610 20.25 122.10 1094.0 0.09440
28 15.300 25.27 102.40 732.4 0.10820
29 17.570 15.05 115.00 955.1 0.09847
.. ... ... ... ... ...
539 7.691 25.44 48.34 170.4 0.08668
540 11.540 14.44 74.65 402.9 0.09984
541 14.470 24.99 95.81 656.4 0.08837
542 14.740 25.42 94.70 668.6 0.08275
543 13.210 28.06 84.88 538.4 0.08671
544 13.870 20.70 89.77 584.8 0.09578
545 13.620 23.23 87.19 573.2 0.09246
546 10.320 16.35 65.31 324.9 0.09434
547 10.260 16.58 65.85 320.8 0.08877
548 9.683 19.34 61.05 285.7 0.08491
549 10.820 24.21 68.89 361.6 0.08192
550 10.860 21.48 68.51 360.5 0.07431
551 11.130 22.44 71.49 378.4 0.09566
552 12.770 29.43 81.35 507.9 0.08276
553 9.333 21.94 59.01 264.0 0.09240
554 12.880 28.92 82.50 514.3 0.08123
555 10.290 27.61 65.67 321.4 0.09030
556 10.160 19.59 64.73 311.7 0.10030
557 9.423 27.88 59.26 271.3 0.08123
558 14.590 22.68 96.39 657.1 0.08473
559 11.510 23.93 74.52 403.5 0.09261
560 14.050 27.15 91.38 600.4 0.09929
561 11.200 29.37 70.67 386.0 0.07449
562 15.220 30.62 103.40 716.9 0.10480
563 20.920 25.09 143.00 1347.0 0.10990
564 21.560 22.39 142.00 1479.0 0.11100
565 20.130 28.25 131.20 1261.0 0.09780
566 16.600 28.08 108.30 858.1 0.08455
567 20.600 29.33 140.10 1265.0 0.11780
568 7.760 24.54 47.92 181.0 0.05263
mean compactness mean concavity mean concave points mean symmetry \
0 0.27760 0.300100 0.147100 0.2419
1 0.07864 0.086900 0.070170 0.1812
2 0.15990 0.197400 0.127900 0.2069
3 0.28390 0.241400 0.105200 0.2597
4 0.13280 0.198000 0.104300 0.1809
5 0.17000 0.157800 0.080890 0.2087
6 0.10900 0.112700 0.074000 0.1794
7 0.16450 0.093660 0.059850 0.2196
8 0.19320 0.185900 0.093530 0.2350
9 0.23960 0.227300 0.085430 0.2030
10 0.06669 0.032990 0.033230 0.1528
11 0.12920 0.099540 0.066060 0.1842
12 0.24580 0.206500 0.111800 0.2397
13 0.10020 0.099380 0.053640 0.1847
14 0.22930 0.212800 0.080250 0.2069
15 0.15950 0.163900 0.073640 0.2303
16 0.07200 0.073950 0.052590 0.1586
17 0.20220 0.172200 0.102800 0.2164
18 0.10270 0.147900 0.094980 0.1582
19 0.08129 0.066640 0.047810 0.1885
20 0.12700 0.045680 0.031100 0.1967
21 0.06492 0.029560 0.020760 0.1815
22 0.21350 0.207700 0.097560 0.2521
23 0.10220 0.109700 0.086320 0.1769
24 0.14570 0.152500 0.091700 0.1995
25 0.22760 0.222900 0.140100 0.3040
26 0.18680 0.142500 0.087830 0.2252
27 0.10660 0.149000 0.077310 0.1697
28 0.16970 0.168300 0.087510 0.1926
29 0.11570 0.098750 0.079530 0.1739
.. ... ... ... ...
539 0.11990 0.092520 0.013640 0.2037
540 0.11200 0.067370 0.025940 0.1818
541 0.12300 0.100900 0.038900 0.1872
542 0.07214 0.041050 0.030270 0.1840
543 0.06877 0.029870 0.032750 0.1628
544 0.10180 0.036880 0.023690 0.1620
545 0.06747 0.029740 0.024430 0.1664
546 0.04994 0.010120 0.005495 0.1885
547 0.08066 0.043580 0.024380 0.1669
548 0.05030 0.023370 0.009615 0.1580
549 0.06602 0.015480 0.008160 0.1976
550 0.04227 0.000000 0.000000 0.1661
551 0.08194 0.048240 0.022570 0.2030
552 0.04234 0.019970 0.014990 0.1539
553 0.05605 0.039960 0.012820 0.1692
554 0.05824 0.061950 0.023430 0.1566
555 0.07658 0.059990 0.027380 0.1593
556 0.07504 0.005025 0.011160 0.1791
557 0.04971 0.000000 0.000000 0.1742
558 0.13300 0.102900 0.037360 0.1454
559 0.10210 0.111200 0.041050 0.1388
560 0.11260 0.044620 0.043040 0.1537
561 0.03558 0.000000 0.000000 0.1060
562 0.20870 0.255000 0.094290 0.2128
563 0.22360 0.317400 0.147400 0.2149
564 0.11590 0.243900 0.138900 0.1726
565 0.10340 0.144000 0.097910 0.1752
566 0.10230 0.092510 0.053020 0.1590
567 0.27700 0.351400 0.152000 0.2397
568 0.04362 0.000000 0.000000 0.1587
mean fractal dimension ... worst radius \
0 0.07871 ... 25.380
1 0.05667 ... 24.990
2 0.05999 ... 23.570
3 0.09744 ... 14.910
4 0.05883 ... 22.540
5 0.07613 ... 15.470
6 0.05742 ... 22.880
7 0.07451 ... 17.060
8 0.07389 ... 15.490
9 0.08243 ... 15.090
10 0.05697 ... 19.190
11 0.06082 ... 20.420
12 0.07800 ... 20.960
13 0.05338 ... 16.840
14 0.07682 ... 15.030
15 0.07077 ... 17.460
16 0.05922 ... 19.070
17 0.07356 ... 20.960
18 0.05395 ... 27.320
19 0.05766 ... 15.110
20 0.06811 ... 14.500
21 0.06905 ... 10.230
22 0.07032 ... 18.070
23 0.05278 ... 29.170
24 0.06330 ... 26.460
25 0.07413 ... 22.250
26 0.06924 ... 17.620
27 0.05699 ... 21.310
28 0.06540 ... 20.270
29 0.06149 ... 20.010
.. ... ... ...
539 0.07751 ... 8.678
540 0.06782 ... 12.260
541 0.06341 ... 16.220
542 0.05680 ... 16.510
543 0.05781 ... 14.370
544 0.06688 ... 15.050
545 0.05801 ... 15.350
546 0.06201 ... 11.250
547 0.06714 ... 10.830
548 0.06235 ... 10.930
549 0.06328 ... 13.030
550 0.05948 ... 11.660
551 0.06552 ... 12.020
552 0.05637 ... 13.870
553 0.06576 ... 9.845
554 0.05708 ... 13.890
555 0.06127 ... 10.840
556 0.06331 ... 10.650
557 0.06059 ... 10.490
558 0.06147 ... 15.480
559 0.06570 ... 12.480
560 0.06171 ... 15.300
561 0.05502 ... 11.920
562 0.07152 ... 17.520
563 0.06879 ... 24.290
564 0.05623 ... 25.450
565 0.05533 ... 23.690
566 0.05648 ... 18.980
567 0.07016 ... 25.740
568 0.05884 ... 9.456
worst texture worst perimeter worst area worst smoothness \
0 17.33 184.60 2019.0 0.16220
1 23.41 158.80 1956.0 0.12380
2 25.53 152.50 1709.0 0.14440
3 26.50 98.87 567.7 0.20980
4 16.67 152.20 1575.0 0.13740
5 23.75 103.40 741.6 0.17910
6 27.66 153.20 1606.0 0.14420
7 28.14 110.60 897.0 0.16540
8 30.73 106.20 739.3 0.17030
9 40.68 97.65 711.4 0.18530
10 33.88 123.80 1150.0 0.11810
11 27.28 136.50 1299.0 0.13960
12 29.94 151.70 1332.0 0.10370
13 27.66 112.00 876.5 0.11310
14 32.01 108.80 697.7 0.16510
15 37.13 124.10 943.2 0.16780
16 30.88 123.40 1138.0 0.14640
17 31.48 136.80 1315.0 0.17890
18 30.88 186.80 2398.0 0.15120
19 19.26 99.70 711.2 0.14400
20 20.49 96.09 630.5 0.13120
21 15.66 65.13 314.9 0.13240
22 19.08 125.10 980.9 0.13900
23 35.59 188.00 2615.0 0.14010
24 31.56 177.00 2215.0 0.18050
25 21.40 152.40 1461.0 0.15450
26 33.21 122.40 896.9 0.15250
27 27.26 139.90 1403.0 0.13380
28 36.71 149.30 1269.0 0.16410
29 19.52 134.90 1227.0 0.12550
.. ... ... ... ...
539 31.89 54.49 223.6 0.15960
540 19.68 78.78 457.8 0.13450
541 31.73 113.50 808.9 0.13400
542 32.29 107.40 826.4 0.10600
543 37.17 92.48 629.6 0.10720
544 24.75 99.17 688.6 0.12640
545 29.09 97.58 729.8 0.12160
546 21.77 71.12 384.9 0.12850
547 22.04 71.08 357.4 0.14610
548 25.59 69.10 364.2 0.11990
549 31.45 83.90 505.6 0.12040
550 24.77 74.08 412.3 0.10010
551 28.26 77.80 436.6 0.10870
552 36.00 88.10 594.7 0.12340
553 25.05 62.86 295.8 0.11030
554 35.74 88.84 595.7 0.12270
555 34.91 69.57 357.6 0.13840
556 22.88 67.88 347.3 0.12650
557 34.24 66.50 330.6 0.10730
558 27.27 105.90 733.5 0.10260
559 37.16 82.28 474.2 0.12980
560 33.17 100.20 706.7 0.12410
561 38.30 75.19 439.6 0.09267
562 42.79 128.70 915.0 0.14170
563 29.41 179.10 1819.0 0.14070
564 26.40 166.10 2027.0 0.14100
565 38.25 155.00 1731.0 0.11660
566 34.12 126.70 1124.0 0.11390
567 39.42 184.60 1821.0 0.16500
568 30.37 59.16 268.6 0.08996
worst compactness worst concavity worst concave points worst symmetry \
0 0.66560 0.71190 0.26540 0.4601
1 0.18660 0.24160 0.18600 0.2750
2 0.42450 0.45040 0.24300 0.3613
3 0.86630 0.68690 0.25750 0.6638
4 0.20500 0.40000 0.16250 0.2364
5 0.52490 0.53550 0.17410 0.3985
6 0.25760 0.37840 0.19320 0.3063
7 0.36820 0.26780 0.15560 0.3196
8 0.54010 0.53900 0.20600 0.4378
9 1.05800 1.10500 0.22100 0.4366
10 0.15510 0.14590 0.09975 0.2948
11 0.56090 0.39650 0.18100 0.3792
12 0.39030 0.36390 0.17670 0.3176
13 0.19240 0.23220 0.11190 0.2809
14 0.77250 0.69430 0.22080 0.3596
15 0.65770 0.70260 0.17120 0.4218
16 0.18710 0.29140 0.16090 0.3029
17 0.42330 0.47840 0.20730 0.3706
18 0.31500 0.53720 0.23880 0.2768
19 0.17730 0.23900 0.12880 0.2977
20 0.27760 0.18900 0.07283 0.3184
21 0.11480 0.08867 0.06227 0.2450
22 0.59540 0.63050 0.23930 0.4667
23 0.26000 0.31550 0.20090 0.2822
24 0.35780 0.46950 0.20950 0.3613
25 0.39490 0.38530 0.25500 0.4066
26 0.66430 0.55390 0.27010 0.4264
27 0.21170 0.34460 0.14900 0.2341
28 0.61100 0.63350 0.20240 0.4027
29 0.28120 0.24890 0.14560 0.2756
.. ... ... ... ...
539 0.30640 0.33930 0.05000 0.2790
540 0.21180 0.17970 0.06918 0.2329
541 0.42020 0.40400 0.12050 0.3187
542 0.13760 0.16110 0.10950 0.2722
543 0.13810 0.10620 0.07958 0.2473
544 0.20370 0.13770 0.06845 0.2249
545 0.15170 0.10490 0.07174 0.2642
546 0.08842 0.04384 0.02381 0.2681
547 0.22460 0.17830 0.08333 0.2691
548 0.09546 0.09350 0.03846 0.2552
549 0.16330 0.06194 0.03264 0.3059
550 0.07348 0.00000 0.00000 0.2458
551 0.17820 0.15640 0.06413 0.3169
552 0.10640 0.08653 0.06498 0.2407
553 0.08298 0.07993 0.02564 0.2435
554 0.16200 0.24390 0.06493 0.2372
555 0.17100 0.20000 0.09127 0.2226
556 0.12000 0.01005 0.02232 0.2262
557 0.07158 0.00000 0.00000 0.2475
558 0.31710 0.36620 0.11050 0.2258
559 0.25170 0.36300 0.09653 0.2112
560 0.22640 0.13260 0.10480 0.2250
561 0.05494 0.00000 0.00000 0.1566
562 0.79170 1.17000 0.23560 0.4089
563 0.41860 0.65990 0.25420 0.2929
564 0.21130 0.41070 0.22160 0.2060
565 0.19220 0.32150 0.16280 0.2572
566 0.30940 0.34030 0.14180 0.2218
567 0.86810 0.93870 0.26500 0.4087
568 0.06444 0.00000 0.00000 0.2871
worst fractal dimension
0 0.11890
1 0.08902
2 0.08758
3 0.17300
4 0.07678
5 0.12440
6 0.08368
7 0.11510
8 0.10720
9 0.20750
10 0.08452
11 0.10480
12 0.10230
13 0.06287
14 0.14310
15 0.13410
16 0.08216
17 0.11420
18 0.07615
19 0.07259
20 0.08183
21 0.07773
22 0.09946
23 0.07526
24 0.09564
25 0.10590
26 0.12750
27 0.07421
28 0.09876
29 0.07919
.. ...
539 0.10660
540 0.08134
541 0.10230
542 0.06956
543 0.06443
544 0.08492
545 0.06953
546 0.07399
547 0.09479
548 0.07920
549 0.07626
550 0.06592
551 0.08032
552 0.06484
553 0.07393
554 0.07242
555 0.08283
556 0.06742
557 0.06969
558 0.08004
559 0.08732
560 0.08321
561 0.05905
562 0.14090
563 0.09873
564 0.07115
565 0.06637
566 0.07820
567 0.12400
568 0.07039
[569 rows x 30 columns]
malignant benign
0 1 0
1 1 0
2 1 0
3 1 0
4 1 0
5 1 0
6 1 0
7 1 0
8 1 0
9 1 0
10 1 0
11 1 0
12 1 0
13 1 0
14 1 0
15 1 0
16 1 0
17 1 0
18 1 0
19 0 1
20 0 1
21 0 1
22 1 0
23 1 0
24 1 0
25 1 0
26 1 0
27 1 0
28 1 0
29 1 0
.. ... ...
539 0 1
540 0 1
541 0 1
542 0 1
543 0 1
544 0 1
545 0 1
546 0 1
547 0 1
548 0 1
549 0 1
550 0 1
551 0 1
552 0 1
553 0 1
554 0 1
555 0 1
556 0 1
557 0 1
558 0 1
559 0 1
560 0 1
561 0 1
562 1 0
563 1 0
564 1 0
565 1 0
566 1 0
567 1 0
568 0 1
[569 rows x 2 columns]
0
In [3]:
# Common imports
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_moons
from sklearn.tree import export_graphviz
from pydot import graph_from_dot_data
import pandas as pd
import os
np.random.seed(42)
X, y = make_moons(n_samples=100, noise=0.25, random_state=53)
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)
tree_clf = DecisionTreeClassifier(max_depth=5)
tree_clf.fit(X_train, y_train)
export_graphviz(
tree_clf,
out_file="DataFiles/moons.dot",
rounded=True,
filled=True
)
cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png'
os.system(cmd)Out [3]:
0
In [4]:
# Common imports
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.tree import export_graphviz
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from IPython.display import Image
from pydot import graph_from_dot_data
import os
# Where to save the figures and data files
PROJECT_ROOT_DIR = "Results"
FIGURE_ID = "Results/FigureFiles"
DATA_ID = "DataFiles/"
if not os.path.exists(PROJECT_ROOT_DIR):
os.mkdir(PROJECT_ROOT_DIR)
if not os.path.exists(FIGURE_ID):
os.makedirs(FIGURE_ID)
if not os.path.exists(DATA_ID):
os.makedirs(DATA_ID)
def image_path(fig_id):
return os.path.join(FIGURE_ID, fig_id)
def data_path(dat_id):
return os.path.join(DATA_ID, dat_id)
def save_fig(fig_id):
plt.savefig(image_path(fig_id) + ".png", format='png')
infile = open(data_path("rideclass.csv"),'r')
# Read the experimental data with Pandas
from IPython.display import display
ridedata = pd.read_csv(infile,names = ('Outlook','Temperature','Humidity','Wind','Ride'))
ridedata = pd.DataFrame(ridedata)
# Features and targets
X = ridedata.loc[:, ridedata.columns != 'Ride'].values
y = ridedata.loc[:, ridedata.columns == 'Ride'].values
# Create the encoder.
encoder = OneHotEncoder(handle_unknown="ignore")
# Assume for simplicity all features are categorical.
encoder.fit(X)
# Apply the encoder.
X = encoder.transform(X)
print(X)
# Then do a Classification tree
tree_clf = DecisionTreeClassifier(max_depth=2)
tree_clf.fit(X, y)
print("Train set accuracy with Decision Tree: {:.2f}".format(tree_clf.score(X,y)))
#transfer to a decision tree graph
export_graphviz(
tree_clf,
out_file="DataFiles/ride.dot",
rounded=True,
filled=True
)
cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
os.system(cmd)Out [4]:
(0, 0) 1.0 (0, 7) 1.0 (0, 9) 1.0 (0, 13) 1.0 (1, 3) 1.0 (1, 5) 1.0 (1, 8) 1.0 (1, 12) 1.0 (2, 3) 1.0 (2, 5) 1.0 (2, 8) 1.0 (2, 11) 1.0 (3, 1) 1.0 (3, 5) 1.0 (3, 8) 1.0 (3, 12) 1.0 (4, 2) 1.0 (4, 6) 1.0 (4, 8) 1.0 (4, 12) 1.0 (5, 2) 1.0 (5, 4) 1.0 (5, 10) 1.0 (5, 12) 1.0 (6, 2) 1.0 : : (8, 12) 1.0 (9, 3) 1.0 (9, 4) 1.0 (9, 10) 1.0 (9, 12) 1.0 (10, 2) 1.0 (10, 6) 1.0 (10, 10) 1.0 (10, 12) 1.0 (11, 3) 1.0 (11, 6) 1.0 (11, 10) 1.0 (11, 11) 1.0 (12, 1) 1.0 (12, 6) 1.0 (12, 8) 1.0 (12, 11) 1.0 (13, 1) 1.0 (13, 5) 1.0 (13, 10) 1.0 (13, 12) 1.0 (14, 2) 1.0 (14, 6) 1.0 (14, 8) 1.0 (14, 11) 1.0 Train set accuracy with Decision Tree: 0.73
0
In [5]:
# Split a dataset based on an attribute and an attribute value
def test_split(index, value, dataset):
left, right = list(), list()
for row in dataset:
if row[index] < value:
left.append(row)
else:
right.append(row)
return left, right
# Calculate the Gini index for a split dataset
def gini_index(groups, classes):
# count all samples at split point
n_instances = float(sum([len(group) for group in groups]))
# sum weighted Gini index for each group
gini = 0.0
for group in groups:
size = float(len(group))
# avoid divide by zero
if size == 0:
continue
score = 0.0
# score the group based on the score for each class
for class_val in classes:
p = [row[-1] for row in group].count(class_val) / size
score += p * p
# weight the group score by its relative size
gini += (1.0 - score) * (size / n_instances)
return gini
# Select the best split point for a dataset
def get_split(dataset):
class_values = list(set(row[-1] for row in dataset))
b_index, b_value, b_score, b_groups = 999, 999, 999, None
for index in range(len(dataset[0])-1):
for row in dataset:
groups = test_split(index, row[index], dataset)
gini = gini_index(groups, class_values)
print('X%d < %.3f Gini=%.3f' % ((index+1), row[index], gini))
if gini < b_score:
b_index, b_value, b_score, b_groups = index, row[index], gini, groups
return {'index':b_index, 'value':b_value, 'groups':b_groups}
dataset = [[0,0,0,0,0],
[0,0,0,1,1],
[1,0,0,0,1],
[2,1,0,0,1],
[2,2,1,0,1],
[2,2,1,1,0],
[1,2,1,1,1],
[0,1,0,0,0],
[0,2,1,0,1],
[2,1,1,0,1],
[0,1,1,1,1],
[1,1,0,1,1],
[1,0,1,0,1],
[2,1,0,1,0]]
split = get_split(dataset)
print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))X1 < 0.000 Gini=0.408 X1 < 0.000 Gini=0.408 X1 < 1.000 Gini=0.394 X1 < 2.000 Gini=0.394 X1 < 2.000 Gini=0.394 X1 < 2.000 Gini=0.394 X1 < 1.000 Gini=0.394 X1 < 0.000 Gini=0.408 X1 < 0.000 Gini=0.408 X1 < 2.000 Gini=0.394 X1 < 0.000 Gini=0.408 X1 < 1.000 Gini=0.394 X1 < 1.000 Gini=0.394 X1 < 2.000 Gini=0.394 X2 < 0.000 Gini=0.408 X2 < 0.000 Gini=0.408 X2 < 0.000 Gini=0.408 X2 < 1.000 Gini=0.407 X2 < 2.000 Gini=0.407 X2 < 2.000 Gini=0.407 X2 < 2.000 Gini=0.407 X2 < 1.000 Gini=0.407 X2 < 2.000 Gini=0.407 X2 < 1.000 Gini=0.407 X2 < 1.000 Gini=0.407 X2 < 1.000 Gini=0.407 X2 < 0.000 Gini=0.408 X2 < 1.000 Gini=0.407 X3 < 0.000 Gini=0.408 X3 < 0.000 Gini=0.408 X3 < 0.000 Gini=0.408 X3 < 0.000 Gini=0.408 X3 < 1.000 Gini=0.367 X3 < 1.000 Gini=0.367 X3 < 1.000 Gini=0.367 X3 < 0.000 Gini=0.408 X3 < 1.000 Gini=0.367 X3 < 1.000 Gini=0.367 X3 < 1.000 Gini=0.367 X3 < 0.000 Gini=0.408 X3 < 1.000 Gini=0.367 X3 < 0.000 Gini=0.408 X4 < 0.000 Gini=0.408 X4 < 1.000 Gini=0.405 X4 < 0.000 Gini=0.408 X4 < 0.000 Gini=0.408 X4 < 0.000 Gini=0.408 X4 < 1.000 Gini=0.405 X4 < 1.000 Gini=0.405 X4 < 0.000 Gini=0.408 X4 < 0.000 Gini=0.408 X4 < 0.000 Gini=0.408 X4 < 1.000 Gini=0.405 X4 < 1.000 Gini=0.405 X4 < 0.000 Gini=0.408 X4 < 1.000 Gini=0.405 Split: [X3 < 1.000]
In [6]:
import re
import math
from collections import deque
# x is examples in training set
# y is set of targets
# label is target attributes
# Node is a class which has properties values, childs, and next
# root is top node in the decision tree
class Node(object):
def __init__(self):
self.value = None
self.next = None
self.childs = None
# Simple class of Decision Tree
# Aimed for who want to learn Decision Tree, so it is not optimized
class DecisionTree(object):
def __init__(self, sample, attributes, labels):
self.sample = sample
self.attributes = attributes
self.labels = labels
self.labelCodes = None
self.labelCodesCount = None
self.initLabelCodes()
# print(self.labelCodes)
self.root = None
self.entropy = self.getEntropy([x for x in range(len(self.labels))])
def initLabelCodes(self):
self.labelCodes = []
self.labelCodesCount = []
for l in self.labels:
if l not in self.labelCodes:
self.labelCodes.append(l)
self.labelCodesCount.append(0)
self.labelCodesCount[self.labelCodes.index(l)] += 1
def getLabelCodeId(self, sampleId):
return self.labelCodes.index(self.labels[sampleId])
def getAttributeValues(self, sampleIds, attributeId):
vals = []
for sid in sampleIds:
val = self.sample[sid][attributeId]
if val not in vals:
vals.append(val)
# print(vals)
return vals
def getEntropy(self, sampleIds):
entropy = 0
labelCount = [0] * len(self.labelCodes)
for sid in sampleIds:
labelCount[self.getLabelCodeId(sid)] += 1
# print("-ge", labelCount)
for lv in labelCount:
# print(lv)
if lv != 0:
entropy += -lv/len(sampleIds) * math.log(lv/len(sampleIds), 2)
else:
entropy += 0
return entropy
def getDominantLabel(self, sampleIds):
labelCodesCount = [0] * len(self.labelCodes)
for sid in sampleIds:
labelCodesCount[self.labelCodes.index(self.labels[sid])] += 1
return self.labelCodes[labelCodesCount.index(max(labelCodesCount))]
def getInformationGain(self, sampleIds, attributeId):
gain = self.getEntropy(sampleIds)
attributeVals = []
attributeValsCount = []
attributeValsIds = []
for sid in sampleIds:
val = self.sample[sid][attributeId]
if val not in attributeVals:
attributeVals.append(val)
attributeValsCount.append(0)
attributeValsIds.append([])
vid = attributeVals.index(val)
attributeValsCount[vid] += 1
attributeValsIds[vid].append(sid)
# print("-gig", self.attributes[attributeId])
for vc, vids in zip(attributeValsCount, attributeValsIds):
# print("-gig", vids)
gain -= vc/len(sampleIds) * self.getEntropy(vids)
return gain
def getAttributeMaxInformationGain(self, sampleIds, attributeIds):
attributesEntropy = [0] * len(attributeIds)
for i, attId in zip(range(len(attributeIds)), attributeIds):
attributesEntropy[i] = self.getInformationGain(sampleIds, attId)
maxId = attributeIds[attributesEntropy.index(max(attributesEntropy))]
return self.attributes[maxId], maxId
def isSingleLabeled(self, sampleIds):
label = self.labels[sampleIds[0]]
for sid in sampleIds:
if self.labels[sid] != label:
return False
return True
def getLabel(self, sampleId):
return self.labels[sampleId]
def id3(self):
sampleIds = [x for x in range(len(self.sample))]
attributeIds = [x for x in range(len(self.attributes))]
self.root = self.id3Recv(sampleIds, attributeIds, self.root)
def id3Recv(self, sampleIds, attributeIds, root):
root = Node() # Initialize current root
if self.isSingleLabeled(sampleIds):
root.value = self.labels[sampleIds[0]]
return root
# print(attributeIds)
if len(attributeIds) == 0:
root.value = self.getDominantLabel(sampleIds)
return root
bestAttrName, bestAttrId = self.getAttributeMaxInformationGain(
sampleIds, attributeIds)
# print(bestAttrName)
root.value = bestAttrName
root.childs = [] # Create list of children
for value in self.getAttributeValues(sampleIds, bestAttrId):
# print(value)
child = Node()
child.value = value
root.childs.append(child) # Append new child node to current
# root
childSampleIds = []
for sid in sampleIds:
if self.sample[sid][bestAttrId] == value:
childSampleIds.append(sid)
if len(childSampleIds) == 0:
child.next = self.getDominantLabel(sampleIds)
else:
# print(bestAttrName, bestAttrId)
# print(attributeIds)
if len(attributeIds) > 0 and bestAttrId in attributeIds:
toRemove = attributeIds.index(bestAttrId)
attributeIds.pop(toRemove)
child.next = self.id3Recv(
childSampleIds, attributeIds, child.next)
return root
def printTree(self):
if self.root:
roots = deque()
roots.append(self.root)
while len(roots) > 0:
root = roots.popleft()
print(root.value)
if root.childs:
for child in root.childs:
print('({})'.format(child.value))
roots.append(child.next)
elif root.next:
print(root.next)
def test():
f = open('DataFiles/rideclass.csv')
attributes = f.readline().split(',')
attributes = attributes[1:len(attributes)-1]
print(attributes)
sample = f.readlines()
f.close()
for i in range(len(sample)):
sample[i] = re.sub('\d+,', '', sample[i])
sample[i] = sample[i].strip().split(',')
labels = []
for s in sample:
labels.append(s.pop())
# print(sample)
# print(labels)
decisionTree = DecisionTree(sample, attributes, labels)
print("System entropy {}".format(decisionTree.entropy))
decisionTree.id3()
decisionTree.printTree()
if __name__ == '__main__':
test()['Outlook', 'Temperature', 'Humidity', 'Wind'] System entropy 0.863120568566631 Outlook (Sunny) (Overcast) (Rain) Humidity (High) (Normal) 1 Temperature (Mild) (Cool) Wind (Weak) (Strong) 1 1 0 0 1
In [7]:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
# Load the data
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)
print(X_train.shape)
print(X_test.shape)
# Logistic Regression
logreg = LogisticRegression(solver='lbfgs')
logreg.fit(X_train, y_train)
print("Test set accuracy with Logistic Regression: {:.2f}".format(logreg.score(X_test,y_test)))
# Support vector machine
svm = SVC(gamma='auto', C=100)
svm.fit(X_train, y_train)
print("Test set accuracy with SVM: {:.2f}".format(svm.score(X_test,y_test)))
# Decision Trees
deep_tree_clf = DecisionTreeClassifier(max_depth=None)
deep_tree_clf.fit(X_train, y_train)
print("Test set accuracy with Decision Trees: {:.2f}".format(deep_tree_clf.score(X_test,y_test)))
#now scale the data
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Logistic Regression
logreg.fit(X_train_scaled, y_train)
print("Test set accuracy Logistic Regression with scaled data: {:.2f}".format(logreg.score(X_test_scaled,y_test)))
# Support Vector Machine
svm.fit(X_train_scaled, y_train)
print("Test set accuracy SVM with scaled data: {:.2f}".format(logreg.score(X_test_scaled,y_test)))
# Decision Trees
deep_tree_clf.fit(X_train_scaled, y_train)
print("Test set accuracy with Decision Trees and scaled data: {:.2f}".format(deep_tree_clf.score(X_test_scaled,y_test)))(426, 30) (143, 30) Test set accuracy with Logistic Regression: 0.95 Test set accuracy with SVM: 0.63 Test set accuracy with Decision Trees: 0.90 Test set accuracy Logistic Regression with scaled data: 0.96 Test set accuracy SVM with scaled data: 0.96 Test set accuracy with Decision Trees and scaled data: 0.90
/usr/local/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:757: ConvergenceWarning: lbfgs failed to converge. Increase the number of iterations. "of iterations.", ConvergenceWarning)
In [8]:
from __future__ import division, print_function, unicode_literals
# Common imports
import numpy as np
import os
# to make this notebook's output stable across runs
np.random.seed(42)
# To plot pretty figures
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
from sklearn.svm import SVC
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_moons
from sklearn.tree import export_graphviz
Xm, ym = make_moons(n_samples=100, noise=0.25, random_state=53)
deep_tree_clf1 = DecisionTreeClassifier(random_state=42)
deep_tree_clf2 = DecisionTreeClassifier(min_samples_leaf=4, random_state=42)
deep_tree_clf1.fit(Xm, ym)
deep_tree_clf2.fit(Xm, ym)
def plot_decision_boundary(clf, X, y, axes=[0, 7.5, 0, 3], iris=True, legend=False, plot_training=True):
x1s = np.linspace(axes[0], axes[1], 100)
x2s = np.linspace(axes[2], axes[3], 100)
x1, x2 = np.meshgrid(x1s, x2s)
X_new = np.c_[x1.ravel(), x2.ravel()]
y_pred = clf.predict(X_new).reshape(x1.shape)
custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])
plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)
if not iris:
custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])
plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)
if plot_training:
plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo", label="Iris-Setosa")
plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs", label="Iris-Versicolor")
plt.plot(X[:, 0][y==2], X[:, 1][y==2], "g^", label="Iris-Virginica")
plt.axis(axes)
if iris:
plt.xlabel("Petal length", fontsize=14)
plt.ylabel("Petal width", fontsize=14)
else:
plt.xlabel(r"$x_1$", fontsize=18)
plt.ylabel(r"$x_2$", fontsize=18, rotation=0)
if legend:
plt.legend(loc="lower right", fontsize=14)
plt.figure(figsize=(11, 4))
plt.subplot(121)
plot_decision_boundary(deep_tree_clf1, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)
plt.title("No restrictions", fontsize=16)
plt.subplot(122)
plot_decision_boundary(deep_tree_clf2, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)
plt.title("min_samples_leaf = {}".format(deep_tree_clf2.min_samples_leaf), fontsize=14)
plt.show()In [9]:
np.random.seed(6)
Xs = np.random.rand(100, 2) - 0.5
ys = (Xs[:, 0] > 0).astype(np.float32) * 2
angle = np.pi/4
rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]])
Xsr = Xs.dot(rotation_matrix)
tree_clf_s = DecisionTreeClassifier(random_state=42)
tree_clf_s.fit(Xs, ys)
tree_clf_sr = DecisionTreeClassifier(random_state=42)
tree_clf_sr.fit(Xsr, ys)
plt.figure(figsize=(11, 4))
plt.subplot(121)
plot_decision_boundary(tree_clf_s, Xs, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)
plt.subplot(122)
plot_decision_boundary(tree_clf_sr, Xsr, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)
plt.show()In [10]:
# Quadratic training set + noise
np.random.seed(42)
m = 200
X = np.random.rand(m, 1)
y = 4 * (X - 0.5) ** 2
y = y + np.random.randn(m, 1) / 10In [11]:
from sklearn.tree import DecisionTreeRegressor
tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)
tree_reg.fit(X, y)Out [11]:
DecisionTreeRegressor(criterion='mse', max_depth=2, max_features=None,
max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
presort=False, random_state=42, splitter='best')In [12]:
from sklearn.tree import DecisionTreeRegressor
tree_reg1 = DecisionTreeRegressor(random_state=42, max_depth=2)
tree_reg2 = DecisionTreeRegressor(random_state=42, max_depth=3)
tree_reg1.fit(X, y)
tree_reg2.fit(X, y)
def plot_regression_predictions(tree_reg, X, y, axes=[0, 1, -0.2, 1], ylabel="$y$"):
x1 = np.linspace(axes[0], axes[1], 500).reshape(-1, 1)
y_pred = tree_reg.predict(x1)
plt.axis(axes)
plt.xlabel("$x_1$", fontsize=18)
if ylabel:
plt.ylabel(ylabel, fontsize=18, rotation=0)
plt.plot(X, y, "b.")
plt.plot(x1, y_pred, "r.-", linewidth=2, label=r"$\hat{y}$")
plt.figure(figsize=(11, 4))
plt.subplot(121)
plot_regression_predictions(tree_reg1, X, y)
for split, style in ((0.1973, "k-"), (0.0917, "k--"), (0.7718, "k--")):
plt.plot([split, split], [-0.2, 1], style, linewidth=2)
plt.text(0.21, 0.65, "Depth=0", fontsize=15)
plt.text(0.01, 0.2, "Depth=1", fontsize=13)
plt.text(0.65, 0.8, "Depth=1", fontsize=13)
plt.legend(loc="upper center", fontsize=18)
plt.title("max_depth=2", fontsize=14)
plt.subplot(122)
plot_regression_predictions(tree_reg2, X, y, ylabel=None)
for split, style in ((0.1973, "k-"), (0.0917, "k--"), (0.7718, "k--")):
plt.plot([split, split], [-0.2, 1], style, linewidth=2)
for split in (0.0458, 0.1298, 0.2873, 0.9040):
plt.plot([split, split], [-0.2, 1], "k:", linewidth=1)
plt.text(0.3, 0.5, "Depth=2", fontsize=13)
plt.title("max_depth=3", fontsize=14)
plt.show()In [13]:
tree_reg1 = DecisionTreeRegressor(random_state=42)
tree_reg2 = DecisionTreeRegressor(random_state=42, min_samples_leaf=10)
tree_reg1.fit(X, y)
tree_reg2.fit(X, y)
x1 = np.linspace(0, 1, 500).reshape(-1, 1)
y_pred1 = tree_reg1.predict(x1)
y_pred2 = tree_reg2.predict(x1)
plt.figure(figsize=(11, 4))
plt.subplot(121)
plt.plot(X, y, "b.")
plt.plot(x1, y_pred1, "r.-", linewidth=2, label=r"$\hat{y}$")
plt.axis([0, 1, -0.2, 1.1])
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", fontsize=18, rotation=0)
plt.legend(loc="upper center", fontsize=18)
plt.title("No restrictions", fontsize=14)
plt.subplot(122)
plt.plot(X, y, "b.")
plt.plot(x1, y_pred2, "r.-", linewidth=2, label=r"$\hat{y}$")
plt.axis([0, 1, -0.2, 1.1])
plt.xlabel("$x_1$", fontsize=18)
plt.title("min_samples_leaf={}".format(tree_reg2.min_samples_leaf), fontsize=14)
plt.show()In [14]:
heads_proba = 0.51
coin_tosses = (np.random.rand(10000, 10) < heads_proba).astype(np.int32)
cumulative_heads_ratio = np.cumsum(coin_tosses, axis=0) / np.arange(1, 10001).reshape(-1, 1)
plt.figure(figsize=(8,3.5))
plt.plot(cumulative_heads_ratio)
plt.plot([0, 10000], [0.51, 0.51], "k--", linewidth=2, label="51%")
plt.plot([0, 10000], [0.5, 0.5], "k-", label="50%")
plt.xlabel("Number of coin tosses")
plt.ylabel("Heads ratio")
plt.legend(loc="lower right")
plt.axis([0, 10000, 0.42, 0.58])
save_fig("votingsimple")
plt.show()In [15]:
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_moons
X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
log_clf = LogisticRegression(solver="liblinear", random_state=42)
rnd_clf = RandomForestClassifier(n_estimators=10, random_state=42)
svm_clf = SVC(gamma="auto", random_state=42)
voting_clf = VotingClassifier(
estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
voting='hard')
voting_clf.fit(X_train, y_train)
from sklearn.metrics import accuracy_score
for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
log_clf = LogisticRegression(solver="liblinear", random_state=42)
rnd_clf = RandomForestClassifier(n_estimators=10, random_state=42)
svm_clf = SVC(gamma="auto", probability=True, random_state=42)
voting_clf = VotingClassifier(
estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
voting='soft')
voting_clf.fit(X_train, y_train)
from sklearn.metrics import accuracy_score
for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(clf.__class__.__name__, accuracy_score(y_test, y_pred))LogisticRegression 0.864 RandomForestClassifier 0.872 SVC 0.888 VotingClassifier 0.896 LogisticRegression 0.864 RandomForestClassifier 0.872 SVC 0.888 VotingClassifier 0.912
In [16]:
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_moons
X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
log_clf = LogisticRegression(random_state=42)
rnd_clf = RandomForestClassifier(random_state=42)
svm_clf = SVC(random_state=42)
voting_clf = VotingClassifier(
estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
voting='hard')
voting_clf.fit(X_train, y_train)Out [16]:
/usr/local/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning. FutureWarning) /usr/local/lib/python3.7/site-packages/sklearn/ensemble/forest.py:248: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22. "10 in version 0.20 to 100 in 0.22.", FutureWarning) /usr/local/lib/python3.7/site-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning. "avoid this warning.", FutureWarning)
VotingClassifier(estimators=[('lr', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='warn',
n_jobs=None, penalty='l2', random_state=42, solver='warn',
tol=0.0001, verbose=0, warm_start=False)), ('rf', RandomFore...rbf', max_iter=-1, probability=False, random_state=42,
shrinking=True, tol=0.001, verbose=False))],
flatten_transform=None, n_jobs=None, voting='hard', weights=None)In [17]:
from sklearn.metrics import accuracy_score
for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(clf.__class__.__name__, accuracy_score(y_test, y_pred))LogisticRegression 0.864 RandomForestClassifier 0.872 SVC 0.888 VotingClassifier 0.896
/usr/local/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning. FutureWarning) /usr/local/lib/python3.7/site-packages/sklearn/ensemble/forest.py:248: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22. "10 in version 0.20 to 100 in 0.22.", FutureWarning) /usr/local/lib/python3.7/site-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning. "avoid this warning.", FutureWarning) /usr/local/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning. FutureWarning) /usr/local/lib/python3.7/site-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning. "avoid this warning.", FutureWarning)
In [18]:
log_clf = LogisticRegression(random_state=42)
rnd_clf = RandomForestClassifier(random_state=42)
svm_clf = SVC(probability=True, random_state=42)
voting_clf = VotingClassifier(
estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
voting='soft')
voting_clf.fit(X_train, y_train)Out [18]:
/usr/local/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning. FutureWarning) /usr/local/lib/python3.7/site-packages/sklearn/ensemble/forest.py:248: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22. "10 in version 0.20 to 100 in 0.22.", FutureWarning) /usr/local/lib/python3.7/site-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning. "avoid this warning.", FutureWarning)
VotingClassifier(estimators=[('lr', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='warn',
n_jobs=None, penalty='l2', random_state=42, solver='warn',
tol=0.0001, verbose=0, warm_start=False)), ('rf', RandomFore...'rbf', max_iter=-1, probability=True, random_state=42,
shrinking=True, tol=0.001, verbose=False))],
flatten_transform=None, n_jobs=None, voting='soft', weights=None)In [19]:
from sklearn.metrics import accuracy_score
for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(clf.__class__.__name__, accuracy_score(y_test, y_pred))LogisticRegression 0.864 RandomForestClassifier 0.872 SVC 0.888 VotingClassifier 0.912
/usr/local/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning. FutureWarning) /usr/local/lib/python3.7/site-packages/sklearn/ensemble/forest.py:248: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22. "10 in version 0.20 to 100 in 0.22.", FutureWarning) /usr/local/lib/python3.7/site-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning. "avoid this warning.", FutureWarning) /usr/local/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning. FutureWarning) /usr/local/lib/python3.7/site-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning. "avoid this warning.", FutureWarning)
In [20]:
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bag_clf = BaggingClassifier(
DecisionTreeClassifier(random_state=42), n_estimators=500,
max_samples=100, bootstrap=True, n_jobs=-1, random_state=42)
bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)In [21]:
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred))0.904
In [22]:
tree_clf = DecisionTreeClassifier(random_state=42)
tree_clf.fit(X_train, y_train)
y_pred_tree = tree_clf.predict(X_test)
print(accuracy_score(y_test, y_pred_tree))0.856
In [23]:
from matplotlib.colors import ListedColormap
def plot_decision_boundary(clf, X, y, axes=[-1.5, 2.5, -1, 1.5], alpha=0.5, contour=True):
x1s = np.linspace(axes[0], axes[1], 100)
x2s = np.linspace(axes[2], axes[3], 100)
x1, x2 = np.meshgrid(x1s, x2s)
X_new = np.c_[x1.ravel(), x2.ravel()]
y_pred = clf.predict(X_new).reshape(x1.shape)
custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])
plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)
if contour:
custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])
plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)
plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo", alpha=alpha)
plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs", alpha=alpha)
plt.axis(axes)
plt.xlabel(r"$x_1$", fontsize=18)
plt.ylabel(r"$x_2$", fontsize=18, rotation=0)
plt.figure(figsize=(11,4))
plt.subplot(121)
plot_decision_boundary(tree_clf, X, y)
plt.title("Decision Tree", fontsize=14)
plt.subplot(122)
plot_decision_boundary(bag_clf, X, y)
plt.title("Decision Trees with Bagging", fontsize=14)
save_fig("baggingtree")
plt.show()In [27]:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.utils import resample
from sklearn.tree import DecisionTreeRegressor
n = 100
n_boostraps = 100
maxdepth = 8
# Make data set.
x = np.linspace(-3, 3, n).reshape(-1, 1)
y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
error = np.zeros(maxdepth)
bias = np.zeros(maxdepth)
variance = np.zeros(maxdepth)
polydegree = np.zeros(maxdepth)
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
# we produce a simple tree first as benchmark
simpletree = DecisionTreeRegressor(max_depth=3)
simpletree.fit(X_train_scaled, y_train)
simpleprediction = simpletree.predict(X_test_scaled)
for degree in range(1,maxdepth):
model = DecisionTreeRegressor(max_depth=degree)
y_pred = np.empty((y_test.shape[0], n_boostraps))
for i in range(n_boostraps):
x_, y_ = resample(X_train_scaled, y_train)
model.fit(x_, y_)
y_pred[:, i] = model.predict(X_test_scaled)#.ravel()
polydegree[degree] = degree
error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
print('Polynomial degree:', degree)
print('Error:', error[degree])
print('Bias^2:', bias[degree])
print('Var:', variance[degree])
print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
mse_simpletree = np.mean( np.mean((y_test - simpleprediction)**2)
plt.xlim(1,maxdepth)
plt.plot(polydegree, error, label='MSE simple tree')
plt.plot(polydegree, mse_simpletree, label='MSE for Bootstrap')
plt.plot(polydegree, bias, label='bias')
plt.plot(polydegree, variance, label='Variance')
plt.legend()
save_fig("baggingboot")
plt.show()[0;36m File [0;32m"<ipython-input-27-c21b87fe7de5>"[0;36m, line [0;32m51[0m [0;31m plt.xlim(1,maxdepth)[0m [0m ^[0m [0;31mSyntaxError[0m[0;31m:[0m invalid syntax
In [25]:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
# Load the data
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)
print(X_train.shape)
print(X_test.shape)
# Logistic Regression
logreg = LogisticRegression(solver='lbfgs')
logreg.fit(X_train, y_train)
print("Test set accuracy with Logistic Regression: {:.2f}".format(logreg.score(X_test,y_test)))
# Support vector machine
svm = SVC(gamma='auto', C=100)
svm.fit(X_train, y_train)
print("Test set accuracy with SVM: {:.2f}".format(svm.score(X_test,y_test)))
# Decision Trees
deep_tree_clf = DecisionTreeClassifier(max_depth=None)
deep_tree_clf.fit(X_train, y_train)
print("Test set accuracy with Decision Trees: {:.2f}".format(deep_tree_clf.score(X_test,y_test)))
#now scale the data
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Logistic Regression
logreg.fit(X_train_scaled, y_train)
print("Test set accuracy Logistic Regression with scaled data: {:.2f}".format(logreg.score(X_test_scaled,y_test)))
# Support Vector Machine
svm.fit(X_train_scaled, y_train)
print("Test set accuracy SVM with scaled data: {:.2f}".format(logreg.score(X_test_scaled,y_test)))
# Decision Trees
deep_tree_clf.fit(X_train_scaled, y_train)
print("Test set accuracy with Decision Trees and scaled data: {:.2f}".format(deep_tree_clf.score(X_test_scaled,y_test)))
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import cross_validate
# Data set not specificied
#Instantiate the model with 500 trees and entropy as splitting criteria
Random_Forest_model = RandomForestClassifier(n_estimators=500,criterion="entropy")
Random_Forest_model.fit(X_train_scaled, y_train)
#Cross validation
accuracy = cross_validate(Random_Forest_model,X_test_scaled,y_test,cv=10)['test_score']
print(accuracy)
print("Test set accuracy with Random Forests and scaled data: {:.2f}".format(Random_Forest_model.score(X_test_scaled,y_test)))
import scikitplot as skplt
y_pred = Random_Forest_model.predict(X_test_scaled)
skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=True)
plt.show()
y_probas = Random_Forest_model.predict_proba(X_test_scaled)
skplt.metrics.plot_roc(y_test, y_probas)
plt.show()
skplt.metrics.plot_cumulative_gain(y_test, y_probas)
plt.show()(426, 30) (143, 30) Test set accuracy with Logistic Regression: 0.95 Test set accuracy with SVM: 0.63 Test set accuracy with Decision Trees: 0.87 Test set accuracy Logistic Regression with scaled data: 0.96 Test set accuracy SVM with scaled data: 0.96 Test set accuracy with Decision Trees and scaled data: 0.90
/usr/local/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:757: ConvergenceWarning: lbfgs failed to converge. Increase the number of iterations. "of iterations.", ConvergenceWarning)
[0.93333333 0.8 0.93333333 1. 1. 0.92857143 1. 0.92857143 0.92857143 1. ] Test set accuracy with Random Forests and scaled data: 0.98
/usr/local/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:424: MatplotlibDeprecationWarning:
Passing one of 'on', 'true', 'off', 'false' as a boolean is deprecated; use an actual boolean (True/False) instead.
warn_deprecated("2.2", "Passing one of 'on', 'true', 'off', 'false' as a "
In [ ]:
bag_clf = BaggingClassifier(
DecisionTreeClassifier(splitter="random", max_leaf_nodes=16, random_state=42),
n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42)In [ ]:
bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)
from sklearn.ensemble import RandomForestClassifier
rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42)
rnd_clf.fit(X_train, y_train)
y_pred_rf = rnd_clf.predict(X_test)
np.sum(y_pred == y_pred_rf) / len(y_pred)Warning:
Output truncated. This notebook contains too many cells to display efficiently.

