CNTK - แบบจำลองการถดถอยโลจิสติก
บทนี้เกี่ยวข้องกับการสร้างแบบจำลองการถดถอยโลจิสติกใน CNTK
พื้นฐานของแบบจำลอง Logistic Regression
Logistic Regression หนึ่งในเทคนิค ML ที่ง่ายที่สุดเป็นเทคนิคโดยเฉพาะอย่างยิ่งสำหรับการจำแนกไบนารี กล่าวอีกนัยหนึ่งคือในการสร้างแบบจำลองการคาดการณ์ในสถานการณ์ที่ค่าของตัวแปรที่จะทำนายอาจเป็นค่าเชิงหมวดหมู่หนึ่งในสองค่า หนึ่งในตัวอย่างที่ง่ายที่สุดของ Logistic Regression คือการทำนายว่าบุคคลนั้นเป็นชายหรือหญิงโดยพิจารณาจากอายุเสียงเส้นผมและอื่น ๆ
ตัวอย่าง
มาทำความเข้าใจกับแนวคิดของ Logistic Regression ทางคณิตศาสตร์ด้วยความช่วยเหลือของตัวอย่างอื่น -
สมมติว่าเราต้องการทำนายความน่าเชื่อถือของการขอสินเชื่อ 0 หมายถึงปฏิเสธและ 1 หมายถึงอนุมัติตามผู้สมัครdebt , income และ credit rating. เราแสดงหนี้ด้วย X1 รายได้กับ X2 และอันดับเครดิตด้วย X3
ใน Logistic Regression เรากำหนดค่าน้ำหนักซึ่งแสดงโดย wสำหรับทุกคุณลักษณะและค่าอคติเดียวแสดงโดย b.
สมมติว่า
X1 = 3.0
X2 = -2.0
X3 = 1.0
และสมมติว่าเรากำหนดน้ำหนักและความลำเอียงดังนี้ -
W1 = 0.65, W2 = 1.75, W3 = 2.05 and b = 0.33
ตอนนี้สำหรับการทำนายคลาสเราจำเป็นต้องใช้สูตรต่อไปนี้ -
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
ต่อไปเราต้องคำนวณ P = 1.0/(1.0 + exp(-Z)). ในที่นี้ฟังก์ชัน exp () คือหมายเลขของออยเลอร์
P = 1.0/(1.0 + exp(-0.83)
= 0.6963
ค่า P สามารถตีความได้ว่าเป็นความน่าจะเป็นที่คลาสคือ 1 ถ้า P <0.5 การทำนายคือ class = 0 else การทำนาย (P> = 0.5) คือ class = 1
ในการกำหนดค่าของน้ำหนักและอคติเราต้องได้รับชุดข้อมูลการฝึกอบรมที่มีค่าตัวทำนายการป้อนข้อมูลที่ทราบและทราบค่าป้ายกำกับชั้นเรียนที่ถูกต้อง หลังจากนั้นเราสามารถใช้อัลกอริทึมโดยทั่วไปคือ Gradient Descent เพื่อค้นหาค่าของน้ำหนักและอคติ
ตัวอย่างการใช้งานโมเดล LR
สำหรับรุ่น LR นี้เราจะใช้ชุดข้อมูลต่อไปนี้ -
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
ในการเริ่มใช้งานโมเดล LR นี้ใน CNTK เราต้องนำเข้าแพ็คเกจต่อไปนี้ก่อน -
import numpy as np
import cntk as C
โปรแกรมมีโครงสร้างด้วยฟังก์ชัน main () ดังนี้ -
def main():
print("Using CNTK version = " + str(C.__version__) + "\n")
ตอนนี้เราต้องโหลดข้อมูลการฝึกอบรมลงในหน่วยความจำดังนี้ -
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)
ตอนนี้เราจะสร้างโปรแกรมการฝึกอบรมที่สร้างแบบจำลองการถดถอยโลจิสติกซึ่งเข้ากันได้กับข้อมูลการฝึกอบรม -
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
ตอนนี้เราต้องสร้าง Lerner และ trainer ดังนี้ -
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
การฝึกอบรมโมเดล LR
เมื่อเราสร้างแบบจำลอง LR แล้วต่อไปก็ถึงเวลาเริ่มกระบวนการฝึกอบรม -
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)
print("")
if __name__ == "__main__":
main()
การฝึกโมเดล Logistic Regression - ตัวอย่างที่สมบูรณ์
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()
เอาต์พุต
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]
การทำนายโดยใช้โมเดล LR ที่ได้รับการฝึกฝน
เมื่อโมเดล LR ได้รับการฝึกฝนแล้วเราสามารถใช้เพื่อการทำนายได้ดังนี้ -
ก่อนอื่นโปรแกรมการประเมินผลของเราจะนำเข้าแพ็กเกจ numpy และโหลดข้อมูลการฝึกอบรมลงในเมทริกซ์คุณลักษณะและเมทริกซ์ป้ายชื่อชั้นเรียนในลักษณะเดียวกับโปรแกรมการฝึกอบรมที่เรานำไปใช้ข้างต้น -
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")
โปรแกรมการประเมินผลการทำนายที่สมบูรณ์
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()
เอาต์พุต
การตั้งค่าน้ำหนักและค่าอคติ
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