Nama: Jasmine Georgina Sekartaji NIM: 121450159 Kelas: RA

A. Eksplorasi Data Analisis, Klasifikasi dan Resampling [Jumlah Poin: 35]

Silahkan Unduh dataset di bawah ini: https://bit.ly/datasetra

  1. Panggil Package berikut:
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.2
## Warning: package 'ggplot2' was built under R version 4.2.2
## Warning: package 'tidyr' was built under R version 4.2.2
## Warning: package 'readr' was built under R version 4.2.2
## Warning: package 'purrr' was built under R version 4.2.2
## Warning: package 'dplyr' was built under R version 4.2.2
## Warning: package 'stringr' was built under R version 4.2.2
## Warning: package 'forcats' was built under R version 4.2.2
## Warning: package 'lubridate' was built under R version 4.2.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## βœ” dplyr     1.1.0     βœ” readr     2.1.4
## βœ” forcats   1.0.0     βœ” stringr   1.5.0
## βœ” ggplot2   3.4.1     βœ” tibble    3.1.8
## βœ” lubridate 1.9.2     βœ” tidyr     1.3.0
## βœ” purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## βœ– dplyr::filter() masks stats::filter()
## βœ– dplyr::lag()    masks stats::lag()
## β„Ή Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(mlr3verse)
## Warning: package 'mlr3verse' was built under R version 4.2.2
## Loading required package: mlr3
## Warning: package 'mlr3' was built under R version 4.2.2
library(mlr3tuning)
## Warning: package 'mlr3tuning' was built under R version 4.2.2
## Loading required package: paradox
## Warning: package 'paradox' was built under R version 4.2.2
library(ggplot2)
library(dplyr)
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.2.2
## 
## Attaching package: 'gridExtra'
## 
## The following object is masked from 'package:dplyr':
## 
##     combine
library(readxl)
## Warning: package 'readxl' was built under R version 4.2.2

Note: Import libarary yang akan digunakan

  1. Set direktori dan lakukan mutate terhadap dataset agar menjadi numerik
setwd("C:/Users/LENOVO/Downloads")
data3 <- read.csv("riceclass.csv",stringsAsFactors = TRUE)
#data3 <- data3 %>% mutate(across(where(is.integer),as.factor()))

Note” Import dataset melalui import csv dari drive local perangkat.

  1. Cek dataset dengan Glimpse
glimpse(data3)
## Rows: 324
## Columns: 12
## $ id              <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,…
## $ Area            <int> 4537, 2872, 3048, 3073, 3693, 2990, 3556, 3788, 2629, …
## $ MajorAxisLength <dbl> 92.22932, 74.69188, 76.29316, 77.03363, 85.12478, 77.4…
## $ MinorAxisLength <dbl> 64.01277, 51.40045, 52.04349, 51.92849, 56.37402, 50.9…
## $ Eccentricity    <dbl> 0.7199162, 0.7255527, 0.7312109, 0.7386387, 0.7492816,…
## $ ConvexArea      <int> 4677, 3015, 3132, 3157, 3802, 3080, 3636, 3866, 2790, …
## $ EquivDiameter   <dbl> 76.00452, 60.47102, 62.29634, 62.55130, 68.57167, 61.7…
## $ Extent          <dbl> 0.6575362, 0.7130089, 0.7591532, 0.7835288, 0.7693750,…
## $ Perimeter       <dbl> 273.085, 208.317, 210.012, 210.657, 230.332, 216.930, …
## $ Roundness       <dbl> 0.7645096, 0.8316582, 0.8684336, 0.8702031, 0.8747433,…
## $ AspectRation    <dbl> 1.440796, 1.453137, 1.465950, 1.483456, 1.510000, 1.51…
## $ Class           <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …

Note: cek dataset menggunakan glipse agar dapat mengetahui apa saja yang ada di dalam dataset tersebut. Alternatif lain dapat menggunakah head(namadataset).

  1. Ubah beberapa variabel menjadi factor
data3$Class <- as.factor(data3$Class)
as.factor(data3$Class)
##   [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##  [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##  [75] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [112] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [149] 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
## [186] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [223] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [260] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [297] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## Levels: 0 1

Note: Ubah beberapa variable menhadi factor agar data dalam variable dapat digunakan(dalam workspace ini menggunakan Class sebagai pembandingnya).

  1. Buatlah barplot dengan ggplot
p1 <- ggplot(data = data3) +geom_line(mapping = aes(x = 100, y = 100))
p2 <-ggplot(data = data3) +geom_line(mapping = aes(x = 100, y=150  ))
p3 <-ggplot(data = data3) +geom_line(mapping = aes(x =100 ,y=100) )
p4 <-ggplot(data = data3) +geom_line(mapping = aes(x =100 , y=100)) 
grid.arrange(p1,p2,p3,p4, ncol= 2)

