Tuesday, April 28, 2020

Regression Logistic (Regresi Logistik)

Secara umum, regresi logistik biner menggambarkan hubungan antara variabel dependen biner dan satu atau lebih variabel independen.
Variabel dependen biner memiliki dua hasil yang mungkin:
·         ‘1’ untuk benar / sukses; atau
·         ‘0’ untuk false / kegagalan
Sekarang mari kita lihat bagaimana menerapkan regresi logistik di Python menggunakan contoh praktis.

Langkah-langkah untuk Menerapkan Regresi Logistik dengan Python

Langkah 1: Kumpulkan data Anda
Untuk memulai dengan contoh sederhana, katakanlah tujuan Anda adalah untuk membangun model regresi logistik dengan Python untuk menentukan apakah kandidat akan diterima di universitas bergengsi.
Di sini, ada dua hasil yang mungkin: Diterima (diwakili oleh nilai '1') vs Ditolak (diwakili oleh nilai '0').
Anda kemudian membangun regresi logistik dengan Python, di mana:
·         Variabel dependen menunjukkan apakah seseorang diterima
·         3 variabel independen adalah skor GMAT, IPK dan Tahun pengalaman kerja

Berikut tampilan dataset-nya:
Perhatikan bahwa dataset di atas berisi 40 pengamatan. Dalam praktiknya, Anda akan membutuhkan ukuran sampel yang lebih besar untuk mendapatkan hasil yang lebih akurat.


Langkah 2: Impor paket Python yang dibutuhkan
Sebelum Anda mulai, pastikan bahwa paket-paket berikut ini diinstal dengan Python:
·         pandas - digunakan untuk membuat DataFrame untuk menangkap dataset dengan Python
·         sklearn - digunakan untuk membangun model regresi logistik dengan Python
·         seaborn - digunakan untuk membuat Confusion Matrix
·         matplotlib - digunakan untuk menampilkan grafik
Kemudian impor semua paket yang dibutuhkan, sebagai berikut:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import seaborn as sn
import matplotlib.pyplot as plt

Langkah 3: Bangun Dataframe
Untuk langkah ini, Anda harus menangkap dataset (dari langkah 1) dengan Python. Anda dapat menyelesaikan tugas ini menggunakan panda Dataframe:
import pandas as pd
candidates = {
'gmat': [780, 750, 690, 710, 680, 730, 690, 720, 740, 690, 610, 690, 710, 680, 770, 610, 580, 650, 540, 590, 620, 600, 550, 550, 570, 670, 660, 580, 650, 660, 640, 620, 660, 660, 680, 650, 670, 580, 590, 690],
'gpa': [4, 3.9, 3.3, 3.7, 3.9, 3.7, 2.3, 3.3, 3.3, 1.7, 2.7, 3.7, 3.7, 3.3, 3.3, 3, 2.7, 3.7, 2.7, 2.3, 3.3, 2, 2.3, 2.7, 3, 3.3, 3.7, 2.3, 3.7, 3.3, 3, 2.7, 4, 3.3, 3.3, 2.3, 2.7, 3.3, 1.7, 3.7],
'work_experience': [3, 4, 3, 5, 4, 6, 1, 4, 5, 1, 3, 5, 6, 4, 3, 1, 4, 6, 2, 3, 2, 1, 4, 1, 2, 6, 4, 2, 6, 5, 1, 2, 4, 6, 5, 1, 2, 1, 4, 5],
'admitted': [1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1]
}
df = pd.DataFrame(candidates, columns = ['gmat', 'gpa', 'work_experience', 'admitted'])
print (df)

    gmat  gpa  work_experience  admitted
0    780  4.0                3         1
1    750  3.9                4         1
2    690  3.3                3         0
3    710  3.7                5         1
4    680  3.9                4         0
5    730  3.7                6         1
6    690  2.3                1         0
7    720  3.3                4         1
8    740  3.3                5         1
9    690  1.7                1         0
10   610  2.7                3         0
11   690  3.7                5         1
12   710  3.7                6         1
13   680  3.3                4         0
14   770  3.3                3         1
15   610  3.0                1         0
16   580  2.7                4         0
17   650  3.7                6         1
18   540  2.7                2         0
19   590  2.3                3         0
20   620  3.3                2         1
21   600  2.0                1         0
22   550  2.3                4         0
23   550  2.7                1         0
24   570  3.0                2         0
25   670  3.3                6         1
26   660  3.7                4         1
27   580  2.3                2         0
28   650  3.7                6         1
29   660  3.3                5         1
30   640  3.0                1         0
31   620  2.7                2         0
32   660  4.0                4         1
33   660  3.3                6         1
34   680  3.3                5         1
35   650  2.3                1         0
36   670  2.7                2         0
37   580  3.3                1         0
38   590  1.7                4         0
39   690  3.7                5         1

Atau, Anda bisa mengimpor data ke Python dari file eksternal.
Langkah 4: Buat regresi logistik dengan Python
Sekarang, atur variabel independen (direpresentasikan sebagai X) dan variabel dependen (direpresentasikan sebagai y):
X = df[['gmat', 'gpa','work_experience']]
y = df['admitted']

