CNTK - แบบจำลองการถดถอย
ในที่นี้เราจะศึกษาเกี่ยวกับการวัดประสิทธิภาพเกี่ยวกับแบบจำลองการถดถอย
พื้นฐานของการตรวจสอบความถูกต้องของแบบจำลองการถดถอย
ดังที่เราทราบดีว่าแบบจำลองการถดถอยนั้นแตกต่างจากแบบจำลองการจำแนกประเภทในแง่ที่ว่าไม่มีการวัดความถูกหรือผิดแบบไบนารีสำหรับกลุ่มตัวอย่างของแต่ละบุคคล ในแบบจำลองการถดถอยเราต้องการวัดว่าการคาดคะเนมีค่าใกล้เคียงกับค่าจริงเพียงใด ยิ่งค่าการทำนายใกล้เคียงกับผลลัพธ์ที่คาดหวังมากเท่าใดโมเดลก็จะทำงานได้ดีขึ้นเท่านั้น
ที่นี่เราจะวัดประสิทธิภาพของ NN ที่ใช้สำหรับการถดถอยโดยใช้ฟังก์ชันอัตราความผิดพลาดที่แตกต่างกัน
กำลังคำนวณขอบข้อผิดพลาด
ดังที่กล่าวไว้ก่อนหน้านี้ในขณะที่ตรวจสอบความถูกต้องของแบบจำลองการถดถอยเราไม่สามารถบอกได้ว่าการคาดการณ์ถูกหรือผิด เราต้องการให้การคาดการณ์ของเราใกล้เคียงกับมูลค่าที่แท้จริงมากที่สุด แต่ข้อผิดพลาดเล็กน้อยเป็นที่ยอมรับได้ที่นี่
สูตรคำนวณระยะขอบข้อผิดพลาดมีดังนี้ -
ที่นี่
Predicted value = ระบุ y ด้วยหมวก
Real value = ทำนายโดย y
ขั้นแรกเราต้องคำนวณระยะห่างระหว่างค่าที่คาดการณ์และมูลค่าจริง จากนั้นเพื่อให้ได้อัตราความผิดพลาดโดยรวมเราต้องรวมระยะทางกำลังสองเหล่านี้และคำนวณค่าเฉลี่ย นี้เรียกว่าmean squared ฟังก์ชันข้อผิดพลาด
แต่ถ้าเราต้องการตัวเลขประสิทธิภาพที่แสดงความคลาดเคลื่อนเราจำเป็นต้องมีสูตรที่แสดงถึงข้อผิดพลาดที่แน่นอน สูตรสำหรับmean absolute ฟังก์ชันข้อผิดพลาดมีดังนี้ -
สูตรข้างต้นใช้ระยะห่างสัมบูรณ์ระหว่างค่าที่คาดการณ์และมูลค่าจริง
ใช้ CNTK เพื่อวัดประสิทธิภาพการถดถอย
ที่นี่เราจะดูวิธีใช้เมตริกต่างๆซึ่งเราได้พูดคุยร่วมกับ CNTK เราจะใช้แบบจำลองการถดถอยซึ่งทำนายไมล์ต่อแกลลอนสำหรับรถยนต์โดยใช้ขั้นตอนที่ระบุด้านล่าง
ขั้นตอนการดำเนินการ
Step 1 - ขั้นแรกเราต้องนำเข้าส่วนประกอบที่จำเป็นจาก cntk แพคเกจดังนี้ -
from cntk import default_option, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import relu
Step 2 - ต่อไปเราต้องกำหนดฟังก์ชันการเปิดใช้งานเริ่มต้นโดยใช้ไฟล์ default_optionsฟังก์ชั่น. จากนั้นสร้างชุดเลเยอร์ตามลำดับใหม่และจัดเตรียมเลเยอร์หนาแน่นสองชั้นพร้อมเซลล์ประสาท 64 เซลล์ จากนั้นเพิ่มเลเยอร์ Dense เพิ่มเติม (ซึ่งจะทำหน้าที่เป็นเลเยอร์เอาต์พุต) ให้กับชุดเลเยอร์ลำดับและให้ 1 เซลล์ประสาทโดยไม่มีการกระตุ้นดังนี้ -
with default_options(activation=relu):
model = Sequential([Dense(64),Dense(64),Dense(1,activation=None)])
Step 3- เมื่อสร้างเครือข่ายแล้วเราจำเป็นต้องสร้างคุณสมบัติการป้อนข้อมูล เราต้องตรวจสอบให้แน่ใจว่ามันมีรูปร่างเหมือนกับคุณสมบัติที่เรากำลังจะใช้สำหรับการฝึกอบรม
features = input_variable(X.shape[1])
Step 4 - ตอนนี้เราต้องสร้างใหม่ input_variable ที่มีขนาด 1 จะใช้เพื่อเก็บค่าที่คาดไว้สำหรับ NN
target = input_variable(1)
z = model(features)
ตอนนี้เราจำเป็นต้องฝึกโมเดลและเพื่อที่จะทำเช่นนั้นเราจะแยกชุดข้อมูลและดำเนินการก่อนการประมวลผลโดยใช้ขั้นตอนการใช้งานต่อไปนี้ -
Step 5− ขั้นแรกให้นำเข้า StandardScaler จาก sklearn.preprocessing เพื่อรับค่าระหว่าง -1 ถึง +1 สิ่งนี้จะช่วยเราในการป้องกันปัญหาการไล่ระดับสีใน NN
from sklearn.preprocessing import StandardScalar
Step 6 - จากนั้นนำเข้า train_test_split จาก sklearn.model_selection ดังต่อไปนี้
from sklearn.model_selection import train_test_split
Step 7 - วางไฟล์ mpg คอลัมน์จากชุดข้อมูลโดยใช้ dropวิธี. ในที่สุดแยกชุดข้อมูลออกเป็นชุดการฝึกอบรมและการตรวจสอบความถูกต้องโดยใช้train_test_split ฟังก์ชันดังต่อไปนี้ -
x = df_cars.drop(columns=[‘mpg’]).values.astype(np.float32)
y=df_cars.iloc[: , 0].values.reshape(-1, 1).astype(np.float32)
scaler = StandardScaler()
X = scaler.fit_transform(x)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
Step 8 - ตอนนี้เราจำเป็นต้องสร้าง input_variable อื่นที่มีขนาด 1 ซึ่งจะใช้เพื่อเก็บค่าที่คาดไว้สำหรับ NN
target = input_variable(1)
z = model(features)
เราได้แยกและประมวลผลข้อมูลล่วงหน้าแล้วตอนนี้เราต้องฝึก NN เช่นเดียวกับในส่วนก่อนหน้าขณะสร้างแบบจำลองการถดถอยเราจำเป็นต้องกำหนดชุดค่าผสมของการสูญเสียและmetric ฟังก์ชั่นในการฝึกโมเดล
import cntk
def absolute_error(output, target):
return cntk.ops.reduce_mean(cntk.ops.abs(output – target))
@ cntk.Function
def criterion_factory(output, target):
loss = squared_error(output, target)
metric = absolute_error(output, target)
return loss, metric
ตอนนี้เรามาดูวิธีใช้แบบจำลองที่ได้รับการฝึกฝน สำหรับแบบจำลองของเราเราจะใช้เกณฑ์การผลิตเป็นเกณฑ์การสูญเสียและเมตริกรวมกัน
from cntk.losses import squared_error
from cntk.learners import sgd
from cntk.logging import ProgressPrinter
progress_printer = ProgressPrinter(0)
loss = criterion_factory (z, target)
learner = sgd(z.parameters, 0.001)
training_summary=loss.train((x_train,y_train),parameter_learners=[learner],callbacks=[progress_printer],minibatch_size=16,max_epochs=10)
ตัวอย่างการใช้งานที่สมบูรณ์
from cntk import default_option, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import relu
with default_options(activation=relu):
model = Sequential([Dense(64),Dense(64),Dense(1,activation=None)])
features = input_variable(X.shape[1])
target = input_variable(1)
z = model(features)
from sklearn.preprocessing import StandardScalar
from sklearn.model_selection import train_test_split
x = df_cars.drop(columns=[‘mpg’]).values.astype(np.float32)
y=df_cars.iloc[: , 0].values.reshape(-1, 1).astype(np.float32)
scaler = StandardScaler()
X = scaler.fit_transform(x)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
target = input_variable(1)
z = model(features)
import cntk
def absolute_error(output, target):
return cntk.ops.reduce_mean(cntk.ops.abs(output – target))
@ cntk.Function
def criterion_factory(output, target):
loss = squared_error(output, target)
metric = absolute_error(output, target)
return loss, metric
from cntk.losses import squared_error
from cntk.learners import sgd
from cntk.logging import ProgressPrinter
progress_printer = ProgressPrinter(0)
loss = criterion_factory (z, target)
learner = sgd(z.parameters, 0.001)
training_summary=loss.train((x_train,y_train),parameter_learners=[learner],callbacks=[progress_printer],minibatch_size=16,max_epochs=10)
เอาต์พุต
-------------------------------------------------------------------
average since average since examples
loss last metric last
------------------------------------------------------
Learning rate per minibatch: 0.001
690 690 24.9 24.9 16
654 636 24.1 23.7 48
[………]
ในการตรวจสอบความถูกต้องของแบบจำลองการถดถอยของเราเราจำเป็นต้องตรวจสอบให้แน่ใจว่าแบบจำลองจัดการข้อมูลใหม่เช่นเดียวกับที่ทำกับข้อมูลการฝึกอบรม สำหรับสิ่งนี้เราต้องเรียกใช้ไฟล์test วิธีการ loss และ metric รวมกับข้อมูลการทดสอบดังนี้ -
loss.test([X_test, y_test])
เอาต์พุต
{'metric': 1.89679785619, 'samples': 79}