การติดตามการทำนาย: การบันทึกข้อมูลขาเข้าและขาออก
ผู้เรียนจะเพิ่มการบันทึกการทำนายใน API อภิปรายการเปลี่ยนแปลงของข้อมูลและความล้าสมัยของแบบจำลอง และร่างตัวกระตุ้นการฝึกใหม่กับไปป์ไลน์การนำไปใช้งาน
การติดตามการทำนาย: การบันทึกข้อมูลขาเข้าและขาออก เป็นบทเรียน Machine Learning Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Machine Learning Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องติดตามโมเดลที่นำไปใช้งานจริง
โมเดลที่ทำงานได้ยอดเยี่ยมเมื่อนำไปใช้งานจริงอาจเสื่อมประสิทธิภาพลงอย่างเงียบ ๆ เมื่อโลกจริงเปลี่ยนแปลง พฤติกรรมของลูกค้าเปลี่ยนไป หมวดหมู่ผลิตภัณฑ์ใหม่ ๆ ปรากฏขึ้น เซนเซอร์เกิดการคลาดเคลื่อน และสภาวะเศรษฐกิจเปลี่ยนแปลง ล้วนทำให้การกระจายตัวของข้อมูลนำเข้าแตกต่างจากข้อมูลฝึกสอน หากไม่มีการตรวจสอบ คุณอาจพบว่าโมเดลทำงานล้มเหลวก็ต่อเมื่อผู้ใช้ร้องเรียนหรือค่าชี้วัดทางธุรกิจลดลง การตรวจสอบการทำนายช่วยตรวจจับการเสื่อมประสิทธิภาพได้ตั้งแต่เนิ่น ๆ ก่อนที่จะส่งผลกระทบต่อผู้ใช้
สิ่งที่ควรบันทึก: W สามประการ
เหตุการณ์การทำนายทุกครั้งควรบันทึกข้อมูลต่อไปนี้: When (เวลาประทับ), What (คุณลักษณะข้อมูลนำเข้าและผลลัพธ์/การทำนาย/ความน่าจะเป็นของโมเดล) และหากเป็นไปได้ควรบันทึก Whether (ป้ายกำกับค่าจริงที่เกิดขึ้นภายหลัง เมื่อมีข้อมูลพร้อมใช้งาน) คุณลักษณะข้อมูลนำเข้าจำเป็นต่อการตรวจจับการเลื่อนของข้อมูล ผลลัพธ์ช่วยให้ตรวจสอบความมั่นใจได้ และค่าจริงช่วยให้ตรวจสอบความแม่นยำเมื่อเวลาผ่านไปได้
การเพิ่มการบันทึกลงในปลายทาง FastAPI
ขยายเส้นทางการทำนายของ FastAPI เพื่อบันทึกคำขอแต่ละรายการลงในไฟล์ JSONL ที่มีโครงสร้าง (JSON Lines — ออบเจ็กต์ JSON หนึ่งรายการต่อหนึ่งบรรทัด) JSONL เหมาะสำหรับการเพิ่มข้อมูลต่อท้าย แยกวิเคราะห์ได้ง่าย และทำงานร่วมกับเครื่องมืออย่างแพนดาส, Spark และบริการรวบรวมบันทึกบนคลาวด์ได้เป็นอย่างดี บันทึกแต่ละบรรทัดคือเหตุการณ์การทำนายหนึ่งรายการ
import json
from datetime import datetime
from fastapi import FastAPI
from pydantic import BaseModel
import numpy as np
app = FastAPI()
LOG_FILE = '/tmp/prediction_log.jsonl'
def log_prediction(features: dict, prediction: int, confidence: float):
entry = {
'timestamp': datetime.utcnow().isoformat(),
'features': features,
'predicted_class': prediction,
'confidence': confidence
}
with open(LOG_FILE, 'a') as f:
f.write(json.dumps(entry) + '\n')
# Call inside the predict route:
# log_prediction(features.dict(), pred, confidence)
print('Logging enabled — entries written to', LOG_FILE)การจำลองและการอ่านบันทึก
หลังจากสะสมการทำนายแล้ว ให้อ่านไฟล์ JSONL ลงใน DataFrame ของแพนดาสเพื่อวิเคราะห์ แต่ละแถวคือเหตุการณ์การทำนายหนึ่งรายการ คุณสามารถคำนวณสถิติในช่วงเวลาใดก็ได้ เช่น ค่าเฉลี่ยความมั่นใจแบบเลื่อน การเปลี่ยนแปลงการกระจายของคุณลักษณะ และความถี่ของคลาสที่ทำนาย
import json
import pandas as pd
from datetime import datetime
import random
# Simulate log entries
LOG_FILE = '/tmp/prediction_log.jsonl'
with open(LOG_FILE, 'w') as f:
for i in range(100):
entry = {
'timestamp': datetime.utcnow().isoformat(),
'features': {'sepal_length': round(4.5 + random.gauss(1, 0.5), 2),
'sepal_width': round(3.0 + random.gauss(0, 0.3), 2),
'petal_length': round(1.0 + random.gauss(2, 1), 2),
'petal_width': round(0.2 + random.gauss(0.5, 0.2), 2)},
'predicted_class': random.choice([0, 1, 2]),
'confidence': round(random.uniform(0.6, 1.0), 4)
}
f.write(json.dumps(entry) + '\n')
# Read back as DataFrame
rows = [json.loads(line) for line in open(LOG_FILE)]
df = pd.json_normalize(rows)
print(df.shape)
print(df[['confidence', 'predicted_class']].describe())การตรวจสอบความมั่นใจเมื่อเวลาผ่านไป
พล็อตค่าเฉลี่ยความมั่นใจแบบเลื่อนตามเวลา แนวโน้มขาลงเป็นสัญญาณว่าโมเดลมีความมั่นใจในการทำนายน้อยลง ซึ่งเป็นสัญญาณเตือนล่วงหน้าแบบคลาสสิกของการเลื่อนของข้อมูล กำหนดเกณฑ์ เช่น ความมั่นใจแบบเลื่อนต่ำกว่า 0.7 แล้วเรียกใช้การแจ้งเตือน วิธีนี้ช่วยเตือนคุณได้ก่อนที่ความแม่นยำจะลดลงจริง
import pandas as pd
import matplotlib.pyplot as plt
import json
df = pd.json_normalize([json.loads(l) for l in open('/tmp/prediction_log.jsonl')])
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.sort_values('timestamp').reset_index(drop=True)
# Rolling window of 20 predictions
df['rolling_confidence'] = df['confidence'].rolling(20).mean()
plt.figure(figsize=(10, 4))
plt.plot(df.index, df['confidence'], alpha=0.3, label='Per-prediction')
plt.plot(df.index, df['rolling_confidence'], linewidth=2, label='Rolling mean (n=20)')
plt.axhline(0.7, color='red', linestyle='--', label='Alert threshold')
plt.xlabel('Prediction number')
plt.ylabel('Confidence')
plt.title('Prediction Confidence Over Time')
plt.legend()
plt.show()การตรวจจับการเปลี่ยนแปลงการกระจายของคุณลักษณะ
เปรียบเทียบการกระจายของคุณลักษณะข้อมูลนำเข้าแต่ละรายการในการทำนายล่าสุดกับการกระจายของข้อมูลฝึกสอน ดัชนีเสถียรภาพของประชากร (Population Stability Index หรือ PSI) เป็นค่าชี้วัดที่ใช้กันทั่วไป: PSI ต่ำกว่า 0.1 หมายถึงไม่มีการเปลี่ยนแปลงที่มีนัยสำคัญ, 0.1–0.2 หมายถึงการเลื่อนในระดับปานกลาง และมากกว่า 0.2 หมายถึงการเลื่อนอย่างรุนแรงที่จำเป็นต้องฝึกสอนใหม่ หรืออาจใช้การทดสอบ Kolmogorov-Smirnovเพื่อตรวจสอบว่าตัวอย่างสองชุดมาจากการกระจายเดียวกันหรือไม่
import numpy as np
from scipy import stats
import pandas as pd
import json
df = pd.json_normalize([json.loads(l) for l in open('/tmp/prediction_log.jsonl')])
# Simulated training distribution for sepal_length
train_sepal = np.random.normal(5.8, 0.8, 500) # reference
recent_sepal = df['features.sepal_length'].values
# KS test: tests if two samples come from same distribution
stat, p_value = stats.ks_2samp(train_sepal, recent_sepal)
print(f'KS statistic: {stat:.4f} p-value: {p_value:.4f}')
if p_value < 0.05:
print('WARNING: sepal_length distribution has drifted!')
else:
print('No significant drift detected in sepal_length')การตรวจสอบความถี่ของคลาสที่ทำนาย
พล็อตความถี่แบบเลื่อนของคลาสที่ทำนายแต่ละคลาส หากในช่วงประเมินระหว่างการฝึกสอนมีการทำนายคลาส 0 อยู่ 60% แต่ปัจจุบันทำนายเพียง 10% แสดงว่าข้อมูลนำเข้าบางส่วนเกิดการเปลี่ยนแปลง การเปลี่ยนแปลงการกระจายของคลาสมักตรวจจับได้ง่ายกว่าการเปลี่ยนแปลงเล็กน้อยของการกระจายคุณลักษณะ และใช้เป็นการแจ้งเตือนเบื้องต้นอย่างรวดเร็วได้
import pandas as pd
import json
df = pd.json_normalize([json.loads(l) for l in open('/tmp/prediction_log.jsonl')])
# Compute rolling class frequencies in windows of 20
window = 20
rolling_freq = pd.get_dummies(df['predicted_class']).rolling(window).mean()
rolling_freq.columns = [f'class_{c}' for c in rolling_freq.columns]
print('Recent class frequencies (last 20 predictions):')
print(rolling_freq.tail(1).to_string())
print('\nTraining class frequency (expected):')
print('class_0: 0.33 class_1: 0.33 class_2: 0.33')การบันทึกแบบมีโครงสร้างสำหรับระบบใช้งานจริง
ในระบบใช้งานจริง ให้เขียนบันทึกลงในระบบบันทึกแบบมีโครงสร้างแทนไฟล์ธรรมดา ตัวเลือกต่าง ๆ ได้แก่ โมดูลการบันทึกของ Python พร้อมตัวจัดรูปแบบ JSON, บริการบันทึกบนคลาวด์ (AWS CloudWatch, GCP Cloud Logging, Datadog) หรือฐานข้อมูล บันทึกแบบมีโครงสร้างสามารถสืบค้นได้ ปรับขนาดได้ และเชื่อมต่อกับแดชบอร์ดอย่าง Grafana เพื่อการตรวจสอบแบบเรียลไทม์
import logging
import json
from datetime import datetime
# Configure structured JSON logging
class JSONFormatter(logging.Formatter):
def format(self, record):
log_data = {
'time': datetime.utcnow().isoformat(),
'level': record.levelname,
'message': record.getMessage()
}
if hasattr(record, 'prediction_data'):
log_data.update(record.prediction_data)
return json.dumps(log_data)
logger = logging.getLogger('ml_predictor')
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logger.addHandler(handler)
logger.setLevel(logging.INFO)
# Usage in prediction route:
extra = {'prediction_data': {'features': {'x': 1.5}, 'pred': 0, 'conf': 0.95}}
logger.info('prediction', extra=extra)การเลื่อนของข้อมูลกับการเลื่อนของแนวคิด
มีรูปแบบความล้มเหลวที่แตกต่างกันอยู่สองรูปแบบ: การเลื่อนของข้อมูล — การกระจายของคุณลักษณะข้อมูลนำเข้าเปลี่ยนแปลงไป (เช่น เซนเซอร์ได้รับการปรับเทียบใหม่ หรือมีกลุ่มประชากรลูกค้าใหม่เกิดขึ้น) การเลื่อนของแนวคิด — ความสัมพันธ์ระหว่างข้อมูลนำเข้ากับเป้าหมายเปลี่ยนแปลงไป (เช่น ความหมายของคำว่า 'การฉ้อโกง' เปลี่ยนไปเมื่อผู้ฉ้อโกงปรับตัว) บางครั้งการเลื่อนของข้อมูลจัดการได้ด้วยการฝึกสอนใหม่จากข้อมูลล่าสุด ส่วนการเลื่อนของแนวคิดจำเป็นต้องทบทวนคุณลักษณะหรือแนวทางการสร้างโมเดลใหม่
ตัวกระตุ้นการฝึกสอนใหม่
กำหนดตัวกระตุ้นการฝึกสอนใหม่ที่ชัดเจนก่อนนำไปใช้งาน ตัวกระตุ้นที่พบบ่อย ได้แก่ ตามกำหนดเวลา (ฝึกสอนใหม่ทุก 30 วันโดยไม่คำนึงถึงเงื่อนไขอื่น), ตามประสิทธิภาพ (ฝึกสอนใหม่หาก AUC บนชุดข้อมูลสำรองที่มีป้ายกำกับลดต่ำกว่าเกณฑ์) หรือตามการเลื่อน (ฝึกสอนใหม่เมื่อ PSI ของคุณลักษณะสำคัญใด ๆ สูงเกิน 0.2) การทำให้ตัวกระตุ้นและกระบวนการฝึกสอนใหม่ทำงานโดยอัตโนมัติช่วยป้องกันไม่ให้โมเดลเสื่อมประสิทธิภาพลงโดยไม่มีใครสังเกต
from datetime import datetime, timedelta
class RetrainingPolicy:
def __init__(self, last_trained: datetime, max_age_days=30,
min_auc=0.85, max_drift_psi=0.2):
self.last_trained = last_trained
self.max_age_days = max_age_days
self.min_auc = min_auc
self.max_drift_psi = max_drift_psi
def should_retrain(self, current_auc=None, max_psi=None):
age = (datetime.utcnow() - self.last_trained).days
if age >= self.max_age_days:
return True, f'Model is {age} days old (max {self.max_age_days})'
if current_auc and current_auc < self.min_auc:
return True, f'AUC {current_auc:.3f} below threshold {self.min_auc}'
if max_psi and max_psi > self.max_drift_psi:
return True, f'PSI {max_psi:.3f} above threshold {self.max_drift_psi}'
return False, 'No trigger met — model healthy'
policy = RetrainingPolicy(last_trained=datetime.utcnow() - timedelta(days=35))
print(policy.should_retrain(current_auc=0.90))ภาพร่างแดชบอร์ดการตรวจสอบ
แดชบอร์ดตรวจสอบแมชชีนเลิร์นนิงในระบบใช้งานจริงโดยทั่วไปจะแสดง: ความมั่นใจในการทำนายแบบเลื่อนตามเวลา, การกระจายของคลาสตามเวลา, ฮิสโตแกรมการกระจายของคุณลักษณะที่เปรียบเทียบข้อมูลฝึกสอนกับการทำนายล่าสุด และเมื่อมีป้ายกำกับพร้อมใช้งาน จะแสดงความแม่นยำหรือ AUC แบบเลื่อนด้วย เครื่องมืออย่าง Grafana + Prometheus, Evidently AI หรือ WhyLogs มีองค์ประกอบสำเร็จรูปสำหรับการตรวจสอบแมชชีนเลิร์นนิง โดยไม่ต้องสร้างทุกอย่างตั้งแต่ต้น
# Evidently AI example (pip install evidently)
from evidently.report import Report
from evidently.metric_preset import DataDriftPreset
import pandas as pd
import numpy as np
# Reference: training feature distributions
reference = pd.DataFrame({
'sepal_length': np.random.normal(5.8, 0.8, 300),
'petal_length': np.random.normal(3.7, 1.7, 300)
})
# Current: recent predictions features
current = pd.DataFrame({
'sepal_length': np.random.normal(6.5, 1.2, 100), # drifted!
'petal_length': np.random.normal(3.7, 1.7, 100)
})
report = Report(metrics=[DataDriftPreset()])
report.run(reference_data=reference, current_data=current)
report.save_html('/tmp/drift_report.html')
print('Drift report saved to /tmp/drift_report.html')ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับการตรวจสอบการทำนายและการบันทึกจากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า: ควรบันทึกเหตุการณ์การทำนายทุกครั้งพร้อมเวลาประทับ คุณลักษณะข้อมูลนำเข้า คลาสที่ทำนาย และความมั่นใจ เพื่อให้ตรวจจับการเลื่อนได้, ควรตรวจสอบความมั่นใจและการกระจายของคุณลักษณะแบบเลื่อน เพื่อจับสัญญาณการเสื่อมประสิทธิภาพก่อนที่จะส่งผลต่อผู้ใช้ และ ควรกำหนดตัวกระตุ้นการฝึกสอนใหม่โดยอัตโนมัติ (ตามกำหนดเวลา ตามเกณฑ์ประสิทธิภาพ หรือตามเกณฑ์การเลื่อน) เพื่อรักษาสุขภาพของโมเดลในระบบใช้งานจริง บทนี้เป็นบทสุดท้ายของหลักสูตรพื้นฐานการคงอยู่และการนำโมเดลไปใช้งาน
เรียนรู้ Python ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “การติดตามการทำนาย: การบันทึกข้อมูลขาเข้าและขาออก” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การติดตามการทำนาย: การบันทึกข้อมูลขาเข้าและขาออก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Machine Learning Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การติดตามการทำนาย: การบันทึกข้อมูลขาเข้าและขาออก”
ผู้เรียนจะเพิ่มการบันทึกการทำนายใน API อภิปรายการเปลี่ยนแปลงของข้อมูลและความล้าสมัยของแบบจำลอง และร่างตัวกระตุ้นการฝึกใหม่กับไปป์ไลน์การนำไปใช้งาน คุณปฏิบัติ Machine Learning Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Machine Learning Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Machine Learning Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การติดตามการทำนาย: การบันทึกข้อมูลขาเข้าและขาออก” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Machine Learning Academy นี้ได้ไหม
ได้ บทเรียน Machine Learning Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การบันทึกแบบจำลองด้วย joblib และ pickle
- การจัดการเวอร์ชันแบบจำลอง: เหตุใดชื่อไฟล์และข้อมูลกำกับจึงสำคัญ
- การให้บริการการทำนายด้วยปลายทาง FastAPI
- การติดตามการทำนาย: การบันทึกข้อมูลขาเข้าและขาออก