Scikit-learn 机器学习入门实战
背景
Scikit-learn 提供了「瑞士军刀」式的机器学习工具箱。无论你是做表格数据的分类、用户分群还是异常检测,掌握它能让你在几分钟内完成从数据处理到模型评估的完整流程。
第 1 章:理解 API 设计哲学
Scikit-learn 所有模型遵循统一接口:
| 模式 |
伪代码 |
| 分类/回归 |
model.fit(X_train, y_train) → model.predict(X_test) |
| 降维/聚类 |
model.fit(X) → model.transform(X) |
| 预处理 |
transformer.fit(X) → transformer.transform(X) |
第 2 章:Pipeline 优雅构建数据流
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
pipe = Pipeline([
("scaler", StandardScaler()),
("pca", PCA(n_components=2)),
("clf", LogisticRegression())
])
pipe.fit(X_train, y_train)
accuracy = pipe.score(X_test, y_test)
print(f"Pipeline 准确率: {accuracy:.2%}")
第 3 章:类别型与数值型混合特征处理
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.pipeline import Pipeline
# 假设 columns 0-2 是数值型,column 3 是类别型
preprocessor = ColumnTransformer([
("num", StandardScaler(), [0, 1, 2]),
("cat", OneHotEncoder(), [3])
])
full_pipeline = Pipeline([
("preprocess", preprocessor),
("classifier", RandomForestClassifier())
])
第 4 章:网格搜索 + 交叉验证调参
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifier
param_grid = {
"n_estimators": [50, 100, 200],
"max_depth": [3, 5, None],
"learning_rate": [0.01, 0.1, 0.2]
}
grid = GridSearchCV(
GradientBoostingClassifier(),
param_grid,
cv=5,
scoring="accuracy",
n_jobs=-1
)
grid.fit(X_train, y_train)
print(f"最佳参数: {grid.best_params_}")
print(f"最佳 CV 分数: {grid.best_score_:.3f}")
第 5 章:模型持久化
import joblib
# 保存
joblib.dump(grid.best_estimator_, "best_model.joblib")
# 加载
model = joblib.load("best_model.joblib")
print(model.predict(X_test[:5]))
思考题
- 为什么 Pipeline 可以防止数据泄露?
fit_transform 和 transform 在 cross-validation 中如何区分使用?
- 类别型特征超过 1000 个不同值时,OneHotEncoder 会有什么问题?可以用什么替代方案(如 Target Encoding)?
- GridSearchCV 和 RandomizedSearchCV 各自适用什么场景?