การสร้างไปป์ไลน์แรกของคุณ: ตัวปรับมาตราส่วนและตัวจำแนก
ผู้เรียนจะเชื่อม StandardScaler และ LogisticRegression เข้ากับ Pipeline เรียกใช้ fit และ predict และยืนยันว่าตัวปรับมาตราส่วนถูกฝึกจากข้อมูลฝึกเท่านั้น
การสร้างไปป์ไลน์แรกของคุณ: ตัวปรับมาตราส่วนและตัวจำแนก เป็นบทเรียน Machine Learning Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Machine Learning Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน
Pipeline ของ scikit-learn คืออะไร
Pipeline เชื่อมขั้นตอนการประมวลผลหลายขั้นตอนให้เป็นออบเจ็กต์ตัวประมาณค่าเดียว ทุกขั้นตอนยกเว้นขั้นตอนสุดท้ายต้องรองรับ fit และ transform ส่วนขั้นตอนสุดท้ายต้องการเพียง fit และ predict เมื่อเรียก pipeline.fit(X, y) ระบบจะเรียกใช้ทุกขั้นตอนตามลำดับ และ pipeline.predict(X) จะส่งข้อมูลผ่านการแปลงทั้งหมดก่อนทำการจำแนก วิธีนี้กำจัดข้อผิดพลาดจากการจัดการขั้นตอนด้วยตนเองและป้องกันการรั่วไหลของข้อมูล
เหตุใดไปป์ไลน์จึงป้องกันการรั่วไหล
หากคุณฝึก StandardScaler ด้วยชุดข้อมูลทั้งหมด แล้วจึงแบ่งเป็นข้อมูลฝึกและข้อมูลทดสอบ scaler จะได้เห็นสถิติของชุดทดสอบ ซึ่งถือเป็นการรั่วไหลของข้อมูล ไปป์ไลน์แก้ปัญหานี้โดยอัตโนมัติ: เมื่อคุณส่งไปป์ไลน์ให้กับ cross_val_score หรือ GridSearchCV ไปป์ไลน์ทั้งหมด (รวมถึง scaler) จะถูกฝึกใหม่ตั้งแต่ต้นในแต่ละส่วนฝึก ดังนั้นส่วนทดสอบจะไม่มีอิทธิพลต่อพารามิเตอร์ของ scaler
การสร้างไปป์ไลน์แรกของคุณ
สร้าง Pipeline โดยส่งรายการทูเพิล (name, estimator) ชื่อเหล่านี้เป็นสตริงใด ๆ ที่คุณเลือกเอง และใช้สำหรับอ้างถึงขั้นตอนในภายหลัง (เช่น สำหรับพารามิเตอร์ในการค้นหาแบบกริด) ไปป์ไลน์แรกที่ใช้กันบ่อยที่สุดคือ scaler ตามด้วยตัวจำแนก
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
pipe = Pipeline([
('scaler', StandardScaler()),
('clf', LogisticRegression(C=1.0, max_iter=200))
])
print('Steps:', [name for name, _ in pipe.steps])
print('Named steps:', list(pipe.named_steps.keys()))การฝึกและการทำนาย
หลังจากสร้างแล้ว ให้ใช้ Pipeline เหมือนตัวประมาณค่า sklearn ใด ๆ: เรียก fit กับข้อมูลฝึก เรียก predict กับข้อมูลทดสอบ และเรียก score เพื่อหาความแม่นยำ ภายในนั้น fit จะเรียก fit_transform กับขั้นตอนระหว่างทางทั้งหมด และเรียก fit กับตัวประมาณค่าขั้นสุดท้าย
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
pipe = Pipeline([
('scaler', StandardScaler()),
('clf', LogisticRegression(max_iter=300))
])
pipe.fit(X_train, y_train)
print('Test accuracy:', pipe.score(X_test, y_test).round(4))
y_pred = pipe.predict(X_test)
print('Predictions[:5]:', y_pred[:5])ยืนยันว่า scaler ถูกฝึกด้วยข้อมูลฝึกเท่านั้น
หลังจากฝึก Pipeline ด้วยข้อมูลฝึกแล้ว คุณสามารถตรวจสอบพารามิเตอร์ที่ผ่านการฝึกของแต่ละขั้นตอนได้ scaler ภายในไปป์ไลน์จะมีแอตทริบิวต์ mean_ และ scale_ ซึ่งคำนวณจากชุดฝึกเท่านั้น ไม่ใช่จากชุดข้อมูลทั้งหมด นี่เป็นการยืนยันว่าไปป์ไลน์ทำงานได้ถูกต้อง
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import numpy as np
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression(max_iter=300))])
pipe.fit(X_train, y_train)
# Scaler mean from pipeline vs computed from X_train
print('Pipeline scaler mean[0]:', pipe.named_steps['sc'].mean_[0].round(4))
print('Direct train mean[0]: ', X_train[:, 0].mean().round(4))การเข้าถึงผลลัพธ์ระหว่างทาง
หากต้องการรับผลลัพธ์ที่ผ่านการแปลงจากขั้นตอนใดขั้นตอนหนึ่ง ให้ใช้ pipeline[:-1].transform(X) หรือเข้าถึงขั้นตอนแต่ละขั้นผ่าน pipeline.named_steps['step_name'] นอกจากนี้ คุณยังเรียก pipeline[:'step_name'] ด้วยรูปแบบการแบ่งส่วนของ Python เพื่อรับไปป์ไลน์ย่อยตั้งแต่ต้นจนถึงขั้นตอนนั้นได้ วิธีนี้มีประโยชน์สำหรับการแก้ไขข้อบกพร่องหรือตรวจสอบลักษณะของข้อมูลหลังการปรับสเกล
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression())])
pipe.fit(X, y)
# Get scaled output (all steps except the last)
X_scaled = pipe[:-1].transform(X)
print('After scaling — mean per feature:', X_scaled.mean(axis=0).round(4))
print('After scaling — std per feature:', X_scaled.std(axis=0).round(4))make_pipeline: ทางลัด
make_pipeline สร้าง Pipeline โดยไม่ต้องระบุชื่อขั้นตอนด้วยตนเอง แต่จะสร้างชื่อจากชื่อคลาสในรูปตัวพิมพ์เล็ก วิธีนี้สะดวกสำหรับการทดลองอย่างรวดเร็ว แต่สื่อความหมายได้น้อยกว่าในโค้ดที่ใช้งานจริง ซึ่งชื่อที่ระบุชัดเจนช่วยให้ระบุขั้นตอนได้ในสตริงพารามิเตอร์ของการค้นหาแบบกริด
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import MinMaxScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
import numpy as np
X, y = load_iris(return_X_y=True)
# Auto-names: 'minmaxscaler' and 'kneighborsclassifier'
pipe = make_pipeline(MinMaxScaler(), KNeighborsClassifier(n_neighbors=5))
print('Step names:', list(pipe.named_steps.keys()))
print('CV accuracy:', cross_val_score(pipe, X, y, cv=5).mean().round(4))ไปป์ไลน์ที่มีการทำนายความน่าจะเป็น
หากตัวประมาณค่าขั้นสุดท้ายรองรับ predict_proba Pipeline ก็จะเปิดให้ใช้สิ่งนี้ด้วย ทำให้คุณใช้ไปป์ไลน์กับฟังก์ชันใด ๆ ที่ต้องการผลลัพธ์เป็นความน่าจะเป็นได้ เช่น การให้คะแนน ROC-AUC เส้นโค้งการปรับเทียบ หรือการปรับค่าเกณฑ์ โดยไม่ต้องนำการเตรียมข้อมูลไปใช้ด้วยตนเองก่อนเรียกใช้แบบจำลอง
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression(max_iter=300))])
pipe.fit(X_train, y_train)
proba = pipe.predict_proba(X_test)[:, 1]
print('ROC-AUC:', roc_auc_score(y_test, proba).round(4))การตั้งค่าพารามิเตอร์หลังการสร้าง
คุณสามารถอัปเดตพารามิเตอร์ของขั้นตอนใด ๆ หลังจากสร้าง Pipeline แล้ว โดยใช้ set_params(step__param=value) และตัวคั่นเป็นขีดล่างสองตัว นี่เป็นรูปแบบเดียวกับที่ใช้ใน GridSearchCV มีประโยชน์เมื่อคุณต้องการทดลองการตั้งค่าต่าง ๆ โดยไม่ต้องสร้างไปป์ไลน์ทั้งหมดใหม่ตั้งแต่ต้น
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression())])
# Change C and max_iter after construction
pipe.set_params(lr__C=10.0, lr__max_iter=500)
print('C after set_params:', pipe.named_steps['lr'].C)การจัดเก็บและแบ่งปันไปป์ไลน์
Pipeline ที่ผ่านการฝึกแล้วเป็นออบเจ็กต์ Python เดียว ซึ่งสามารถทำให้เป็นอนุกรมด้วย pickle หรือ joblib การแบ่งปันไปป์ไลน์เป็นไฟล์เดียวทำให้มั่นใจได้ว่าจะใช้ขั้นตอนการเตรียมข้อมูลแบบเดียวกันทุกประการ พร้อมพารามิเตอร์ของ scaler แบบเดียวกันทุกประการในขณะทำนาย จึงกำจัดข้อผิดพลาดด้านความสอดคล้องระหว่างสภาพแวดล้อมการฝึกและการให้บริการ
import joblib
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression())])
pipe.fit(X, y)
# Save and reload
joblib.dump(pipe, '/tmp/iris_pipeline.pkl')
loaded_pipe = joblib.load('/tmp/iris_pipeline.pkl')
print('Predictions match:', (pipe.predict(X) == loaded_pipe.predict(X)).all())แนวทางปฏิบัติที่ดีสำหรับการตรวจสอบไขว้ด้วยไปป์ไลน์
ห่อ Pipeline ของคุณด้วย cross_val_score เสมอ แทนการวนซ้ำแต่ละส่วนด้วยตนเอง วิธีนี้ทำให้ scaler ถูกฝึกใหม่ในแต่ละส่วนฝึกและไม่แตะต้องส่วนตรวจสอบ จึงให้ค่าประมาณประสิทธิภาพในการใช้งานกับข้อมูลใหม่ที่ตรงตามความเป็นจริง
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.datasets import load_digits
from sklearn.model_selection import cross_val_score
import numpy as np
X, y = load_digits(return_X_y=True)
pipe = Pipeline([
('sc', StandardScaler()),
('svm', SVC(kernel='rbf', C=5.0, gamma='scale'))
])
scores = cross_val_score(pipe, X, y, cv=5, n_jobs=-1)
print(f'CV accuracy: {np.mean(scores):.4f} +/- {np.std(scores):.4f}')ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับ Pipeline ของ scikit-learn จากบทเรียนนี้
ทบทวนบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า Pipeline เชื่อมขั้นตอนต่าง ๆ ให้เป็นตัวประมาณค่าเดียว และป้องกันการรั่วไหลด้วยการฝึกแต่ละขั้นตอนเฉพาะข้อมูลฝึกที่ขั้นตอนนั้นได้รับ make_pipeline มอบทางลัดที่ตั้งชื่อโดยอัตโนมัติ ขณะที่ชื่อที่ระบุชัดเจนช่วยให้อ่านการค้นหาแบบกริดได้ง่ายขึ้น และ Pipeline ที่ผ่านการฝึกแล้วสามารถจัดเก็บและแบ่งปันด้วย pickle ได้ ในรูปสิ่งประดิษฐ์ไฟล์เดียวเพื่อให้การเตรียมข้อมูลขณะให้บริการมีความสอดคล้องกัน บทถัดไป เราจะเพิ่ม ColumnTransformer ภายใน Pipeline เพื่อจัดการข้อมูลตัวเลขและข้อมูลประเภทหมวดหมู่ที่อยู่ร่วมกัน
เรียนรู้ Python ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “การสร้างไปป์ไลน์แรกของคุณ: ตัวปรับมาตราส่วนและตัวจำแนก” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างไปป์ไลน์แรกของคุณ: ตัวปรับมาตราส่วนและตัวจำแนก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Machine Learning Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างไปป์ไลน์แรกของคุณ: ตัวปรับมาตราส่วนและตัวจำแนก”
ผู้เรียนจะเชื่อม StandardScaler และ LogisticRegression เข้ากับ Pipeline เรียกใช้ fit และ predict และยืนยันว่าตัวปรับมาตราส่วนถูกฝึกจากข้อมูลฝึกเท่านั้น คุณปฏิบัติ Machine Learning Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Machine Learning Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Machine Learning Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างไปป์ไลน์แรกของคุณ: ตัวปรับมาตราส่วนและตัวจำแนก” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Machine Learning Academy นี้ได้ไหม
ได้ บทเรียน Machine Learning Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้างไปป์ไลน์แรกของคุณ: ตัวปรับมาตราส่วนและตัวจำแนก
- ColumnTransformer ภายในไปป์ไลน์
- การตรวจสอบไขว้และค้นหาแบบกริดสำหรับไปป์ไลน์ทั้งหมด
- การบันทึกและโหลดไปป์ไลน์ด้วย joblib