Machine Learning Academy · บทเรียน

การติดตามการทำนาย: การบันทึกข้อมูลขาเข้าและขาออก

ผู้เรียนจะเพิ่มการบันทึกการทำนายใน API อภิปรายการเปลี่ยนแปลงของข้อมูลและความล้าสมัยของแบบจำลอง และร่างตัวกระตุ้นการฝึกใหม่กับไปป์ไลน์การนำไปใช้งาน

บทเรียน 4 จาก 413 ขั้นตอน

การติดตามการทำนาย: การบันทึกข้อมูลขาเข้าและขาออก เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การบันทึกแบบจำลองด้วย joblib และ pickle
  2. การจัดการเวอร์ชันแบบจำลอง: เหตุใดชื่อไฟล์และข้อมูลกำกับจึงสำคัญ
  3. การให้บริการการทำนายด้วยปลายทาง FastAPI
  4. การติดตามการทำนาย: การบันทึกข้อมูลขาเข้าและขาออก
← กลับไปที่ Machine Learning Academy