Note: membuat barplot dengan library ggplot(2) untuk mengetahui jumlah/persentase data di setiap variablenya.

  1. Hapus nilai NA
data3 <- data3 %>% na.omit()

Note: Nilai NA dihapus untuk menghapus/mengesampingkan data yang tidak ada/kosong.

  1. Buatlah task klasifikasi
#task_data3 = TaskClassif$new(id="data3",
 #                             backend = ...,
 #                             target = "data3",positive ="1")

Note: task klasifikasi dibuat untuk mengklasifikasikan data

  1. Buatlah Learner 1 dan 2 : Logistic Regression dan LDA
learner1 = lrn("classif.log_reg", predict_type = "prob")
learner1
## <LearnerClassifLogReg:classif.log_reg>
## * Model: -
## * Parameters: list()
## * Packages: mlr3, mlr3learners, stats
## * Predict Types:  response, [prob]
## * Feature Types: logical, integer, numeric, character, factor, ordered
## * Properties: loglik, twoclass

Note: learner1 adalah variable baru untuk menandakan melakukan klasifikasi regresi logistik.

learner2 = lrn("classif.lda", predict_type = "prob")
learner2
## <LearnerClassifLDA:classif.lda>
## * Model: -
## * Parameters: list()
## * Packages: mlr3, mlr3learners, MASS
## * Predict Types:  response, [prob]
## * Feature Types: logical, integer, numeric, factor, ordered
## * Properties: multiclass, twoclass, weights

Note: learner2 adalah variable baru untuk menandakan melakukan klasifikasi regresi logistik.

  1. Lakukan resampling Crossvalidation, dengan folds bebas (misal, 3 atau 4)
#resampling = rsmp("cv", 3)
#rr = resample(task = task_data3, learner = 3, resampling = resampling)
#rr$aggregate(msr("classif.acc"))
#resampling_1 = rsmp("cv", 4)
#rr1 = resample(task = task_data3, learner = 4, resampling = resampling_1)
#rr1$aggregate(msr("classif.acc"))

B. Tree-based(Decision Tree) [Jumlah Poin : 30]

Pada pertanyaan ini kita akan menggunakan model randomforest untuk klasifikasi. berikut package yang digunakan

# install.packages('rpart')
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.2.2
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:gridExtra':
## 
##     combine
## The following object is masked from 'package:dplyr':
## 
##     combine
## The following object is masked from 'package:ggplot2':
## 
##     margin
library(ROSE)
## Warning: package 'ROSE' was built under R version 4.2.2
## Loaded ROSE 0.0-4

Note: install library yang akan digunakan seperti random forest yang akan digunakan dalam tree dan library ROSE digunakan untuk random over-sampling examples yang akan digunakan untuk menangani data yang mengalami over sampling.

#MODELING
#Splitting the dataset into the Training set and Test set
  #Stratified sample
data_ones <- data3[which(data3$Class == 1), ]
data_zeros <- data3[which(data3$Class == 0), ]

Note: data_ ones yaitu untuk menstatisfied sample menjadi data_ones dab data_zeros yang menggunakan data3$class dengan 1 dan 0.

    #Train data
set.seed(123)
train_ones_rows <- sample(1:nrow(data_ones), 0.8*nrow(data_ones))
train_zeros_rows <- sample(1:nrow(data_zeros), 0.8*nrow(data_ones))
train_ones <- data_ones[train_ones_rows, ]  
train_zeros <- data_zeros[train_zeros_rows, ]
training_set <- rbind(train_ones, train_zeros)

table(training_set$Class)
## 
##   0   1 
## 125 125

Note: melakukan data training dengan seed 123 dan menggunakan 0.8 untuk memngalikan dalam proses dat training. Hasil dari data training didapatkan yang memiliki class 0 adalah sebanyak 125 begitu juga dengan class 1 sebanyak 125.

#Test Data
test_ones <- data_ones[-train_ones_rows, ]
test_zeros <- data_zeros[-train_zeros_rows, ]
test_set <- rbind(test_ones, test_zeros)

table(test_set$target)
## < table of extent 0 >

Note: melakukan data testing dengan meminuskan dara training dan membuat test_table adalah rbind dari penggabungan test ones dan zeros sebelumnya.

#Random Forest

rf = randomForest(x = training_set[-12],
                  y = training_set$Class,
                  ntree = 10)

Note: melakukan random forest dengan mengeset variabel x sebesar -12 dari data training dan variable y adalah data train dari class dan ntree sebanyak 10.

y_pred = predict(rf, 
                 type = 'class', 
                 newdata = test_set[-12])

Note: melakukan prediksi dari random forest dengan tipe data classs dan data baru dari test_set sebesar -12.

 #Making the confusion matrix
