使用 scikit-learn 在 Python 中進行機器學習。適用於監督式學習(分類、迴歸)、非監督式學習(分群、降維)、模型評估、超參數調整、前處理或建構 ML 管線。提供演算法、前處理技術、管線及最佳實務的完整參考文件。
Scikit-learn
概覽
此技能提供使用 scikit-learn 進行機器學習任務的全面指引,scikit-learn 是業界標準的 Python 古典機器學習函式庫。此技能適用於分類、迴歸、分群、降維、前處理、模型評估,以及建構可上線的 ML 管線。
安裝
已針對 scikit-learn 1.8.0(穩定版;2025 年 12 月)進行測試。需要 Python 3.11–3.14(1.8+ 提供 free-threaded CPython 3.14 wheels)。
請安裝 PyPI 套件 scikit-learn(而非 PyPI 上已棄用的 sklearn 套件)。在程式碼中匯入為 sklearn。
# 使用 uv 安裝 scikit-learn
uv pip install "scikit-learn>=1.7"
# 選用:繪圖工具與內建範例腳本相依套件
uv pip install "scikit-learn[plots]" matplotlib seaborn
# 常搭配使用
uv pip install pandas numpy
檢查版本:
import sklearn
print(sklearn.__version__)
何時使用此技能
在以下情況使用 scikit-learn 技能:
- 建構分類或迴歸模型
- 執行分群或降維
- 為機器學習前處理與轉換資料
- 使用交叉驗證評估模型效能
- 使用網格或隨機搜尋調整超參數
- 為生產工作流程建立 ML 管線
- 比較不同演算法以解決任務
- 處理結構化(表格)與文字資料
- 需要可解釋的古典機器學習方法
快速開始
分類範例
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
# 分割資料
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42
)
# 前處理
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 訓練模型
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train_scaled, y_train)
# 評估
y_pred = model.predict(X_test_scaled)
print(classification_report(y_test, y_pred))
混合資料的完整管線
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.ensemble import GradientBoostingClassifier
# 定義特徵類型
numeric_features = ['age', 'income']
categorical_features = ['gender', 'occupation']
# 建立前處理管線
numeric_transformer = Pipeline([
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline([
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
# 組合轉換器
preprocessor = ColumnTransformer([
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
])
# 完整管線
model = Pipeline([
('preprocessor', preprocessor),
('classifier', GradientBoostingClassifier(random_state=42))
])
# 擬合與預測
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
核心能力
五大能力領域記載於
references/core_capabilities.md,各主題詳細內容見
references/supervised_learning.md、
references/unsupervised_learning.md、
references/model_evaluation.md、
references/preprocessing.md 與
references/pipelines_and_composition.md:
- 監督式學習 — 分類與迴歸估計器家族。
- 非監督式學習 — 分群、分解與流形學習。
- 模型評估與選擇 — 指標、交叉驗證與超參數搜尋。
- 資料前處理 — 縮放、編碼、填補與特徵選擇。
- 管線與組合 —
Pipeline與ColumnTransformer。
務必在 Pipeline 內進行前處理,以便在每個交叉驗證折中重新擬合;
在分割前縮放或填補會將測試資訊洩漏至訓練資料。
兩個完整工作流程見
references/common_workflows.md。
範例腳本
分類管線
執行包含前處理、模型比較、超參數調整與評估的完整分類工作流程:
uv run python scripts/classification_pipeline.py
此腳本示範:
- 處理混合資料類型(數值與類別)
- 使用交叉驗證進行模型比較
- 使用 GridSearchCV 進行超參數調整
- 使用多種指標進行全面評估
- 特徵重要性分析
分群分析
執行包含演算法比較與視覺化的分群分析:
uv run python scripts/clustering_analysis.py
此腳本示範:
- 尋找最佳分群數(肘部法、輪廓分析)
- 比較多種分群演算法(K-Means、DBSCAN、Agglomerative、Gaussian Mixture)
- 在沒有真實標籤的情況下評估分群品質
- 使用 PCA 投影視覺化結果
參考文件
此技能包含全面的參考檔案,供深入探討特定主題:
快速參考
檔案: references/quick_reference.md
- 常見匯入模式與安裝說明
- 常見任務的快速工作流程範本
- 演算法選擇速查表
- 常見模式與陷阱
- 效能最佳化技巧
監督式學習
檔案: references/supervised_learning.md
- 線性模型(迴歸與分類)
- 支援向量機
- 決策樹與集成方法
- K-最近鄰、樸素貝氏、神經網路
- 演算法選擇指南
非監督式學習
檔案: references/unsupervised_learning.md
- 所有分群演算法及其參數與使用案例
- 降維技術
- 離群值與新穎性偵測
- 高斯混合模型
- 方法選擇指南
模型評估
檔案: references/model_evaluation.md
- 交叉驗證策略
- 超參數調整方法
- 分類、迴歸與分群指標
- 學習曲線與驗證曲線
- 模型選擇最佳實務
前處理
檔案: references/preprocessing.md
- 特徵縮放與正規化
- 類別變數編碼
- 缺失值填補
- 特徵工程技術
- 自訂轉換器
管線與組合
檔案: references/pipelines_and_composition.md
- Pipeline 建構與使用
- 用於混合資料類型的 ColumnTransformer
- 用於平行轉換的 FeatureUnion
- 完整的端對端範例
- 最佳實務
最佳實務
一律使用管線
管線可防止資料洩漏並確保一致性:
# 良好:在管線中進行前處理
pipeline = Pipeline([
('scaler', StandardScaler()),
('model', LogisticRegression())
])
# 不良:在管線外進行前處理(可能洩漏資訊)
X_scaled = StandardScaler().fit_transform(X)
僅在訓練資料上擬合
切勿在測試資料上擬合:
# 良好
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # 僅轉換
# 不良
scaler = StandardScaler()
X_all_scaled = scaler.fit_transform(np.vstack([X_train, X_test]))
分類時使用分層分割
保留類別分佈:
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42
)
設定隨機種子以確保可重現性
model = RandomForestClassifier(n_estimators=100, random_state=42)
選擇適當的指標
- 平衡資料:Accuracy、F1-score
- 不平衡資料:Precision、Recall、ROC AUC、Balanced Accuracy
- 成本敏感:定義自訂評分器
必要時縮放特徵
需要特徵縮放的演算法:
- SVM、KNN、神經網路
- 帶正規化的 PCA、線性/邏輯迴歸
- K-Means 分群
不需要縮放的演算法:
- 樹系模型(決策樹、隨機森林、梯度提升)
- 樸素貝氏
常見問題疑難排解
ConvergenceWarning
問題: 模型未收斂
解決方法: 增加 max_iter 或縮放特徵
model = LogisticRegression(max_iter=1000)
測試集效能不佳
問題: 過度擬合
解決方法: 使用正規化、交叉驗證或較簡單的模型
# 加入正規化
model = Ridge(alpha=1.0)
# 使用交叉驗證
scores = cross_val_score(model, X, y, cv=5)
大型資料集記憶體錯誤
解決方法: 使用專為大型資料設計的演算法
# 大型資料集使用 SGD
from sklearn.linear_model import SGDClassifier
model = SGDClassifier()
# 或使用 MiniBatchKMeans 進行分群
from sklearn.cluster import MiniBatchKMeans
model = MiniBatchKMeans(n_clusters=8, batch_size=100)