Lalu, terapkan train_test_split. Misalnya, Anda dapat mengatur ukuran tes ke 0,25, dan karena itu pengujian model akan didasarkan pada 25% dari dataset, sedangkan pelatihan model akan didasarkan pada 75% dari dataset:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

Terapkan regresi logistik sebagai berikut:
logistic_regression = LogisticRegression(solver='liblinear')
logistic_regression.fit(X_train, y_train)
y_pred = logistic_regression.predict(X_test)

Kemudian, gunakan kode di bawah ini untuk mendapatkan Confusion Matrix:
confusion_matrix = pd.crosstab(y_test, y_pred, rownames=['Actual'], colnames=['Predicted'])
sn.heatmap(confusion_matrix, annot=True)

Untuk bagian terakhir, cetak Akurasi dan plot Confusion Matrix:
print('Accuracy: ', metrics.accuracy_score(y_test, y_pred))
plt.show()

Menyatukan semua komponen kode:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import seaborn as sn
import matplotlib.pyplot as plt

candidates = {

'gmat':[780,750,690,710,680,730,690,720,740,690,610,690,710,680,770,610,580,650,540,590,620,600,550,550,570,670,660,580,650,660,640,620,660,660,680,650,670,580,590,690],

'gpa':[4,3.9,3.3,3.7,3.9,3.7,2.3,3.3,3.3,1.7,2.7,3.7,3.7,3.3,3.3,3,2.7,3.7,2.7,2.3,3.3,2,2.3,2.7,3,3.3,3.7,2.3,3.7,3.3,3,2.7,4,3.3,3.3,2.3,2.7,3.3,1.7,3.7],

'work_experience':[3,4,3,5,4,6,1,4,5,1,3,5,6,4,3,1,4,6,2,3,2,1,4,1,2,6,4,2,6,5,1,2,4,6,5,1,2,1,4,5],

'admitted':[1,1,0,1,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,1]
}

df = pd.DataFrame(candidates,columns= ['gmat', 'gpa','work_experience','admitted'])

#print (df)

X = df[['gmat', 'gpa','work_experience']]
y = df['admitted']

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=0)

logistic_regression= LogisticRegression(solver='liblinear')
logistic_regression.fit(X_train,y_train)
y_pred=logistic_regression.predict(X_test)

confusion_matrix = pd.crosstab(y_test, y_pred, rownames=['Actual'], colnames=['Predicted'])
sn.heatmap(confusion_matrix, annot=True)

print('Accuracy: ',metrics.accuracy_score(y_test, y_pred))
plt.show()

Jalankan kode dengan Python, dan Anda akan mendapatkan Confusion Matrix berikut dengan Akurasi 0,7 (perhatikan bahwa tergantung pada versi sklearn Anda, Anda mungkin mendapatkan hasil akurasi yang berbeda):

Seperti yang dapat diamati dari matriks:

·         TP = True Positive = 4
·         TN = Benar Negatif = 3
·         FP = Positif Salah = 2
·         FN = Negatif Salah =1
Anda bisa mendapatkan Akurasi menggunakan:
Akurasi = (TP + TN) / Total = 4 +3) / 10 = 0,7
Oleh karena itu akurasi adalah 70% untuk set tes.

Menyelam Lebih Dalam ke Hasil
Sekarang mari kita cetak dua komponen dalam kode python:
print(X_test)
print(y_pred)

Berikut adalah kode yang digunakan:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

candidates = {
'gmat': [780,750,690,710,680,730,690,720,740,690,610,690,710,680,770,610,580,650,540,590,620,600,550,550,570,670,660,580,650,660,640,620,660,660,680,650,670,580,590,690],

'gpa': [4,3.9,3.3,3.7,3.9,3.7,2.3,3.3,3.3,1.7,2.7,3.7,3.7,3.3,3.3,3,2.7,3.7,2.7,2.3,3.3,2,2.3,2.7,3,3.3,3.7,2.3,3.7,3.3,3,2.7,4,3.3,3.3,2.3,2.7,3.3,1.7,3.7],

'work_experience': [3,4,3,5,4,6,1,4,5,1,3,5,6,4,3,1,4,6,2,3,2,1,4,1,2,6,4,2,6,5,1,2,4,6,5,1,2,1,4,5],

'admitted': [1,1,0,1,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,1]
}

df = pd.DataFrame(candidates,columns= ['gmat', 'gpa','work_experience','admitted'])

X = df[['gmat', 'gpa','work_experience']]
y = df['admitted'] 

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=0)  #train is based on 75% of the dataset, test is based on 25% of dataset

logistic_regression= LogisticRegression(solver='liblinear')
logistic_regression.fit(X_train,y_train)
y_pred=logistic_regression.predict(X_test)

print (X_test) #test dataset
print (y_pred) #predicted values

Ingat bahwa dataset asli (dari langkah 1) memiliki 40 pengamatan. Karena kita menetapkan ukuran pengujian ke 0,25, maka confusion matrix menampilkan hasil untuk 10 baris (= 40 * 0,25). Berikut ini adalah 10 baris uji:
    gmat  gpa  work_experience