cm_rf = table(test_set[, 12], y_pred)
cm_rf
##    y_pred
##      0  1
##   0 42  0
##   1  0 32

Note: membuat matrix confusion dengan simbol cm_rf dengan menggunakan data set sebesar 12 dan y prediksi. hasilnya adalah untuk ypred 0 dan 0 hasilnya 42, untuk ypred 0 dan 1 hasilnya 0, untuk ypred 1 dab 0 hasilnya 0, dan untuk ypred 1 dan 1 hasilnya 32.

#Accuracy
accuracy_rf = (cm_rf[1,1] + cm_rf[2,2])/
  (cm_rf[1,1] + cm_rf[2,2] + cm_rf[2,1] + cm_rf[1,2])
accuracy_rf
## [1] 1

Note: memeriksa akurasi dari random forest dan hasil yang didapatkan adalah 1 yang artinya akurat(1=akurat;0=tidak/kurang akurat).

#ROC curve
library(ROSE)
roc.curve(test_set$Class, y_pred)

## Area under the curve (AUC): 1.000

Note: membuat ROC plot menggunakan library ROSE dengan x adalah data test $ class dan y adalah y prediction. Dari hasil visualisasi ROC curve tersebut, didapati bahwa hasilnya tegak lurus yang berarti jika true positive rate meningkat maka false positive ratenya juga meningkat.

Jelaskan setiap baris kode yang sudah disajikan di atas, dan berikan kesimpulan anda terhadap evaluasi akurasi dengan ROC Curve.

(Hint, periksalah apakah akurasi lebih baik dari ROC, atau sebaliknya, maka pengukuran yang digunakan berdasarkan evaluasi yang paling tinggi akurasinya)

C. Linear Model Selection [Jumlah Poin: 35]

Pada sesi ini anda di minta untuk melengkapi kode dan menjelaskan hasil dari ridge dan lasso, mana fitur importance yang paling mempengaruhi dan berapa nilai lambda keduanya?

library(glmnet)
## Warning: package 'glmnet' was built under R version 4.2.2
## Loading required package: Matrix
## Warning: package 'Matrix' was built under R version 4.2.2
## 
## Attaching package: 'Matrix'
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
## Loaded glmnet 4.1-6
set.seed(1)
trainid <- sample(1:nrow(data3), nrow(data3)/2)
train <- data3[trainid,]
test <- data3[-trainid,]
xmat.train <- model.matrix(trainid~., data=train)[,-1]
xmat.test <- model.matrix(-trainid~., data=test)[,-1]
str(trainid)
##  int [1:162] 324 167 129 299 270 187 307 85 277 263 ...
fit.ridge <- cv.glmnet(xmat.train, train$Class, alpha=0, family="binomial")
(lambda <- fit.ridge$lambda.min) # optimal lambda
## [1] 0.04996569
predict(fit.ridge, s=lambda, type="coefficients")
## 13 x 1 sparse Matrix of class "dgCMatrix"
##                            s1
## (Intercept)     19.3463178759
## id              -0.0054080743
## Area            -0.0001846799
## MajorAxisLength -0.0133054440
## MinorAxisLength -0.0478341028
## Eccentricity    -6.3909173239
## ConvexArea      -0.0001796308
## EquivDiameter   -0.0255218901
## Extent           0.5695246724
## Perimeter       -0.0063837135
## Roundness       -4.1194114121
## AspectRation     0.0993468685
## Class1           1.5939607004
#importance(fit.ridge)
fit.lasso <- cv.glmnet(xmat.train, train$Class, alpha=1, family="binomial")
(lambda <- fit.lasso$lambda.min) # optimal lambda
## [1] 0.0006760597
predict(fit.lasso, s=lambda, type="coefficients")
## 13 x 1 sparse Matrix of class "dgCMatrix"
##                        s1
## (Intercept)     -7.335617
## id               .       
## Area             .       
## MajorAxisLength  .       
## MinorAxisLength  .       
## Eccentricity     .       
## ConvexArea       .       
## EquivDiameter    .       
## Extent           .       
## Perimeter        .       
## Roundness        .       
## AspectRation     .       
## Class1          14.597076
#importance(fit.lasso)
  1. Analisis note: Dari hasil kode diatas, hasil dari regresi ridge dan lasso sebagai berikut

Hasil ridge fit. ridge sebesar 0.04996569 dengah hasil prediksi setiap variablenya yang dapat dilihat di hasil code diatas

Hasil lasso hasil fit.lasso sebesar [1] 0.0006760597 dengah hasil prediksi setiap variablenya yang dapat dilihat di hasil code diatas

Variable/fitur yang important di ridge adalah class1 dan aspectratio dan di lasso adalah class.