คู่มือฉบับสมบูรณ์เกี่ยวกับเทคนิคการเลือกคุณลักษณะของ Scikit-learn เพื่อลดมิติข้อมูล ช่วยให้นักวิทยาศาสตร์ข้อมูลทั่วโลกสร้างแบบจำลองที่มีประสิทธิภาพและแข็งแกร่งยิ่งขึ้น
การเลือกคุณลักษณะใน Scikit-learn: เชี่ยวชาญการลดมิติข้อมูลสำหรับชุดข้อมูลทั่วโลก
ในจักรวาลข้อมูลที่ขยายตัวอย่างต่อเนื่อง ปริมาณคุณลักษณะที่มหาศาลอาจทำให้โมเดลการเรียนรู้ของเครื่องที่ซับซ้อนที่สุดทำงานหนักเกินไปได้ ปรากฏการณ์นี้มักถูกเรียกว่า "คำสาปของมิติข้อมูล" ซึ่งอาจนำไปสู่ค่าใช้จ่ายในการคำนวณที่สูงขึ้น ความแม่นยำของโมเดลลดลง และความสามารถในการตีความที่ลดลง โชคดีที่เทคนิคการเลือกคุณลักษณะและการลดมิติข้อมูลนำเสนอโซลูชันที่มีประสิทธิภาพ Scikit-learn ซึ่งเป็นรากฐานสำคัญของระบบนิเวศการเรียนรู้ของเครื่องของ Python มอบชุดเครื่องมือที่หลากหลายเพื่อรับมือกับความท้าทายเหล่านี้ได้อย่างมีประสิทธิภาพ ทำให้เป็นทรัพยากรที่ขาดไม่ได้สำหรับนักวิทยาศาสตร์ข้อมูลทั่วโลก
คู่มือฉบับสมบูรณ์นี้จะเจาะลึกความซับซ้อนของความสามารถในการเลือกคุณลักษณะของ Scikit-learn โดยเน้นที่การลดมิติข้อมูล เราจะสำรวจวิธีการต่างๆ หลักการพื้นฐาน การนำไปปฏิบัติจริงพร้อมตัวอย่างโค้ด และข้อควรพิจารณาสำหรับชุดข้อมูลทั่วโลกที่หลากหลาย เป้าหมายของเราคือการจัดเตรียมความรู้ให้กับคุณ ซึ่งเป็นผู้ชมทั่วโลกของเรา ทั้งนักปฏิบัติการข้อมูลที่กำลังใฝ่ฝันและผู้มีประสบการณ์ เพื่อให้สามารถตัดสินใจได้อย่างชาญฉลาดเกี่ยวกับการเลือกคุณลักษณะ ซึ่งนำไปสู่โมเดลการเรียนรู้ของเครื่องที่มีประสิทธิภาพ แม่นยำ และตีความได้ดียิ่งขึ้น
ทำความเข้าใจเกี่ยวกับการลดมิติข้อมูล
ก่อนที่เราจะเจาะลึกเครื่องมือเฉพาะของ Scikit-learn สิ่งสำคัญคือต้องทำความเข้าใจแนวคิดพื้นฐานของการลดมิติข้อมูล กระบวนการนี้เกี่ยวข้องกับการแปลงข้อมูลจากพื้นที่ที่มีมิติสูงไปสู่พื้นที่ที่มีมิติที่ต่ำกว่า โดยยังคงรักษาข้อมูลสำคัญไว้ให้มากที่สุดเท่าที่จะเป็นไปได้ ข้อดีมีมากมาย:
- ลดการเกิด Overfitting: คุณลักษณะที่น้อยลงหมายถึงโมเดลที่เรียบง่ายขึ้น ซึ่งมีโอกาสน้อยที่จะเรียนรู้สิ่งรบกวนในข้อมูลการฝึกอบรม
- เวลาในการฝึกอบรมที่เร็วขึ้น: โมเดลที่มีคุณลักษณะน้อยลงจะฝึกอบรมได้เร็วกว่าอย่างเห็นได้ชัด
- ความสามารถในการตีความโมเดลที่ดีขึ้น: การทำความเข้าใจความสัมพันธ์ระหว่างคุณลักษณะที่น้อยลงจะง่ายขึ้น
- ลดพื้นที่จัดเก็บ: มิติข้อมูลที่ต่ำกว่าต้องการหน่วยความจำน้อยลง
- การลดสัญญาณรบกวน: คุณลักษณะที่ไม่เกี่ยวข้องหรือซ้ำซ้อนสามารถถูกกำจัดออกไปได้ นำไปสู่ข้อมูลที่สะอาดขึ้น
การลดมิติข้อมูลสามารถแบ่งออกเป็นสองแนวทางหลักๆ ได้ดังนี้:
1. การเลือกคุณลักษณะ (Feature Selection)
แนวทางนี้เกี่ยวข้องกับการเลือกชุดย่อยของคุณลักษณะดั้งเดิมที่เกี่ยวข้องกับปัญหามากที่สุด คุณลักษณะดั้งเดิมยังคงอยู่ แต่จำนวนลดลง ลองนึกภาพเหมือนการระบุส่วนผสมที่สำคัญที่สุดสำหรับสูตรอาหารแล้วทิ้งส่วนที่เหลือไป
2. การสกัดคุณลักษณะ (Feature Extraction)
แนวทางนี้จะแปลงคุณลักษณะดั้งเดิมให้เป็นชุดคุณลักษณะใหม่ที่มีขนาดเล็กลง คุณลักษณะใหม่เหล่านี้เป็นการรวมกันหรือการฉายภาพของคุณลักษณะดั้งเดิม โดยมีเป้าหมายเพื่อจับความแปรปรวนหรือข้อมูลที่สำคัญที่สุดในข้อมูล นี่เปรียบได้กับการสร้างสารสกัดเข้มข้นจากส่วนผสมดั้งเดิม
Scikit-learn นำเสนอเครื่องมือที่มีประสิทธิภาพสำหรับทั้งสองแนวทางนี้ เราจะมุ่งเน้นไปที่เทคนิคที่ช่วยลดมิติข้อมูล ซึ่งมักจะผ่านการเลือกหรือการสกัดคุณลักษณะ
วิธีการเลือกคุณลักษณะใน Scikit-learn
Scikit-learn มีหลายวิธีในการดำเนินการเลือกคุณลักษณะ ซึ่งสามารถจัดกลุ่มได้เป็นสามประเภทหลัก:
1. วิธีการกรอง (Filter Methods)
วิธีการกรองประเมินความเกี่ยวข้องของคุณลักษณะตามคุณสมบัติภายในของมัน โดยไม่ขึ้นอยู่กับโมเดลการเรียนรู้ของเครื่องใดๆ โดยทั่วไปแล้วจะรวดเร็วและประหยัดค่าใช้จ่ายในการคำนวณ ทำให้เหมาะสำหรับการสำรวจข้อมูลเบื้องต้นหรือเมื่อต้องจัดการกับชุดข้อมูลขนาดใหญ่มาก เมตริกทั่วไป ได้แก่ สหสัมพันธ์ ข้อมูลร่วม และการทดสอบทางสถิติ
ก) การเลือกคุณลักษณะโดยใช้สหสัมพันธ์ (Correlation-based Feature Selection)
คุณลักษณะที่มีสหสัมพันธ์สูงกับตัวแปรเป้าหมายถือว่ามีความสำคัญ ในทางกลับกัน คุณลักษณะที่มีสหสัมพันธ์สูงซึ่งกันและกัน (ความสัมพันธ์เชิงเส้นร่วมหลายตัว) อาจซ้ำซ้อนและสามารถพิจารณาเพื่อลบออกได้ โมดูล feature_selection ของ Scikit-learn มีเครื่องมือช่วยในเรื่องนี้
ตัวอย่าง: เกณฑ์ความแปรปรวน (Variance Threshold)
คุณลักษณะที่มีความแปรปรวนต่ำมากอาจไม่มีพลังในการจำแนกมากนัก คลาส VarianceThreshold จะลบคุณลักษณะที่มีความแปรปรวนไม่ถึงเกณฑ์ที่กำหนด ซึ่งมีประโยชน์อย่างยิ่งสำหรับคุณลักษณะเชิงตัวเลข
from sklearn.feature_selection import VarianceThreshold
import numpy as np
X = [[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]]
selector = VarianceThreshold(threshold=0.0)
selector.fit_transform(X)
# Output: array([[2, 0, 3], [1, 4, 3], [1, 1, 3]])
ในตัวอย่างนี้ คุณลักษณะแรก (ทั้งหมดเป็นศูนย์) มีความแปรปรวนเป็นศูนย์และถูกลบออก นี่เป็นวิธีพื้นฐานแต่มีประสิทธิภาพในการกำจัดคุณลักษณะคงที่หรือเกือบคงที่ซึ่งไม่มีพลังในการทำนาย
ตัวอย่าง: สหสัมพันธ์กับตัวแปรเป้าหมาย (โดยใช้ Pandas และ SciPy)
แม้ว่า Scikit-learn จะไม่มีฟังก์ชันระดับสูงโดยตรงสำหรับสหสัมพันธ์กับตัวแปรเป้าหมายในทุกประเภทคุณลักษณะ แต่ก็เป็นขั้นตอนการประมวลผลล่วงหน้าที่พบบ่อย เราสามารถใช้ Pandas และ SciPy สำหรับสิ่งนี้ได้
import pandas as pd
import numpy as np
from scipy.stats import pearsonr
# Sample data
data = {
'feature1': np.random.rand(100),
'feature2': np.random.rand(100) * 2,
'feature3': np.random.rand(100) - 1,
'target': np.random.randint(0, 2, 100)
}
df = pd.DataFrame(data)
# Calculate Pearson correlation with the target
correlations = df.corr()['target'].drop('target')
# Select features with correlation above a certain threshold (e.g., 0.2)
selected_features = correlations[abs(correlations) > 0.2].index.tolist()
print(f"Features correlated with target: {selected_features}")
โค้ดส่วนนี้แสดงให้เห็นวิธีการระบุคุณลักษณะที่มีความสัมพันธ์เชิงเส้นกับตัวแปรเป้าหมาย สำหรับตัวแปรเป้าหมายแบบไบนารี สหสัมพันธ์แบบ Point-biserial มีความเกี่ยวข้อง และสำหรับตัวแปรเป้าหมายเชิงหมวดหมู่ การทดสอบทางสถิติอื่นๆ จะเหมาะสมกว่า
ข) การทดสอบทางสถิติ (Statistical Tests)
วิธีการกรองยังสามารถใช้การทดสอบทางสถิติเพื่อวัดความสัมพันธ์ระหว่างคุณลักษณะและตัวแปรเป้าหมาย ซึ่งมีประโยชน์อย่างยิ่งเมื่อต้องจัดการกับคุณลักษณะเชิงหมวดหมู่ หรือเมื่อสามารถตั้งสมมติฐานเฉพาะเกี่ยวกับการกระจายข้อมูลได้
โมดูล feature_selection ของ Scikit-learn มี:
f_classif: ค่า F ของ ANOVA ระหว่างป้ายกำกับ/คุณลักษณะสำหรับงานการจำแนกประเภท สมมติว่าคุณลักษณะเป็นเชิงตัวเลขและตัวแปรเป้าหมายเป็นเชิงหมวดหมู่f_regression: ค่า F ระหว่างป้ายกำกับ/คุณลักษณะสำหรับงานการถดถอย สมมติว่าคุณลักษณะเป็นเชิงตัวเลขและตัวแปรเป้าหมายเป็นเชิงตัวเลขmutual_info_classif: ข้อมูลร่วมสำหรับตัวแปรเป้าหมายแบบไม่ต่อเนื่อง สามารถจัดการความสัมพันธ์ที่ไม่เป็นเชิงเส้นได้mutual_info_regression: ข้อมูลร่วมสำหรับตัวแปรเป้าหมายแบบต่อเนื่องchi2: สถิติไคกำลังสองของคุณลักษณะที่ไม่เป็นลบสำหรับงานการจำแนกประเภท ใช้สำหรับคุณลักษณะเชิงหมวดหมู่
ตัวอย่าง: การใช้ `f_classif` และ `SelectKBest`
SelectKBest เป็นเมตา-ทรานส์ฟอร์เมอร์ที่ช่วยให้คุณสามารถเลือกคุณลักษณะตามฟังก์ชันการให้คะแนนที่เลือกไว้ (เช่น f_classif)
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest, f_classif
iris = load_iris()
X, y = iris.data, iris.target
# Select the top 2 features using f_classif
selector = SelectKBest(score_func=f_classif, k=2)
X_new = selector.fit_transform(X, y)
print(f"Original shape: {X.shape}")
print(f"Reduced shape: {X_new.shape}")
# To see which features were selected:
selected_indices = selector.get_support(indices=True)
print(f"Selected feature indices: {selected_indices}")
print(f"Selected feature names: {[iris.feature_names[i] for i in selected_indices]}")
ตัวอย่างนี้แสดงให้เห็นถึงวิธีการเลือกคุณลักษณะ 'k' ที่ดีที่สุด โดยอิงจากนัยสำคัญทางสถิติสำหรับการจำแนกประเภท ค่า F ใน f_classif โดยพื้นฐานแล้วจะวัดความแปรปรวนระหว่างกลุ่ม (คลาส) สัมพันธ์กับความแปรปรวนภายในกลุ่ม ค่า F ที่สูงขึ้นบ่งชี้ถึงความสัมพันธ์ที่แข็งแกร่งขึ้นระหว่างคุณลักษณะและตัวแปรเป้าหมาย
ข้อควรพิจารณาทั่วโลก: เมื่อทำงานกับชุดข้อมูลจากภูมิภาคต่างๆ (เช่น ข้อมูลเซ็นเซอร์จากสภาพอากาศที่แตกต่างกัน ข้อมูลทางการเงินจากระบบเศรษฐกิจที่แตกต่างกัน) คุณสมบัติทางสถิติของคุณลักษณะอาจแตกต่างกันอย่างมีนัยสำคัญ การทำความเข้าใจสมมติฐานของการทดสอบทางสถิติเหล่านี้ (เช่น การกระจายตัวแบบปกติสำหรับ ANOVA) เป็นสิ่งสำคัญ และการทดสอบแบบไม่ใช้พารามิเตอร์ เช่น ข้อมูลร่วม อาจมีความแข็งแกร่งมากกว่าในสถานการณ์ที่หลากหลาย
2. วิธีการห่อหุ้ม (Wrapper Methods)
วิธีการห่อหุ้มใช้โมเดลการเรียนรู้ของเครื่องเฉพาะเพื่อประเมินคุณภาพของชุดย่อยของคุณลักษณะ โดยจะ 'ห่อหุ้ม' กระบวนการฝึกอบรมโมเดลไว้ภายในกลยุทธ์การค้นหาเพื่อค้นหาชุดคุณลักษณะที่เหมาะสมที่สุด แม้โดยทั่วไปจะแม่นยำกว่าวิธีการกรอง แต่ก็มีค่าใช้จ่ายในการคำนวณที่สูงกว่ามากเนื่องจากการฝึกอบรมโมเดลซ้ำๆ
ก) การกำจัดคุณลักษณะแบบเรียกซ้ำ (Recursive Feature Elimination - RFE)
RFE ทำงานโดยการลบคุณลักษณะแบบเรียกซ้ำ เริ่มต้นด้วยการฝึกอบรมโมเดลบนชุดคุณลักษณะทั้งหมด จากนั้นลบคุณลักษณะที่สำคัญน้อยที่สุดออกตามสัมประสิทธิ์ของโมเดลหรือความสำคัญของคุณลักษณะ กระบวนการนี้จะทำซ้ำจนกว่าจะถึงจำนวนคุณลักษณะที่ต้องการ
from sklearn.datasets import make_classification
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
# Generate synthetic data
X, y = make_classification(n_samples=100, n_features=20, n_informative=10, n_redundant=5, random_state=42)
# Use a Logistic Regression model (can be any model that supports coef_ or feature_importances_)
estimator = LogisticRegression(solver='liblinear')
# Initialize RFE to select top 5 features
selector = RFE(estimator, n_features_to_select=5, step=1)
selector = selector.fit(X, y)
X_new = selector.transform(X)
print(f"Original shape: {X.shape}")
print(f"Reduced shape: {X_new.shape}")
# To see which features were selected:
selected_indices = selector.get_support(indices=True)
print(f"Selected feature indices: {selected_indices}")
RFE มีประสิทธิภาพเนื่องจากพิจารณาปฏิสัมพันธ์ระหว่างคุณลักษณะตามที่ประเมินโดยโมเดลที่เลือก พารามิเตอร์ `step` ควบคุมจำนวนคุณลักษณะที่จะถูกลบออกในแต่ละรอบ
ข) การเลือกคุณลักษณะแบบลำดับ (Sequential Feature Selection - SFS)
แม้ว่าจะไม่ใช่คลาสโดยตรงใน feature_selection หลักของ Scikit-learn แต่การเลือกคุณลักษณะแบบลำดับเป็นแนวคิดที่มักถูกนำมาใช้โดยใช้ตัวประมาณค่าของ Scikit-learn โดยเกี่ยวข้องกับการเลือกแบบก้าวหน้า (Forward Selection) (เริ่มต้นด้วยชุดว่างเปล่าและเพิ่มคุณลักษณะทีละตัว) หรือการกำจัดแบบย้อนกลับ (Backward Elimination) (เริ่มต้นด้วยคุณลักษณะทั้งหมดและลบออกทีละตัว) SequentialFeatureSelector ของ Scikit-learn ใน sklearn.feature_selection ได้นำแนวคิดนี้ไปใช้
from sklearn.feature_selection import SequentialFeatureSelector
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=100, n_features=20, n_informative=10, n_redundant=5, random_state=42)
estimator = LogisticRegression(solver='liblinear')
# Forward selection: add features until desired number is reached
sfs_forward = SequentialFeatureSelector(
estimator, n_features_to_select=10, direction='forward', cv=5)
sfs_forward.fit(X, y)
X_new_forward = sfs_forward.transform(X)
print(f"Forward Selection - Reduced shape: {X_new_forward.shape}")
# Backward selection: start with all features and remove
sfs_backward = SequentialFeatureSelector(
estimator, n_features_to_select=10, direction='backward', cv=5)
sfs_backward.fit(X, y)
X_new_backward = sfs_backward.transform(X)
print(f"Backward Selection - Reduced shape: {X_new_backward.shape}")
พารามิเตอร์ cv ใน SequentialFeatureSelector บ่งบอกถึงการตรวจสอบไขว้ (cross-validation) ซึ่งช่วยให้การเลือกคุณลักษณะมีความแข็งแกร่งและลดโอกาสที่จะเกิดการ Overfitting กับข้อมูลการฝึกอบรม นี่เป็นข้อพิจารณาที่สำคัญเมื่อนำวิธีการเหล่านี้ไปใช้ทั่วโลก เนื่องจากคุณภาพและการกระจายของข้อมูลอาจแตกต่างกันอย่างมาก
3. วิธีการฝังตัว (Embedded Methods)
วิธีการฝังตัวจะทำการเลือกคุณลักษณะเป็นส่วนหนึ่งของกระบวนการฝึกอบรมโมเดล มีข้อดีคือมีค่าใช้จ่ายในการคำนวณน้อยกว่าวิธีการห่อหุ้ม แต่ยังคงพิจารณาปฏิสัมพันธ์ของคุณลักษณะ โมเดลที่มีการปรับปรุง (regularized models) หลายชนิดจัดอยู่ในประเภทนี้
ก) การปรับค่าแบบ L1 (L1 Regularization หรือ Lasso)
โมเดลเช่น Lasso (Least Absolute Shrinkage and Selection Operator) ในโมเดลเชิงเส้นใช้การปรับค่าแบบ L1 เทคนิคนี้เพิ่มบทลงโทษให้กับค่าสัมบูรณ์ของสัมประสิทธิ์ ซึ่งสามารถทำให้สัมประสิทธิ์บางตัวมีค่าเป็นศูนย์ได้ คุณลักษณะที่มีสัมประสิทธิ์เป็นศูนย์จะถูกลบออกอย่างมีประสิทธิภาพ
from sklearn.linear_model import Lasso
from sklearn.datasets import make_regression
# Generate synthetic data
X, y = make_regression(n_samples=100, n_features=20, n_informative=10, random_state=42, noise=10)
# Lasso with alpha (regularization strength)
# A higher alpha leads to more regularization and potentially more zero coefficients
lasso = Lasso(alpha=0.1, random_state=42)
lasso.fit(X, y)
# Get the number of non-zero coefficients (selected features)
non_zero_features = np.sum(lasso.coef_ != 0)
print(f"Number of features selected by Lasso: {non_zero_features}")
# To get the actual selected features:
selected_features_mask = lasso.coef_ != 0
X_new = X[:, selected_features_mask]
print(f"Reduced shape: {X_new.shape}")
สามารถใช้ LassoCV เพื่อค้นหาค่าอัลฟ่าที่เหมาะสมที่สุดโดยอัตโนมัติผ่านการตรวจสอบไขว้
ข) ความสำคัญของบางลักษณะที่ใช้โครงสร้างต้นไม้ (Tree-based Feature Importances)
วิธีการแบบอองซอมเบิล (Ensemble methods) เช่น RandomForestClassifier, GradientBoostingClassifier และ ExtraTreesClassifier มีคุณสมบัติโดยธรรมชาติในการระบุความสำคัญของคุณลักษณะ ซึ่งคำนวณจากว่าแต่ละคุณลักษณะมีส่วนช่วยในการลดความไม่บริสุทธิ์หรือข้อผิดพลาดในต้นไม้ที่รวมกันมากน้อยเพียงใด คุณลักษณะที่มีความสำคัญต่ำสามารถถูกลบออกได้
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X, y = cancer.data, cancer.target
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X, y)
# Get feature importances
importances = model.feature_importances_
# Sort features by importance
indices = np.argsort(importances)[::-1]
print("Feature ranking:")
for f in range(X.shape[1]):
print(f"{f + 1}. feature {indices[f]} ({cancer.feature_names[indices[f]]}) - {importances[indices[f]]:.4f}")
# Select top N features (e.g., top 10)
N = 10
selected_features_mask = np.zeros(X.shape[1], dtype=bool)
selected_features_mask[indices[:N]] = True
X_new = X[:, selected_features_mask]
print(f"Reduced shape after selecting top {N} features: {X_new.shape}")
วิธีการที่ใช้โครงสร้างต้นไม้มีประสิทธิภาพเนื่องจากสามารถจับความสัมพันธ์ที่ไม่เป็นเชิงเส้นและปฏิสัมพันธ์ของคุณลักษณะได้ สามารถนำไปประยุกต์ใช้ได้อย่างกว้างขวางในหลากหลายสาขา ตั้งแต่การวินิจฉัยทางการแพทย์ (ดังตัวอย่าง) ไปจนถึงการตรวจจับการฉ้อโกงทางการเงินในตลาดต่างๆ
การสกัดคุณลักษณะเพื่อการลดมิติข้อมูล
ในขณะที่การเลือกคุณลักษณะยังคงคุณลักษณะดั้งเดิมไว้ การสกัดคุณลักษณะจะสร้างชุดคุณลักษณะใหม่ที่ลดลง ซึ่งมีประโยชน์อย่างยิ่งเมื่อคุณลักษณะดั้งเดิมมีความสัมพันธ์กันสูง หรือเมื่อคุณต้องการฉายภาพข้อมูลลงในพื้นที่ที่มีมิติที่ต่ำกว่าซึ่งจับความแปรปรวนได้มากที่สุด
1. การวิเคราะห์ส่วนประกอบหลัก (Principal Component Analysis - PCA)
PCA เป็นเทคนิคการแปลงเชิงเส้นที่มีจุดมุ่งหมายเพื่อค้นหาชุดแกนฉาก (ส่วนประกอบหลัก) ที่จับความแปรปรวนสูงสุดในข้อมูล ส่วนประกอบหลักแรกจะจับความแปรปรวนได้มากที่สุด ส่วนประกอบที่สองจะจับความแปรปรวนถัดไปมากที่สุด (ตั้งฉากกับส่วนประกอบแรก) และเรื่อยไป โดยการเก็บเฉพาะส่วนประกอบหลัก 'k' ตัวแรก เราจะบรรลุการลดมิติข้อมูล
ข้อควรทราบสำคัญ: PCA มีความไวต่อขนาดของคุณลักษณะ สิ่งสำคัญคือต้องปรับขนาดข้อมูลของคุณ (เช่น โดยใช้ StandardScaler) ก่อนที่จะใช้ PCA
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.datasets import load_wine
wine = load_wine()
X, y = wine.data, wine.target
# Scale the data
X_scaled = StandardScaler().fit_transform(X)
# Initialize PCA to reduce to 2 components
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print(f"Original shape: {X.shape}")
print(f"Reduced shape after PCA: {X_pca.shape}")
# The explained variance ratio shows how much variance each component captures
print(f"Explained variance ratio: {pca.explained_variance_ratio_}")
print(f"Total explained variance: {np.sum(pca.explained_variance_ratio_):.4f}")
PCA เป็นเลิศสำหรับการแสดงข้อมูลที่มีมิติสูงโดยการลดให้เหลือ 2 หรือ 3 มิติ เป็นเทคนิคพื้นฐานในการวิเคราะห์ข้อมูลเชิงสำรวจและสามารถเร่งขั้นตอนการสร้างโมเดลในภายหลังได้อย่างมาก ประสิทธิภาพของมันถูกพบเห็นได้ในโดเมนต่างๆ เช่น การประมวลผลภาพและพันธุศาสตร์
2. การวิเคราะห์การจำแนกเชิงเส้น (Linear Discriminant Analysis - LDA)
แตกต่างจาก PCA ซึ่งเป็นแบบไม่กำกับดูแลและมีเป้าหมายเพื่อเพิ่มความแปรปรวน LDA เป็นเทคนิคแบบกำกับดูแลที่มีเป้าหมายเพื่อค้นหาการนำเสนอที่มีมิติที่ต่ำกว่าซึ่งเพิ่มความสามารถในการแยกแยะระหว่างคลาสให้สูงสุด ส่วนใหญ่ใช้สำหรับงานการจำแนกประเภท
ข้อควรทราบสำคัญ: LDA ยังต้องการให้คุณลักษณะถูกปรับขนาด นอกจากนี้ จำนวนส่วนประกอบใน LDA ถูกจำกัดไว้ที่ n_classes - 1 เป็นอย่างมากที่สุด
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
# Scale the data
X_scaled = StandardScaler().fit_transform(X)
# Initialize LDA. Number of components cannot exceed n_classes - 1 (which is 2 for Iris)
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X_scaled, y)
print(f"Original shape: {X.shape}")
print(f"Reduced shape after LDA: {X_lda.shape}")
# LDA also has explained_variance_ratio_ but it's class separability
print(f"Explained variance ratio (class separability): {lda.explained_variance_ratio_}")
LDA มีประโยชน์อย่างยิ่งเมื่อเป้าหมายคือการสร้างตัวจำแนกประเภทที่สามารถแยกแยะระหว่างหมวดหมู่ต่างๆ ในข้อมูลของคุณได้ดี ซึ่งเป็นความท้าทายทั่วไปในการใช้งานทั่วโลกหลายอย่าง เช่น การแบ่งส่วนลูกค้าหรือการจำแนกโรค
3. การฝังตัวเพื่อนบ้านแบบสุ่มที่มีการกระจายแบบ t (t-Distributed Stochastic Neighbor Embedding - t-SNE)
t-SNE เป็นเทคนิคการลดมิติข้อมูลแบบไม่เชิงเส้นที่ใช้เป็นหลักสำหรับการแสดงชุดข้อมูลที่มีมิติสูง โดยจะทำงานโดยการจับคู่จุดข้อมูลที่มีมิติสูงไปยังพื้นที่ที่มีมิติที่ต่ำกว่า (โดยทั่วไปคือ 2D หรือ 3D) เพื่อให้จุดที่คล้ายกันถูกสร้างแบบจำลองด้วยระยะทางที่คล้ายกันในพื้นที่ที่มีมิติที่ต่ำกว่า มีความโดดเด่นในการเปิดเผยโครงสร้างภายในและกลุ่มข้อมูล
ข้อควรทราบสำคัญ: t-SNE มีค่าใช้จ่ายในการคำนวณสูงและโดยทั่วไปจะใช้สำหรับการแสดงภาพมากกว่าการเป็นขั้นตอนการประมวลผลล่วงหน้าสำหรับการฝึกอบรมโมเดล ผลลัพธ์ยังอาจแตกต่างกันไปตามการเริ่มต้นแบบสุ่มและการตั้งค่าพารามิเตอร์ที่แตกต่างกัน
from sklearn.manifold import TSNE
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt
digits = load_digits()
X, y = digits.data, digits.target
# For demonstration, we'll use a subset of the data as t-SNE can be slow
subset_indices = np.random.choice(len(X), 1000, replace=False)
X_subset = X[subset_indices]
y_subset = y[subset_indices]
# Initialize t-SNE with 2 components
# perplexity is related to the number of nearest neighbors (e.g., 30 is common)
# n_iter is the number of iterations for optimization
tsne = TSNE(n_components=2, perplexity=30, n_iter=300, random_state=42)
X_tsne = tsne.fit_transform(X_subset)
print(f"Original subset shape: {X_subset.shape}")
print(f"Reduced shape after t-SNE: {X_tsne.shape}")
# Plotting the results (optional, for visualization)
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y_subset, cmap='viridis', alpha=0.7)
plt.title('t-SNE visualization of Digits dataset')
plt.xlabel('t-SNE component 1')
plt.ylabel('t-SNE component 2')
plt.legend(*scatter.legend_elements(), title='Classes')
plt.show()
t-SNE มีค่าอย่างยิ่งสำหรับการทำความเข้าใจโครงสร้างภายในของข้อมูลที่ซับซ้อนและมีมิติสูงที่พบในสาขาต่างๆ เช่น จีโนมิกส์ หรือการวิเคราะห์เครือข่ายสังคม ซึ่งนำเสนอข้อมูลเชิงลึกด้านภาพเกี่ยวกับรูปแบบที่อาจซ่อนอยู่
การเลือกเทคนิคที่เหมาะสมสำหรับชุดข้อมูลทั่วโลก
การเลือกวิธีการเลือกหรือสกัดคุณลักษณะที่เหมาะสมไม่ใช่การตัดสินใจแบบ "ขนาดเดียวเหมาะกับทุกคน" มีหลายปัจจัยที่ส่งผลต่อการเลือกนี้ โดยเฉพาะอย่างยิ่งสำหรับชุดข้อมูลทั่วโลก:
- ลักษณะของข้อมูล: ข้อมูลของคุณเป็นเชิงตัวเลข เชิงหมวดหมู่ หรือผสมผสาน? มีการแจกแจงที่ทราบหรือไม่? ตัวอย่างเช่น
chi2เหมาะสำหรับคุณลักษณะเชิงหมวดหมู่ที่ไม่เป็นลบ ในขณะที่f_classifใช้สำหรับคุณลักษณะเชิงตัวเลขและตัวแปรเป้าหมายเชิงหมวดหมู่ - ประเภทของโมเดล: โมเดลเชิงเส้นอาจได้รับประโยชน์จากการปรับค่าแบบ L1 ในขณะที่โมเดลแบบโครงสร้างต้นไม้จะให้ความสำคัญของคุณลักษณะโดยธรรมชาติ
- ทรัพยากรการคำนวณ: วิธีการกรองจะเร็วที่สุด ตามด้วยวิธีการฝังตัว แล้วจึงเป็นวิธีการห่อหุ้มและ t-SNE
- ข้อกำหนดด้านความสามารถในการตีความ: หากการอธิบาย *เหตุผล* ที่การทำนายเกิดขึ้นมีความสำคัญสูงสุด วิธีการเลือกคุณลักษณะที่เก็บคุณลักษณะดั้งเดิมไว้ (เช่น RFE หรือ L1) มักจะถูกเลือกมากกว่าวิธีการสกัดคุณลักษณะ (เช่น PCA) ที่สร้างส่วนประกอบที่เป็นนามธรรม
- ความเป็นเชิงเส้นเทียบกับไม่เป็นเชิงเส้น: PCA และโมเดลเชิงเส้นสมมติความสัมพันธ์เชิงเส้น ในขณะที่ t-SNE และวิธีการแบบโครงสร้างต้นไม้สามารถจับรูปแบบที่ไม่เป็นเชิงเส้นได้
- แบบกำกับดูแลเทียบกับไม่กำกับดูแล: LDA เป็นแบบกำกับดูแล (ใช้ตัวแปรเป้าหมาย) ในขณะที่ PCA เป็นแบบไม่กำกับดูแล
- มาตราส่วนและหน่วย: สำหรับ PCA และ LDA การปรับขนาดคุณลักษณะเป็นสิ่งสำคัญ พิจารณาความแตกต่างของมาตราส่วนในข้อมูลที่รวบรวมจากภูมิภาคต่างๆ ทั่วโลก ตัวอย่างเช่น ค่าสกุลเงินหรือค่าการอ่านจากเซ็นเซอร์อาจมีมาตราส่วนที่แตกต่างกันอย่างมากในแต่ละประเทศหรือประเภทเซ็นเซอร์
- ความแตกต่างทางวัฒนธรรมและภูมิภาค: เมื่อทำงานกับชุดข้อมูลที่เกี่ยวข้องกับพฤติกรรมมนุษย์ ข้อมูลประชากร หรือความรู้สึกจากบริบททางวัฒนธรรมที่แตกต่างกัน การตีความคุณลักษณะอาจซับซ้อน คุณลักษณะที่ทำนายได้สูงในภูมิภาคหนึ่งอาจไม่เกี่ยวข้องหรือแม้กระทั่งทำให้เข้าใจผิดในอีกภูมิภาคหนึ่งเนื่องจากบรรทัดฐานทางสังคม สภาพเศรษฐกิจ หรือวิธีการรวบรวมข้อมูลที่แตกต่างกัน ควรพิจารณาความเชี่ยวชาญในโดเมนเสมอเมื่อประเมินความสำคัญของคุณลักษณะในประชากรที่หลากหลาย
ข้อมูลเชิงลึกที่นำไปปฏิบัติได้:
- เริ่มต้นง่ายๆ: เริ่มต้นด้วยวิธีการกรอง (เช่น Variance Threshold, การทดสอบทางสถิติ) เพื่อการประเมินอย่างรวดเร็วและกำจัดสัญญาณรบกวนที่ชัดเจน
- วนซ้ำและประเมิน: ทดลองกับวิธีการต่างๆ และประเมินผลกระทบต่อประสิทธิภาพของโมเดลของคุณโดยใช้เมตริกที่เหมาะสมและการตรวจสอบไขว้
- แสดงภาพ: ใช้เทคนิคเช่น PCA หรือ t-SNE เพื่อแสดงภาพข้อมูลของคุณในมิติที่ต่ำกว่า ซึ่งสามารถเปิดเผยโครงสร้างที่ซ่อนอยู่และแจ้งกลยุทธ์การเลือกคุณลักษณะของคุณได้
- ความเชี่ยวชาญในโดเมนเป็นสิ่งสำคัญ: ทำงานร่วมกับผู้เชี่ยวชาญในโดเมนเพื่อทำความเข้าใจความหมายและความเกี่ยวข้องของคุณลักษณะ โดยเฉพาะอย่างยิ่งเมื่อต้องจัดการกับข้อมูลทั่วโลกที่ซับซ้อน
- พิจารณาแนวทางแบบอองซอมเบิล: การรวมเทคนิคการเลือกคุณลักษณะหลายอย่างเข้าด้วยกันบางครั้งอาจให้ผลลัพธ์ที่ดีกว่าการพึ่งพาวิธีการเดียว
Pipeline ของ Scikit-learn สำหรับเวิร์กโฟลว์แบบบูรณาการ
ออบเจกต์ Pipeline ของ Scikit-learn มีประโยชน์อย่างยิ่งสำหรับการรวมขั้นตอนการประมวลผลล่วงหน้า ซึ่งรวมถึงการเลือก/สกัดคุณลักษณะ เข้ากับการฝึกอบรมโมเดล สิ่งนี้ช่วยให้มั่นใจได้ว่าการเลือกคุณลักษณะของคุณจะดำเนินการอย่างสอดคล้องกันในแต่ละรอบของการตรวจสอบไขว้ ป้องกันข้อมูลรั่วไหล และสร้างผลลัพธ์ที่เชื่อถือได้มากขึ้น นี่เป็นสิ่งสำคัญอย่างยิ่งเมื่อสร้างโมเดลที่จะนำไปใช้ในตลาดโลกที่หลากหลาย
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.datasets import load_breast_cancer
bc = load_breast_cancer()
X, y = bc.data, bc.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Create a pipeline that first scales, then selects features, then trains a classifier
pipe = Pipeline([
('scaler', StandardScaler()),
('selector', SelectKBest(score_func=f_classif, k=10)),
('classifier', LogisticRegression(solver='liblinear'))
])
# Train the pipeline
pipe.fit(X_train, y_train)
# Evaluate the pipeline using cross-validation
cv_scores = cross_val_score(pipe, X_train, y_train, cv=5)
print(f"Cross-validation scores: {cv_scores}")
print(f"Average CV score: {np.mean(cv_scores):.4f}")
# Make predictions on the test set
accuracy = pipe.score(X_test, y_test)
print(f"Test set accuracy: {accuracy:.4f}")
การใช้ Pipeline ช่วยให้มั่นใจได้ว่ากระบวนการทั้งหมด ตั้งแต่การปรับขนาดไปจนถึงการเลือกคุณลักษณะและการจำแนกประเภท จะถูกพิจารณาเป็นหน่วยเดียว นี่เป็นแนวทางปฏิบัติที่ดีที่สุดสำหรับการพัฒนาโมเดลที่แข็งแกร่ง โดยเฉพาะอย่างยิ่งเมื่อโมเดลมีวัตถุประสงค์เพื่อนำไปใช้ทั่วโลก ซึ่งประสิทธิภาพที่สอดคล้องกันในข้อมูลที่มีการกระจายตัวต่างกันเป็นสิ่งสำคัญ
สรุป
การลดมิติข้อมูลผ่านการเลือกและการสกัดคุณลักษณะเป็นขั้นตอนสำคัญในการสร้างโมเดลการเรียนรู้ของเครื่องที่มีประสิทธิภาพ แข็งแกร่ง และตีความได้ Scikit-learn มีชุดเครื่องมือที่ครอบคลุมสำหรับรับมือกับความท้าทายเหล่านี้ ช่วยให้นักวิทยาศาสตร์ข้อมูลทั่วโลกสามารถทำงานได้อย่างมีประสิทธิภาพ โดยการทำความเข้าใจวิธีการที่แตกต่างกัน ทั้งวิธีการกรอง วิธีการห่อหุ้ม วิธีการฝังตัว และเทคนิคการสกัดคุณลักษณะ เช่น PCA และ LDA คุณจะสามารถตัดสินใจได้อย่างชาญฉลาดที่ปรับให้เข้ากับชุดข้อมูลและวัตถุประสงค์เฉพาะของคุณ
สำหรับผู้ชมทั่วโลกของเรา ข้อควรพิจารณาขยายไปไกลกว่าแค่การเลือกอัลกอริทึม การทำความเข้าใจแหล่งที่มาของข้อมูล อคติที่อาจเกิดขึ้นจากการรวบรวมคุณลักษณะในภูมิภาคต่างๆ และความต้องการในการตีความเฉพาะของผู้มีส่วนได้ส่วนเสียในท้องถิ่นเป็นสิ่งสำคัญ การใช้เครื่องมือเช่น Pipeline ของ Scikit-learn ช่วยให้มั่นใจได้ถึงเวิร์กโฟลว์ที่มีโครงสร้างและทำซ้ำได้ ซึ่งจำเป็นสำหรับการปรับใช้โซลูชัน AI ที่เชื่อถือได้ในบริบทระหว่างประเทศที่หลากหลาย
ในขณะที่คุณสำรวจความซับซ้อนของวิทยาการข้อมูลสมัยใหม่ การเชี่ยวชาญความสามารถในการเลือกคุณลักษณะของ Scikit-learn จะเป็นทรัพย์สินที่สำคัญอย่างแน่นอน ช่วยให้คุณสามารถปลดล็อกศักยภาพสูงสุดของข้อมูลของคุณ โดยไม่คำนึงถึงแหล่งที่มา