CNTK - Model Regresi Logistik
Bab ini membahas tentang membangun model regresi logistik di CNTK.
Dasar-dasar model Regresi Logistik
Regresi Logistik, salah satu teknik ML yang paling sederhana, merupakan teknik khusus untuk klasifikasi biner. Dengan kata lain, untuk membuat model prediksi dalam situasi di mana nilai variabel untuk diprediksi dapat menjadi salah satu dari dua nilai kategorikal. Salah satu contoh Regresi Logistik yang paling sederhana adalah memprediksi apakah orang tersebut laki-laki atau perempuan, berdasarkan usia, suara, rambut, dan sebagainya.
Contoh
Mari kita pahami konsep Regresi Logistik secara matematis dengan bantuan contoh lain -
Misalkan, kita ingin memprediksi kelayakan kredit suatu aplikasi pinjaman; 0 berarti menolak, dan 1 berarti menyetujui, berdasarkan pemohondebt , income dan credit rating. Kami mewakili hutang dengan X1, pendapatan dengan X2 dan peringkat kredit dengan X3.
Dalam Regresi Logistik, kami menentukan nilai bobot, yang diwakili oleh w, untuk setiap fitur dan satu nilai bias, diwakili oleh b.
Sekarang misalkan,
X1 = 3.0
X2 = -2.0
X3 = 1.0
Dan misalkan kita menentukan bobot dan bias sebagai berikut -
W1 = 0.65, W2 = 1.75, W3 = 2.05 and b = 0.33
Sekarang, untuk memprediksi kelas, kita perlu menerapkan rumus berikut -
Z = (X1*W1)+(X2*W2)+(X3+W3)+b
i.e. Z = (3.0)*(0.65) + (-2.0)*(1.75) + (1.0)*(2.05) + 0.33
= 0.83
Selanjutnya, kita perlu menghitung P = 1.0/(1.0 + exp(-Z)). Di sini, fungsi exp () adalah bilangan Euler.
P = 1.0/(1.0 + exp(-0.83)
= 0.6963
Nilai P dapat diartikan sebagai probabilitas kelas tersebut adalah 1. Jika P <0,5 maka prediksinya adalah kelas = 0, sedangkan prediksi (P> = 0,5) adalah kelas = 1.
Untuk menentukan nilai bobot dan bias, kita harus mendapatkan sekumpulan data latih yang memiliki nilai prediksi masukan yang diketahui dan nilai label kelas yang benar. Setelah itu, kita bisa menggunakan algoritma, umumnya Gradient Descent, untuk mencari nilai bobot dan bias.
Contoh implementasi model LR
Untuk model LR ini, kita akan menggunakan kumpulan data berikut -
1.0, 2.0, 0
3.0, 4.0, 0
5.0, 2.0, 0
6.0, 3.0, 0
8.0, 1.0, 0
9.0, 2.0, 0
1.0, 4.0, 1
2.0, 5.0, 1
4.0, 6.0, 1
6.0, 5.0, 1
7.0, 3.0, 1
8.0, 5.0, 1
Untuk memulai implementasi model LR ini di CNTK, pertama-tama kita perlu mengimpor paket berikut -
import numpy as np
import cntk as C
Program ini disusun dengan fungsi main () sebagai berikut -
def main():
print("Using CNTK version = " + str(C.__version__) + "\n")
Sekarang, kita perlu memuat data pelatihan ke dalam memori sebagai berikut -
data_file = ".\\dataLRmodel.txt"
print("Loading data from " + data_file + "\n")
features_mat = np.loadtxt(data_file, dtype=np.float32, delimiter=",", skiprows=0, usecols=[0,1])
labels_mat = np.loadtxt(data_file, dtype=np.float32, delimiter=",", skiprows=0, usecols=[2], ndmin=2)
Sekarang, kita akan membuat program pelatihan yang membuat model regresi logistik yang kompatibel dengan data pelatihan -
features_dim = 2
labels_dim = 1
X = C.ops.input_variable(features_dim, np.float32)
y = C.input_variable(labels_dim, np.float32)
W = C.parameter(shape=(features_dim, 1)) # trainable cntk.Parameter
b = C.parameter(shape=(labels_dim))
z = C.times(X, W) + b
p = 1.0 / (1.0 + C.exp(-z))
model = p
Sekarang, kita perlu membuat Lerner dan pelatih sebagai berikut -
ce_error = C.binary_cross_entropy(model, y) # CE a bit more principled for LR
fixed_lr = 0.010
learner = C.sgd(model.parameters, fixed_lr)
trainer = C.Trainer(model, (ce_error), [learner])
max_iterations = 4000
Pelatihan Model LR
Setelah kita membuat model LR, selanjutnya sekarang saatnya untuk memulai proses pelatihan -
np.random.seed(4)
N = len(features_mat)
for i in range(0, max_iterations):
row = np.random.choice(N,1) # pick a random row from training items
trainer.train_minibatch({ X: features_mat[row], y: labels_mat[row] })
if i % 1000 == 0 and i > 0:
mcee = trainer.previous_minibatch_loss_average
print(str(i) + " Cross-entropy error on curr item = %0.4f " % mcee)
Sekarang, dengan bantuan kode berikut, kita dapat mencetak bobot dan bias model -
np.set_printoptions(precision=4, suppress=True)
print("Model weights: ")
print(W.value)
print("Model bias:")
print(b.value)
print("")
if __name__ == "__main__":
main()
Melatih model Regresi Logistik - Contoh lengkap
import numpy as np
import cntk as C
def main():
print("Using CNTK version = " + str(C.__version__) + "\n")
data_file = ".\\dataLRmodel.txt" # provide the name and the location of data file
print("Loading data from " + data_file + "\n")
features_mat = np.loadtxt(data_file, dtype=np.float32, delimiter=",", skiprows=0, usecols=[0,1])
labels_mat = np.loadtxt(data_file, dtype=np.float32, delimiter=",", skiprows=0, usecols=[2], ndmin=2)
features_dim = 2
labels_dim = 1
X = C.ops.input_variable(features_dim, np.float32)
y = C.input_variable(labels_dim, np.float32)
W = C.parameter(shape=(features_dim, 1)) # trainable cntk.Parameter
b = C.parameter(shape=(labels_dim))
z = C.times(X, W) + b
p = 1.0 / (1.0 + C.exp(-z))
model = p
ce_error = C.binary_cross_entropy(model, y) # CE a bit more principled for LR
fixed_lr = 0.010
learner = C.sgd(model.parameters, fixed_lr)
trainer = C.Trainer(model, (ce_error), [learner])
max_iterations = 4000
np.random.seed(4)
N = len(features_mat)
for i in range(0, max_iterations):
row = np.random.choice(N,1) # pick a random row from training items
trainer.train_minibatch({ X: features_mat[row], y: labels_mat[row] })
if i % 1000 == 0 and i > 0:
mcee = trainer.previous_minibatch_loss_average
print(str(i) + " Cross-entropy error on curr item = %0.4f " % mcee)
np.set_printoptions(precision=4, suppress=True)
print("Model weights: ")
print(W.value)
print("Model bias:")
print(b.value)
if __name__ == "__main__":
main()
Keluaran
Using CNTK version = 2.7
1000 cross entropy error on curr item = 0.1941
2000 cross entropy error on curr item = 0.1746
3000 cross entropy error on curr item = 0.0563
Model weights:
[-0.2049]
[0.9666]]
Model bias:
[-2.2846]
Prediksi menggunakan Model LR terlatih
Setelah model LR dilatih, kita dapat menggunakannya untuk prediksi sebagai berikut -
Pertama-tama, program evaluasi kami mengimpor paket numpy dan memuat data pelatihan ke dalam matriks fitur dan matriks label kelas dengan cara yang sama seperti program pelatihan yang kami terapkan di atas -
import numpy as np
def main():
data_file = ".\\dataLRmodel.txt" # provide the name and the location of data file
features_mat = np.loadtxt(data_file, dtype=np.float32, delimiter=",",
skiprows=0, usecols=(0,1))
labels_mat = np.loadtxt(data_file, dtype=np.float32, delimiter=",",
skiprows=0, usecols=[2], ndmin=2)
Selanjutnya, saatnya untuk mengatur nilai bobot dan bias yang ditentukan oleh program pelatihan kita -
print("Setting weights and bias values \n")
weights = np.array([0.0925, 1.1722], dtype=np.float32)
bias = np.array([-4.5400], dtype=np.float32)
N = len(features_mat)
features_dim = 2
Selanjutnya program evaluasi kami akan menghitung probabilitas regresi logistik dengan berjalan melalui setiap item pelatihan sebagai berikut -
print("item pred_prob pred_label act_label result")
for i in range(0, N): # each item
x = features_mat[i]
z = 0.0
for j in range(0, features_dim):
z += x[j] * weights[j]
z += bias[0]
pred_prob = 1.0 / (1.0 + np.exp(-z))
pred_label = 0 if pred_prob < 0.5 else 1
act_label = labels_mat[i]
pred_str = ‘correct’ if np.absolute(pred_label - act_label) < 1.0e-5 \
else ‘WRONG’
print("%2d %0.4f %0.0f %0.0f %s" % \ (i, pred_prob, pred_label, act_label, pred_str))
Sekarang mari kita tunjukkan bagaimana melakukan prediksi -
x = np.array([9.5, 4.5], dtype=np.float32)
print("\nPredicting class for age, education = ")
print(x)
z = 0.0
for j in range(0, features_dim):
z += x[j] * weights[j]
z += bias[0]
p = 1.0 / (1.0 + np.exp(-z))
print("Predicted p = " + str(p))
if p < 0.5: print("Predicted class = 0")
else: print("Predicted class = 1")
Program evaluasi prediksi lengkap
import numpy as np
def main():
data_file = ".\\dataLRmodel.txt" # provide the name and the location of data file
features_mat = np.loadtxt(data_file, dtype=np.float32, delimiter=",",
skiprows=0, usecols=(0,1))
labels_mat = np.loadtxt(data_file, dtype=np.float32, delimiter=",",
skiprows=0, usecols=[2], ndmin=2)
print("Setting weights and bias values \n")
weights = np.array([0.0925, 1.1722], dtype=np.float32)
bias = np.array([-4.5400], dtype=np.float32)
N = len(features_mat)
features_dim = 2
print("item pred_prob pred_label act_label result")
for i in range(0, N): # each item
x = features_mat[i]
z = 0.0
for j in range(0, features_dim):
z += x[j] * weights[j]
z += bias[0]
pred_prob = 1.0 / (1.0 + np.exp(-z))
pred_label = 0 if pred_prob < 0.5 else 1
act_label = labels_mat[i]
pred_str = ‘correct’ if np.absolute(pred_label - act_label) < 1.0e-5 \
else ‘WRONG’
print("%2d %0.4f %0.0f %0.0f %s" % \ (i, pred_prob, pred_label, act_label, pred_str))
x = np.array([9.5, 4.5], dtype=np.float32)
print("\nPredicting class for age, education = ")
print(x)
z = 0.0
for j in range(0, features_dim):
z += x[j] * weights[j]
z += bias[0]
p = 1.0 / (1.0 + np.exp(-z))
print("Predicted p = " + str(p))
if p < 0.5: print("Predicted class = 0")
else: print("Predicted class = 1")
if __name__ == "__main__":
main()
Keluaran
Mengatur bobot dan nilai bias.
Item pred_prob pred_label act_label result
0 0.3640 0 0 correct
1 0.7254 1 0 WRONG
2 0.2019 0 0 correct
3 0.3562 0 0 correct
4 0.0493 0 0 correct
5 0.1005 0 0 correct
6 0.7892 1 1 correct
7 0.8564 1 1 correct
8 0.9654 1 1 correct
9 0.7587 1 1 correct
10 0.3040 0 1 WRONG
11 0.7129 1 1 correct
Predicting class for age, education =
[9.5 4.5]
Predicting p = 0.526487952
Predicting class = 1