22   550  2.3                4
20   620  3.3                2
25   670  3.3                6
4    680  3.9                4
10   610  2.7                3
15   610  3.0                1
28   650  3.7                6
11   690  3.7                5
18   540  2.7                2
29   660  3.3                5

Prediksi ini juga dibuat untuk 10 record tersebut (dimana 1 = diterima, sedangkan 0 = ditolak):
[1 0 1 1 0 0 1 1 0 1] 



Index dan Dataset  adalah sebagai berikut:
index
gmat
gpa
work_experience
admitted
0



1
1



1
2



0
3



1
4



0
5



1
6



0
7



1
8



1
9



0
10



0
11



1
12



1
13



0
14



1
15



0
16



0
17



1
18



0
19



0
20



1
21



0
22



0
23



0
24



0
25



1
26



1
27



0
28



1
29



1
30



0
31



0
32



1
33



1
34



1
35



0
36



0
37



0
38



0
39



1

Dalam dataset aktual (dari langkah-1), Anda akan melihat bahwa untuk data pengujian, kita mendapatkan hasil yang benar 8 dari 10 kali:
index
gmat
gpa
work_experience
admitted – actual result
admidtted – predicted result
matching
22
550
2.3
4
0
1
FALSE
20
620
3.3
2
1
0
FALSE
25
670
3.3
6
1
1
TRUE
4
680
3.9
4
0
1
FALSE
10
610
2.7
3
0
0
TRUE
15
610
3.0
1
0
0
TRUE
28
650
3.7
6
1
1
TRUE
11
690
3.7
5
1
1
TRUE
18
540
2.7
2
0
0
TRUE
29
660
3.3
5
1
1
TRUE

Ini cocok dengan tingkat akurasi 70% (=7/10*100)

Memeriksa Prediksi untuk Set Data Baru
Katakanlah Anda memiliki kumpulan data baru, dengan 5 kandidat baru:

gmat
gpa
work_experience
590
2
3
740
3.7
4
680
3.3
6
610
2.3
1
710
3
5







Tujuan Anda adalah menggunakan model regresi logistik yang ada untuk memprediksi apakah kandidat baru akan diterima.
Set data baru kemudian dapat ditangkap dalam DataFrame kedua bernama df2:
new_candidates = {'gmat': [590,740,680,610,710],
                  'gpa': [2,3.7,3.3,2.3,3],
                  'work_experience': [3,4,6,1,5]
                  }

df2 = pd.DataFrame(new_candidates,columns= ['gmat', 'gpa','work_experience'])

Dan di sini adalah kode lengkap untuk mendapatkan prediksi 5 kandidat baru:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

candidates = {'gmat': [780,750,690,710,680,730,690,720,740,690,610,690,710,680,770,610,580,650,540,590,620,600,550,550,570,670,660,580,650,660,640,620,660,660,680,650,670,580,590,690],
              'gpa': [4,3.9,3.3,3.7,3.9,3.7,2.3,3.3,3.3,1.7,2.7,3.7,3.7,3.3,3.3,3,2.7,3.7,2.7,2.3,3.3,2,2.3,2.7,3,3.3,3.7,2.3,3.7,3.3,3,2.7,4,3.3,3.3,2.3,2.7,3.3,1.7,3.7],
              'work_experience': [3,4,3,5,4,6,1,4,5,1,3,5,6,4,3,1,4,6,2,3,2,1,4,1,2,6,4,2,6,5,1,2,4,6,5,1,2,1,4,5],
              'admitted': [1,1,0,1,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,1]
              }

df = pd.DataFrame(candidates,columns= ['gmat', 'gpa','work_experience','admitted'])

X = df[['gmat', 'gpa','work_experience']]
y = df['admitted']

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=0)  #in this case, you may choose to set the test_size=0. You should get the same prediction here

logistic_regression= LogisticRegression(solver='liblinear')
logistic_regression.fit(X_train,y_train)

new_candidates = {'gmat': [590,740,680,610,710],
                  'gpa': [2,3.7,3.3,2.3,3],
                  'work_experience': [3,4,6,1,5]
                  }

df2 = pd.DataFrame(new_candidates,columns= ['gmat', 'gpa','work_experience'])
y_pred=logistic_regression.predict(df2)

print (df2)
print (y_pred)

Jalankan kode programnya, dan akan didapatkan prediksi berikut:
   gmat  gpa  work_experience
0   590  2.0                3
1   740  3.7                4
2   680  3.3                6
3   610  2.3                1
4   710  3.0                5
[0 1 1 0 1]


Kandidat pertama dan keempat tidak diharapkan untuk diterima, sementara kandidat lainnya diharapkan untuk diterima.
--------------------------
Source dapat di download di sini => https://drive.google.com/file/d/1da9XmA1VTqiUc46paiFMR70fRKhbo35g/view?usp=sharing
Materi: https://drive.google.com/open?id=17Z_1xXXGuWiC0VXrnNtuxLzz4jJGqciz
, ,

No comments:

Post a Comment