Projek Machine Learning ini dibuat untuk memenuhi program pembelajaran di program Full Stack Data Analytic di Lembaga Algoritma(https://algorit.ma/). Machine Learning yang akan dibangun adalah machine learning untuk melakukan prediksi kekuatan beton berdasarkan komposisi komponen penyusun beton(semen, air, fly ash, dll) tanpa harus menunggu waktu lama agar dapat mengukur kekuatan beton. Sumber case ini adalah dari penilitian Prof. I-Cheng Yeh, Department of Information Management Chung-Hua University, Hsin Chu, Taiwan in 2007.
Library yang akan digunakan adalah sbb :
library(tidyverse)
library(GGally)
library(randomForest)
library(caret)
library(car)
library(ggplot2)
library(MLmetrics)
library(e1071)
library(recipes)
library(lime) Tahapan pembuatan machine learning adalah sbb:
Pada studi kasus ini, disediakan 2 file data yaitu data-train.csv dan data-test.csv, dimana :
- data-train.csv digunakan untuk membangun & mengevaluasi pemodelan
- data-test.csv digunakan untuk melakukan prediksi
Tentukan langkah-langkah yang akan dilakukan dalam Data Preprocessing: 1. Periksa struktur data & Ubahlah tipe data yang belum sesuai 2. Periksa apakah terdapat missing value pada dataset dan lakukan remove duplicate jika dibutuhkan 3. Periksa apakah ada data outliner yang berdampak signifikan terhadap distribusi data 4. Sebelum melakukan analisis regresi, periksalah korelasi antara variabel target dan prediktor
struktur data sudah sesuai, sehingga tidak butuh dilakukan perubahan tipe data
#> Rows: 825
#> Columns: 10
#> $ id <chr> "S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9", "...
#> $ cement <dbl> 540.0, 540.0, 332.5, 332.5, 198.6, 380.0, 380.0, 475.0,...
#> $ slag <dbl> 0.0, 0.0, 142.5, 142.5, 132.4, 95.0, 95.0, 0.0, 132.4, ...
#> $ flyash <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
#> $ water <dbl> 162, 162, 228, 228, 192, 228, 228, 228, 192, 192, 228, ...
#> $ super_plast <dbl> 2.5, 2.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
#> $ coarse_agg <dbl> 1040.0, 1055.0, 932.0, 932.0, 978.4, 932.0, 932.0, 932....
#> $ fine_agg <dbl> 676.0, 676.0, 594.0, 594.0, 825.5, 594.0, 594.0, 594.0,...
#> $ age <int> 28, 28, 270, 365, 360, 365, 28, 28, 90, 28, 28, 90, 90,...
#> $ strength <dbl> 79.99, 61.89, 40.27, 41.05, 44.30, 43.70, 36.45, 39.29,...
#> Rows: 205
#> Columns: 10
#> $ id <chr> "S826", "S827", "S828", "S829", "S830", "S831", "S832",...
#> $ cement <dbl> 266.0, 266.0, 427.5, 190.0, 380.0, 427.5, 198.6, 332.5,...
#> $ slag <dbl> 114.0, 114.0, 47.5, 190.0, 0.0, 47.5, 132.4, 142.5, 237...
#> $ flyash <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
#> $ water <dbl> 228.0, 228.0, 228.0, 228.0, 228.0, 228.0, 192.0, 228.0,...
#> $ super_plast <dbl> 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
#> $ coarse_agg <dbl> 932.0, 932.0, 932.0, 932.0, 932.0, 932.0, 978.4, 932.0,...
#> $ fine_agg <dbl> 670.0, 670.0, 594.0, 670.0, 670.0, 594.0, 825.5, 594.0,...
#> $ age <int> 90, 28, 270, 90, 270, 28, 180, 90, 180, 365, 365, 180, ...
#> $ strength <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,...
berikut contoh data pada dataset. Data terdiri dari 10 kolom dimana data yang akan diprediksi adalah kolom strength.
Dimensi dataset dapat dilihat dengan menggunakan function dim(). data_train terdiri dari 825 row dan 10 kolom. data test terdiri dari 205 row dan 10 kolom.
#> [1] 825 10
#> [1] 205 10
Untuk cek status data N/A menggunakan function is.na(). Kolom strength pada data test masih N/A karena kolom tersebut yang akan kita prediksi dengan menggunakan machine learning. Pada kedua dataset tidak terdapat missing value, sehingga tidak perlu ada drop/fill NA.
#> id cement slag flyash water super_plast
#> 0 0 0 0 0 0
#> coarse_agg fine_agg age strength
#> 0 0 0 0
#> id cement slag flyash water super_plast
#> 0 0 0 0 0 0
#> coarse_agg fine_agg age strength
#> 0 0 0 205
Kita akan melihat lebih detil statistik data set yang kita miliki dengan menggunakan function summary().
#> id cement slag flyash
#> Length:825 Min. :102.0 Min. : 0.00 Min. : 0.00
#> Class :character 1st Qu.:194.7 1st Qu.: 0.00 1st Qu.: 0.00
#> Mode :character Median :275.1 Median : 20.00 Median : 0.00
#> Mean :280.9 Mean : 73.18 Mean : 54.03
#> 3rd Qu.:350.0 3rd Qu.:141.30 3rd Qu.:118.20
#> Max. :540.0 Max. :359.40 Max. :200.10
#> water super_plast coarse_agg fine_agg
#> Min. :121.8 Min. : 0.000 Min. : 801.0 Min. :594.0
#> 1st Qu.:164.9 1st Qu.: 0.000 1st Qu.: 932.0 1st Qu.:734.0
#> Median :184.0 Median : 6.500 Median : 968.0 Median :780.1
#> Mean :181.1 Mean : 6.266 Mean : 972.8 Mean :775.6
#> 3rd Qu.:192.0 3rd Qu.:10.100 3rd Qu.:1028.4 3rd Qu.:826.8
#> Max. :247.0 Max. :32.200 Max. :1145.0 Max. :992.6
#> age strength
#> Min. : 1.00 Min. : 2.33
#> 1st Qu.: 7.00 1st Qu.:23.64
#> Median : 28.00 Median :34.57
#> Mean : 45.14 Mean :35.79
#> 3rd Qu.: 56.00 3rd Qu.:45.94
#> Max. :365.00 Max. :82.60
Dari data summary tersebut, dapat disimpulkan terdapat outlier di kolom/parameter slag,flyash, dan age. Karena terdapat perbedaan signifikan pada data Median & Mean. Hal ini menginterpretasikan bahwa terdapat data yang anomali. Untuk lebih jelas akan digambarkan dalam bentuk diagram boxplot.
Berikut adalah list data outlier pada masing-masing kolom:
#> slag : 359.4 359.4
#>
#> water : 121.8 121.8 121.8 121.8 121.8 237 247 246.9 236.7
#>
#> super_plast: 32.2 28.2 28.2 32.2 28.2 32.2 28.2
#>
#> fine_agg 594 594 594 594 594 594 594 594 594 594 594 594 594 594 594 594 594 594 594 594 594 594 992.6 992.6 992.6 992.6 992.6
#>
#> age: 270 365 360 365 365 180 180 180 365 270 180 365 365 270 365 270 180 180 180 270 270 270 180 270 360 180 180 180 360 180 365 180 365 180 270 180 180 360 180 360 180 180 180 180 360 270
#>
#> strength: 79.99 80.2 79.4 82.6 81.75
Sebaran data masing-masing variable dapat dilihat pada histogram di bawah ini. Tidak seluruh parameter/predictor terdistribusi normal. Untuk itu berpotensi dibutuhkan proses scale dengan quare root atau log transformation.
Untuk melakukan pengecekan korelasi masing-masing predictor dapat menggunakan graph di bawah ini. Dimana korelasi data tertinggi terdahap strength adalah cement(korelasi positif), super_plast(korelasi positif), water(korelasi negatif), dan age (korelasi positif).
atau grafik korelasi di bawah ini :
Untuk memudahkan melakukan pemodelan, kita butuh memisahkan kolom id karena tidak akan dijadikan prediktor, dan tidak mempengaruhi kekuatan beton karena hanya sebatas ID/identifier.
# data train yang hanya difilter kecuali kolom ID
concrete_train_clean <- concrete_train%>% select(-id)
# data train dimana prediktor Age di transformasi dengan menggunakan log agar lebih smooth grafik distribusinya
concrete_train_log <- concrete_train_clean
concrete_train_log$age <- log(concrete_train_log$age)
# Data train yang di remove outlier pada data target/strength
concrete_train_rmv_outlier <- concrete_train_clean %>%
filter(strength<79.40)
# data train yang di scale agar jarak antar data tidak terlalu jauh dan distribusi bisa mendekati distribusi normal
concrete_train_scale <- scale(concrete_train_rmv_outlier,center = TRUE,scale = TRUE)lm.orginal <- lm(strength ~., data.frame(data_train1))
model_original<- stats::step(lm.orginal, direction = "backward")#> Start: AIC=3087.32
#> strength ~ cement + slag + flyash + water + super_plast + coarse_agg +
#> fine_agg + age
#>
#> Df Sum of Sq RSS AIC
#> - fine_agg 1 179 69238 3087.0
#> <none> 69059 3087.3
#> - coarse_agg 1 356 69415 3088.7
#> - water 1 867 69926 3093.5
#> - super_plast 1 1016 70076 3095.0
#> - flyash 1 3183 72242 3115.1
#> - slag 1 6531 75590 3145.0
#> - cement 1 13024 82084 3199.3
#> - age 1 35060 104120 3356.3
#>
#> Step: AIC=3087.02
#> strength ~ cement + slag + flyash + water + super_plast + coarse_agg +
#> age
#>
#> Df Sum of Sq RSS AIC
#> - coarse_agg 1 192 69430 3086.9
#> <none> 69238 3087.0
#> - super_plast 1 936 70174 3093.9
#> - water 1 4226 73464 3124.1
#> - flyash 1 5594 74832 3136.3
#> - slag 1 17362 86600 3232.7
#> - age 1 34956 104194 3354.8
#> - cement 1 40444 109682 3388.6
#>
#> Step: AIC=3086.86
#> strength ~ cement + slag + flyash + water + super_plast + age
#>
#> Df Sum of Sq RSS AIC
#> <none> 69430 3086.9
#> - super_plast 1 747 70177 3091.9
#> - flyash 1 5436 74866 3134.6
#> - water 1 6410 75841 3143.1
#> - slag 1 17691 87121 3234.7
#> - age 1 35265 104695 3355.9
#> - cement 1 41308 110738 3393.0
#>
#> Call:
#> lm(formula = strength ~ cement + slag + flyash + water + super_plast +
#> age, data = data.frame(data_train1))
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -30.873 -6.698 0.893 7.173 36.176
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 26.838713 5.271079 5.092 4.65e-07 ***
#> cement 0.101857 0.005168 19.710 < 2e-16 ***
#> slag 0.079303 0.006148 12.899 < 2e-16 ***
#> flyash 0.066859 0.009351 7.150 2.33e-12 ***
#> water -0.203523 0.026212 -7.765 3.18e-14 ***
#> super_plast 0.271058 0.102280 2.650 0.00824 **
#> age 0.132038 0.007250 18.212 < 2e-16 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 10.31 on 653 degrees of freedom
#> Multiple R-squared: 0.6182, Adjusted R-squared: 0.6147
#> F-statistic: 176.2 on 6 and 653 DF, p-value: < 2.2e-16
Pada tahap ini dilakukan Fit 20% data untuk proses validasi model dibuat. Dan diperoleh : R Square model_orginal : 61.47%, namun ketikan di fit data untuk valdiasi, R Square menjadi 58.59% dimana tingkat error data validasi lebih tinggi dibanding data train.
pred_original <- predict(object = model_original, newdata = data_test1)
MAE(pred_original, data_test1$strength)#> [1] 8.502923
#> [1] 0.5859154
#> [1] "multicollinearity:"
#> cement slag flyash water super_plast age
#> 1.864874 1.722825 2.251775 1.860621 2.332434 1.065414
#> [1] "heteroscedasticity:"
#>
#> studentized Breusch-Pagan test
#>
#> data: model_original
#> BP = 99.71, df = 6, p-value < 2.2e-16
#> [1] " normality test:"
#>
#> Shapiro-Wilk normality test
#>
#> data: model_original$residuals
#> W = 0.99461, p-value = 0.01984
Adjusted R-squared : 63.07%. Lebih baik dibanding model I, namun tidak signifikan.
#>
#> Call:
#> lm(formula = strength ~ ., data = data.frame(data_train2))
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -1.81741 -0.38551 0.03816 0.41970 1.99698
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -0.003372 0.023923 -0.141 0.8879
#> cement 0.786236 0.063934 12.298 < 2e-16 ***
#> slag 0.529600 0.062454 8.480 < 2e-16 ***
#> flyash 0.362403 0.058885 6.154 1.32e-09 ***
#> water -0.151167 0.060755 -2.488 0.0131 *
#> super_plast 0.107540 0.039818 2.701 0.0071 **
#> coarse_agg 0.114383 0.051884 2.205 0.0278 *
#> fine_agg 0.120138 0.062475 1.923 0.0549 .
#> age 0.493483 0.026434 18.669 < 2e-16 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 0.6114 on 647 degrees of freedom
#> Multiple R-squared: 0.6352, Adjusted R-squared: 0.6307
#> F-statistic: 140.8 on 8 and 647 DF, p-value: < 2.2e-16
#>
#> Call:
#> lm(formula = strength ~ cement + slag + flyash + water + super_plast +
#> coarse_agg + fine_agg + age, data = data.frame(data_train2))
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -1.81741 -0.38551 0.03816 0.41970 1.99698
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -0.003372 0.023923 -0.141 0.8879
#> cement 0.786236 0.063934 12.298 < 2e-16 ***
#> slag 0.529600 0.062454 8.480 < 2e-16 ***
#> flyash 0.362403 0.058885 6.154 1.32e-09 ***
#> water -0.151167 0.060755 -2.488 0.0131 *
#> super_plast 0.107540 0.039818 2.701 0.0071 **
#> coarse_agg 0.114383 0.051884 2.205 0.0278 *
#> fine_agg 0.120138 0.062475 1.923 0.0549 .
#> age 0.493483 0.026434 18.669 < 2e-16 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 0.6114 on 647 degrees of freedom
#> Multiple R-squared: 0.6352, Adjusted R-squared: 0.6307
#> F-statistic: 140.8 on 8 and 647 DF, p-value: < 2.2e-16
Adjusted R-squared : 63.07% pada data train, namun pada data test sebesar 64%. Shingga dapat disimpulkan lebih baik dibanding model I dan tidak over fitting, namun tidak signifikan bertambah akurasi prediksinya.
pred_scale <- predict(object = model_scale, newdata = data.frame(data_test2))
paste ("MAE:", MAE(pred_scale, data.frame(data_test2)$strength))#> [1] "MAE: 0.541466212542492"
#> [1] "Adj. R Square: 0.630655551229489"
#> [1] "multicollinearity:"
#> cement slag flyash water super_plast coarse_agg
#> 7.323742 6.838624 6.229559 6.141061 2.859650 4.789047
#> fine_agg age
#> 6.459908 1.104924
#> [1] "heteroscedasticity:"
#>
#> studentized Breusch-Pagan test
#>
#> data: model_scale
#> BP = 90.358, df = 8, p-value = 3.933e-16
#> [1] " normality test:"
#>
#> Shapiro-Wilk normality test
#>
#> data: model_scale$residuals
#> W = 0.99565, p-value = 0.06401
Log transformation butuh dilakukan untuk menormalisasi data dan smoothing agar jarak antar data pada predictor tidak terlalu jauh.
concrete_train_log <-concrete_train_clean
concrete_train_log$cement <- log(concrete_train_clean$cement)
concrete_train_log$water <- log(concrete_train_clean$water)
concrete_train_log$coarse_agg <- log(concrete_train_clean$coarse_agg)
concrete_train_log$fine_agg <- log(concrete_train_clean$fine_agg)
concrete_train_log$age <- log(concrete_train_clean$age)
concrete_train_log$strength <- log(concrete_train_clean$strength)
summary(concrete_train_log)#> cement slag flyash water
#> Min. :4.625 Min. : 0.00 Min. : 0.00 Min. :4.802
#> 1st Qu.:5.271 1st Qu.: 0.00 1st Qu.: 0.00 1st Qu.:5.105
#> Median :5.617 Median : 20.00 Median : 0.00 Median :5.215
#> Mean :5.568 Mean : 73.18 Mean : 54.03 Mean :5.192
#> 3rd Qu.:5.858 3rd Qu.:141.30 3rd Qu.:118.20 3rd Qu.:5.257
#> Max. :6.292 Max. :359.40 Max. :200.10 Max. :5.509
#> super_plast coarse_agg fine_agg age
#> Min. : 0.000 Min. :6.686 Min. :6.387 Min. :0.000
#> 1st Qu.: 0.000 1st Qu.:6.837 1st Qu.:6.599 1st Qu.:1.946
#> Median : 6.500 Median :6.875 Median :6.659 Median :3.332
#> Mean : 6.266 Mean :6.877 Mean :6.648 Mean :3.150
#> 3rd Qu.:10.100 3rd Qu.:6.936 3rd Qu.:6.718 3rd Qu.:4.025
#> Max. :32.200 Max. :7.043 Max. :6.900 Max. :5.900
#> strength
#> Min. :0.8459
#> 1st Qu.:3.1629
#> Median :3.5430
#> Mean :3.4464
#> 3rd Qu.:3.8273
#> Max. :4.4140
#>
#> Call:
#> lm(formula = strength ~ ., data = data.frame(data_train3))
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -0.98741 -0.13327 0.00184 0.16320 0.66002
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -9.4215540 3.5460264 -2.657 0.008079 **
#> cement 1.1622369 0.0567332 20.486 < 2e-16 ***
#> slag 0.0033695 0.0002466 13.666 < 2e-16 ***
#> flyash 0.0032690 0.0003084 10.601 < 2e-16 ***
#> water -0.6185971 0.1720572 -3.595 0.000349 ***
#> super_plast 0.0041230 0.0026623 1.549 0.121949
#> coarse_agg 0.6860384 0.2115898 3.242 0.001246 **
#> fine_agg 0.5210269 0.1882061 2.768 0.005794 **
#> age 0.3111670 0.0079660 39.062 < 2e-16 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 0.2408 on 651 degrees of freedom
#> Multiple R-squared: 0.8174, Adjusted R-squared: 0.8152
#> F-statistic: 364.3 on 8 and 651 DF, p-value: < 2.2e-16
#> Start: AIC=-1870.22
#> strength ~ cement + slag + flyash + water + super_plast + coarse_agg +
#> fine_agg + age
#>
#> Df Sum of Sq RSS AIC
#> <none> 37.762 -1870.2
#> - super_plast 1 0.139 37.901 -1869.8
#> - fine_agg 1 0.445 38.206 -1864.5
#> - coarse_agg 1 0.610 38.372 -1861.7
#> - water 1 0.750 38.512 -1859.2
#> - flyash 1 6.519 44.281 -1767.1
#> - slag 1 10.834 48.596 -1705.7
#> - cement 1 24.344 62.106 -1543.8
#> - age 1 88.507 126.269 -1075.5
#>
#> Call:
#> lm(formula = strength ~ cement + slag + flyash + water + super_plast +
#> coarse_agg + fine_agg + age, data = data.frame(data_train3))
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -0.98741 -0.13327 0.00184 0.16320 0.66002
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -9.4215540 3.5460264 -2.657 0.008079 **
#> cement 1.1622369 0.0567332 20.486 < 2e-16 ***
#> slag 0.0033695 0.0002466 13.666 < 2e-16 ***
#> flyash 0.0032690 0.0003084 10.601 < 2e-16 ***
#> water -0.6185971 0.1720572 -3.595 0.000349 ***
#> super_plast 0.0041230 0.0026623 1.549 0.121949
#> coarse_agg 0.6860384 0.2115898 3.242 0.001246 **
#> fine_agg 0.5210269 0.1882061 2.768 0.005794 **
#> age 0.3111670 0.0079660 39.062 < 2e-16 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 0.2408 on 651 degrees of freedom
#> Multiple R-squared: 0.8174, Adjusted R-squared: 0.8152
#> F-statistic: 364.3 on 8 and 651 DF, p-value: < 2.2e-16
Adj. R Square meningkat menjadi: 81.77% (lebih baik dibanding model I & II)
pred_log <- predict(object = model_log, newdata = data_test3)
paste ("MAE:", MAE(pred_log, data_test3$strength))#> [1] "MAE: 0.174721344232881"
#> [1] "Adj. R Square: 0.815170506057593"
#> [1] "multicollinearity:"
#> cement slag flyash water super_plast coarse_agg
#> 5.505455 5.078702 4.489100 4.699301 2.896739 3.357009
#> fine_agg age
#> 4.475771 1.028341
#> [1] "heteroscedasticity:"
#>
#> studentized Breusch-Pagan test
#>
#> data: model_log
#> BP = 66.079, df = 8, p-value = 2.952e-11
#> [1] " normality test:"
#>
#> Shapiro-Wilk normality test
#>
#> data: model_log$residuals
#> W = 0.98871, p-value = 5.743e-05
#> [1] 820 9
Pada model random forest, corss validation pada prinsipnya sudah dilakukan otomatis saat menjalankan model. Sehingga tidak dibutuhkan pemisahaan data train dan data test.
nilai optimun randowm forest terjadi saat mtry = 5 dengan RMSE 5.04 dan MAE 3.6. Model ini memenuhi kriteria yang disyaratkan dengan R Square > 90% dan MAE <4%. Sehingga model ini adalah model yang paling baik dari 4 model yang dipakai untuk prediksi.
#> Random Forest
#>
#> 820 samples
#> 8 predictor
#>
#> No pre-processing
#> Resampling: Cross-Validated (6 fold, repeated 3 times)
#> Summary of sample sizes: 684, 683, 684, 683, 683, 683, ...
#> Resampling results across tuning parameters:
#>
#> mtry RMSE Rsquared MAE
#> 2 5.670121 0.9001213 4.272428
#> 5 5.040950 0.9091862 3.651791
#> 8 5.072445 0.9063404 3.641625
#>
#> RMSE was used to select the optimal model using the smallest value.
#> The final value used for the model was mtry = 5.
#>
#> Call:
#> randomForest(x = x, y = y, mtry = param$mtry)
#> Type of random forest: regression
#> Number of trees: 500
#> No. of variables tried at each split: 5
#>
#> Mean of squared residuals: 23.79246
#> % Var explained: 91.13
#> rf variable importance
#>
#> Overall
#> age 100.0000
#> cement 81.7304
#> water 28.2220
#> super_plast 12.7195
#> slag 7.3321
#> fine_agg 5.9187
#> coarse_agg 0.9443
#> flyash 0.0000
Pediction Performance dari concrete test memenuhi target yang ditetapkan sbb : * MAE : 3,57 dan * R-squared : 91 %
LIME dapat digunakan untuk menginterpretasikan model yang komplex agar lebih mudah di pahami/diinterpretasikan dengan local variable. Hal ini lebih membantu dibandingkan dengan random forest yang komplex dimana cenderung bersifat black box dan hanya menampilkan summary dari hasil pemodelan.
explainer <- lime(data_train4, forest_read, n_bins = 4)
explanation<- explain(data_test4, explainer, n_features = 4,n_labels = 0.5, kernel_width = .1)pada model random forest kita dapat melihat interpretasi model dengan menggunakan varImp untuk melihat variable Importance pada sebuah model random forest. Dimana pada model IV terdapat 5 variable penting penentu atau yang signifikan digunakan untuk membangun model.
#> Random Forest
#>
#> 820 samples
#> 8 predictor
#>
#> No pre-processing
#> Resampling: Cross-Validated (6 fold, repeated 3 times)
#> Summary of sample sizes: 684, 683, 684, 683, 683, 683, ...
#> Resampling results across tuning parameters:
#>
#> mtry RMSE Rsquared MAE
#> 2 5.670121 0.9001213 4.272428
#> 5 5.040950 0.9091862 3.651791
#> 8 5.072445 0.9063404 3.641625
#>
#> RMSE was used to select the optimal model using the smallest value.
#> The final value used for the model was mtry = 5.
#> rf variable importance
#>
#> Overall
#> age 100.0000
#> cement 81.7304
#> water 28.2220
#> super_plast 12.7195
#> slag 7.3321
#> fine_agg 5.9187
#> coarse_agg 0.9443
#> flyash 0.0000
Berdasarkan 4 model yang dibangun, diperoleh informasi bahwa : a. Tujuan tercapat dengan prediksi menggunakan model IV, diperoleh nilai MAE 3.57 (kurang dari 4) dan R Square sebesar 91% (lebih dari 90%).
Sehingga dapat disimpulkan permasalahan perhitungan kekuatan beton tanpa harus menunggu cukup lama untuk proses pengukuran tercapai. Dimana Machine learning dapat digunakan untuk memprediksi dengan tingkat error yang ditetapkan.
Model yang digunakan adalah model IV dengan menggunakan random forest dengan melakukan pedekatan penghapusan 5row data outlier yang cukup signifikan mempengaruhi pemodelan.
Peluang lain yang dapat dilakukan adalah, pengusaha atau perusahaan infrastruktur dapat memanfaatkan machine learning ini untuk memprediksi kekuatan beton yang diharapkan dari komposisi bahan-bahan penyusunnya. Atau sebaliknya, pemodelan machine learning juga dapat digunakan untuk menemukan komposisi bahan bangunan paling hemat/efisien untuk menghasilkan kekuatan beton yang sama. Seingga dapat memberikan rekomendasi bagi perusahaan konstruksi agar memperoleh laba lebih tinggi dengan qualitas yang sama.