1. Supervised Learning : Linear Regression
Dalam statistik, linear regression adalah pendekatan linier untuk memodelkan hubungan antara variabel dependen yang dilambangkan Y dan satu atau lebih variabel independen yang dilambangkan X. Model Persamaan Regresi Linear Sederhana adalah seperti berikut ini :
Y = a + bX
Dimana :
Y = Variabel Dependen atau Variabel Akibat(Response)
X = Variabel Independen atau Variabel Faktor Penyebab (Predictor)
a = konstanta
b = koefisien regresi (kemiringan); besaran Response yang ditimbulkan oleh Predictor.
Kali ini kita akan memprediksi harga rumah dengan menggunakan Linear Regression. Dataset yang akan digunakan adalah dataset dari sklearn, yaitu dataset harga rumah Boston.
1.0.1 Step 1: Menyiapkan Data
Pertama, kita import terlebih dahulu library yang dibutuhkan
1 2 3 4 5 6 7 |
In [174]: import numpy as np import pandas as pd from pandas import Series, DataFrame import matplotlib.pyplot as plt import seaborn as sns sns.set_style('whitegrid') %matplotlib inline |
import dataset dari sklearn
1 |
In [175]: from sklearn.datasets import load_boston |
download dataset
1 2 3 |
In [176]: boston = load_boston() In [177]: #untuk melihat deskripsi dataset print(boston.DESCR) |
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 |
Boston House Prices dataset =========================== Notes ------ Data Set Characteristics: :Number of Instances: 506 :Number of Attributes: 13 numeric/categorical predictive :Median Value (attribute 14) is usually the target :Attribute Information (in order): - CRIM per capita crime rate by town - ZN proportion of residential land zoned for lots over 25,000 sq.ft. - INDUS proportion of non-retail business acres per town - CHAS Charles River dummy variable (= 1 if tract bounds river; 0 other - NOX nitric oxides concentration (parts per 10 million) - RM average number of rooms per dwelling - AGE proportion of owner-occupied units built prior to 1940 - DIS weighted distances to five Boston employment centres - RAD index of accessibility to radial highways - TAX full-value property-tax rate per $10,000 - PTRATIO pupil-teacher ratio by town - B 1000(Bk - 0.63)ˆ2 where Bk is the proportion of blacks by town - LSTAT % lower status of the population - MEDV Median value of owner-occupied homes in $1000's :Missing Attribute Values: None :Creator: Harrison, D. and Rubinfeld, D.L. This is a copy of UCI ML housing dataset. http://archive.ics.uci.edu/ml/datasets/Housing This dataset was taken from the StatLib library which is maintained at Carnegie Mel The Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic prices and the demand for clean air', J. Environ. Economics & Management, vol.5, 81-102, 1978. Used in Belsley, Kuh & Welsch, 'Regression diagnostics ...', Wiley, 1980. N.B. Various transformations are used in the table on pages 244-261 of the latter. The Boston house-price data has been used in many machine learning papers that addr problems. **References** - Belsley, Kuh & Welsch, 'Regression diagnostics: Identifying Influential Data a - Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. In Proce - many more! (see http://archive.ics.uci.edu/ml/datasets/Housing) |
1.0.2 Step 2: Visualisasi data
1 2 3 4 5 6 7 8 |
In [178]: #target dalam dataset ini adalah harga rumah(prices) plt.hist(boston.target, bins=50) #label plt.xlabel('Price in $1000s') plt.ylabel('Number of houses') Out[178]: <matplotlib.text.Text at 0x1fceb2b74e0> |
Selanjutnya, kita lihat scatter plot dari salah satu feature dengan target, yaitu jumlah kamar dengan harga rumah.
1 2 3 4 5 6 7 |
In [179]: #plot kolom dengan index 5 (dengan label RM) plt.scatter(boston.data[:,5],boston.target) #label plt.ylabel('Price in $1000s') plt.xlabel('Number of rooms') Out[179]: <matplotlib.text.Text at 0x1fce9eab0f0> |
Dari plot diatas, kita bisa melihat bahwa harga meningkat seiring dengan jumlah kamar, yang secara intuitif masuk akal. Selanjutnya, kita akan menggunakan scikit-learn untuk melihat apakah kita bisa memasukkan data secara linier. Sebelum itu, kita harus mengubah dataset ke dalam bentuk DataFrame.
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 |
In [180]: boston_df = DataFrame(boston.data) #untuk memberi nama kolom pada dataframe boston_df.columns = boston.feature_names #untuk melihat isi 5 baris pertama dataframe boston_df.head() Out[180]: CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \ 0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 PTRATIO B LSTAT 0 15.3 396.90 4.98 1 17.8 396.90 9.14 2 17.8 392.83 4.03 3 18.7 394.63 2.94 4 18.7 396.90 5.33 In [181]: #untuk menambah kolom target kedalam dataframe boston_df['Price']=boston.target In [182]: boston_df.head() Out[182]: CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \ 0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 PTRATIO B LSTAT Price 0 15.3 396.90 4.98 24.0 1 17.8 396.90 9.14 21.6 2 17.8 392.83 4.03 34.7 3 18.7 394.63 2.94 33.4 4 18.7 396.90 5.33 36.2 In [183]: #gunakan seaborn untuk membuat garis linier sns.lmplot('RM', 'Price', data=boston_df) Out[183]: <seaborn.axisgrid.FacetGrid at 0x1fceaf32940> |
1.0.3 Step 3: gunakan scikit learn untuk implementasi multivariate regression
Linear regression terbagi menjadi univariate regression dan multivariate regression. kita menggunakan univariate regression ketika hanya ada satu variabel data(feature) yang mempengaruhi target. Namun jika yang mempengaruhi target ada lebih dari satu feature, maka kita gunakan multivariate regression.
Pertama, kita import library linear regression dari sklearn
1 2 3 |
In [184]: import sklearn.model_selection from sklearn.linear_model import LinearRegression |
sklearn.linear_model.LinearRegression merupakan sebuah estimator. estimator memprediksi sebuah nilai berdasarkan data yang diobservasi. dalam scikit learn, semua estimator menerapkan metode fit() dan predict(). metode fit() digunakan untuk mengetahui parameter model, sedangkan metode predict() digunakan untuk memprediksi nilai target dengan menggunakan parameter yang diperoleh dari fit().
1 |
In [185]: lreg = LinearRegression() |
kita pisahkan kolom features dan kolom target pada dataframe
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 |
In [186]: #kolom features X = boston_df.drop('Price',1) #kolom target Y_target = boston_df.Price In [187]: #implement linear regression model=lreg.fit(X, Y_target) In [188]: #untuk melihat nilai konstanta lreg.intercept_ Out[188]: 36.491103280364015 In [189]: boston_df.corr() Out[189]: CRIM ZN INDUS CHAS NOX RM AGE \ CRIM 1.000000 -0.199458 0.404471 -0.055295 0.417521 -0.219940 0.350784 ZN -0.199458 1.000000 -0.533828 -0.042697 -0.516604 0.311991 -0.569537 INDUS 0.404471 -0.533828 1.000000 0.062938 0.763651 -0.391676 0.644779 CHAS -0.055295 -0.042697 0.062938 1.000000 0.091203 0.091251 0.086518 NOX 0.417521 -0.516604 0.763651 0.091203 1.000000 -0.302188 0.731470 RM -0.219940 0.311991 -0.391676 0.091251 -0.302188 1.000000 -0.240265 AGE 0.350784 -0.569537 0.644779 0.086518 0.731470 -0.240265 1.000000 DIS -0.377904 0.664408 -0.708027 -0.099176 -0.769230 0.205246 -0.747881 RAD 0.622029 -0.311948 0.595129 -0.007368 0.611441 -0.209847 0.456022 TAX 0.579564 -0.314563 0.720760 -0.035587 0.668023 -0.292048 0.506456 PTRATIO 0.288250 -0.391679 0.383248 -0.121515 0.188933 -0.355501 0.261515 B -0.377365 0.175520 -0.356977 0.048788 -0.380051 0.128069 -0.273534 LSTAT 0.452220 -0.412995 0.603800 -0.053929 0.590879 -0.613808 0.602339 Price -0.385832 0.360445 -0.483725 0.175260 -0.427321 0.695360 -0.376955 DIS RAD TAX PTRATIO B LSTAT Price CRIM -0.377904 0.622029 0.579564 0.288250 -0.377365 0.452220 -0.385832 ZN 0.664408 -0.311948 -0.314563 -0.391679 0.175520 -0.412995 0.360445 INDUS -0.708027 0.595129 0.720760 0.383248 -0.356977 0.603800 -0.483725 CHAS -0.099176 -0.007368 -0.035587 -0.121515 0.048788 -0.053929 0.175260 NOX -0.769230 0.611441 0.668023 0.188933 -0.380051 0.590879 -0.427321 RM 0.205246 -0.209847 -0.292048 -0.355501 0.128069 -0.613808 0.695360 AGE -0.747881 0.456022 0.506456 0.261515 -0.273534 0.602339 -0.376955 DIS 1.000000 -0.494588 -0.534432 -0.232471 0.291512 -0.496996 0.249929 RAD -0.494588 1.000000 0.910228 0.464741 -0.444413 0.488676 -0.381626 TAX -0.534432 0.910228 1.000000 0.460853 -0.441808 0.543993 -0.468536 PTRATIO -0.232471 0.464741 0.460853 1.000000 -0.177383 0.374044 -0.507787 B 0.291512 -0.444413 -0.441808 -0.177383 1.000000 -0.366087 0.333461 LSTAT -0.496996 0.488676 0.543993 0.374044 -0.366087 1.000000 -0.737663 Price 0.249929 -0.381626 -0.468536 -0.507787 0.333461 -0.737663 1.000000 |
Dari tabel diatas kita dapat melihat korelasi antar kolom pada dataframe. Korelasi paling tinggi dari harga rumah adalah dengan jumlah kamar. Kita juga bisa melihat atribut apa yang paling berpengaruh terhadap target dengan menggunakan Lasso Regression yang juga bisa digunakan
untuk melakukan feature selection.
1 2 3 4 5 6 7 |
In [206]: from sklearn.linear_model import Lasso names=boston_df.drop('Price',axis=1).columns lasso=Lasso(alpha=0.1) lasso_coef=lasso.fit(X,Y_target).coef_ _=plt.plot(range(len(names)),lasso_coef) _=plt.xticks(range(len(names)),names,rotation=60) _=plt.ylabel('Coefficient') |
In [ ]: Dapat dilihat bahwa jumlah kamar ialah atribut yang paling berpengaruh dan berkontribusi penting untuk menentukan target variable.
1.0.4 Step 4: Training and Validation
Dalam dataset, sebuah training set diimplementasikan untuk membangun sebuah model, sementara validation set digunakan untuk memvalidasi model yang dibangun. pemilihan sampel dari dataset untuk dijadikan training set atau validation set dilakukan secara acak. Kita akan menggunakan dua teknik validasi untuk membandingkan akurasinya, K-cross validation dan train test split.
1 2 3 4 5 6 |
In [259]: #validasi dengan K-Cross Validation import sklearn.model_selection as ms from sklearn.model_selection import cross_val_score,cross_val_predict cv_scores = ms.cross_val_score(lreg,X,Y_target,cv=ms.KFold(shuffle=True,random_state=42)) print(cv_scores) print("Average K-Fold CV Score: {}".format(np.mean(cv_scores))) |
[ 0.72590475 0.71326269 0.73320728]
Average K-Fold CV Score: 0.7241249084434545
1 2 3 4 5 6 7 |
In [204]: #validasi dengan train test split from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, Y_target,test_size=0.3, random_state=42) model=lreg.fit(X_train, y_train) y_pred=lreg.predict(X_test) print("R^2: {}".format(lreg.score(X_test, y_test))) |
Rˆ2: 0.7109203586326283
1.0.5 Step 5: prediksi harga
kita telah memiliki data training dan data test. selanjutnya kita gunakan data training tersebut
untuk memprediksi harga rumah, kemudian gunakan data test untuk validasi.
2. Train Test Split
1 2 3 4 5 6 |
In [254]: from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, Y_target,test_size=0.3, random_state=42) lreg.fit(X_train, y_train) y_pred=lreg.predict(X_test) print("R^2: {}".format(lreg.score(X_test, y_test))) |
Rˆ2: 0.7109203586326283
3. K-Cross Validation
1 2 3 |
In [261]: predictions = ms.cross_val_predict(lreg, X, Y_target, cv=ms.KFold(shuffle=True)) plt.scatter(Y_target,predictions) Out[261]: <matplotlib.collections.PathCollection at 0x1fcebad6080> |
1 2 3 4 |
In [262]: from sklearn import metrics accuracy=metrics.r2_score(Y_target,predictions) print("cross predict accuracy: ", accuracy) |
cross predict accuracy: 0.717669565673
In [ ]: Dapat dilihat perbandingan bahwa validasi train test split mendapat akurasi 0.7109203586326283, sedangkan untuk cross validation adalah 0.717669565673. Cross validation lebih tinggi karena ketika menggunakan train test split,