人人都会AI编程

22.1 Scikit-learn:经典机器学习算法、特征工程、模型评估

更新时间:2026-07-12

Scikit-learn 是 Python 生态里最成熟、使用最广泛的机器学习库。它基于 NumPy 和 SciPy 构建,提供了一套统一、一致的接口,让你用几行代码就能完成从数据预处理到模型训练、评估的完整流程。它的设计哲学是“把机器学习做简单,但不是做简单的事”——接口简洁,但足以覆盖绝大多数经典算法和实际业务需求。

经典机器学习算法一览

Scikit-learn 覆盖了传统机器学习的主要领域,每个领域都有多个可选算法。常见任务和对应类如下:

  • 分类LogisticRegressionSVC(支持向量机)、RandomForestClassifierGradientBoostingClassifierKNeighborsClassifier
  • 回归LinearRegressionRidgeLassoRandomForestRegressorGradientBoostingRegressor
  • 聚类KMeansDBSCANAgglomerativeClustering
  • 降维PCA(主成分分析)、TruncatedSVDt-SNE(用于可视化)
  • 模型选择与评估train_test_splitcross_val_scoreGridSearchCVclassification_report

所有模型都遵循一致的 .fit() / .predict() / .transform() 接口,学习和替换算法的成本极低。

特征工程的核心工具

现实中,把原始数据直接扔进模型效果往往很差。Scikit-learn 的 sklearn.preprocessingsklearn.compose 子模块提供了丰富的特征工程工具。

数值特征处理

  • StandardScaler:标准化(均值0,方差1),适合基于距离的算法(SVM、KNN、线性回归正则化)。
  • MinMaxScaler:将特征缩放到 [0,1] 区间,适合神经网络或需要固定范围的场景。
  • RobustScaler:对异常值鲁棒的缩放方式,用中位数和四分位数。

类别特征编码

  • OneHotEncoder:将类别变量转为二进制向量,适用于树模型和线性模型。
  • LabelEncoder:将标签转为 0, 1, 2... 的整数,通常仅用于目标变量 y,不推荐用于特征(会引入虚假的大小关系)。
  • OrdinalEncoder:有序类别编码,保留顺序信息。

文本特征提取

  • CountVectorizer:词频向量化。
  • TfidfVectorizer:TF-IDF 向量化,同时过滤停用词和选择高频特征。

缺失值处理

  • SimpleImputer:用均值、中位数、众数或常数值填充缺失值。
  • KNNImputer:用 K 近邻算法预测填充缺失值。

特征工程管道
PipelineColumnTransformer 是工程中必须掌握的组合工具。它们让你可以把多个处理步骤串联成一个整体,避免数据泄露,并且让代码更清晰。

from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

# 数值列进行标准化,类别列进行独热编码
num_features = ['age', 'income']
cat_features = ['city', 'gender']

preprocessor = ColumnTransformer([
    ('num', StandardScaler(), num_features),
    ('cat', OneHotEncoder(handle_unknown='ignore'), cat_features)
])

# 将预处理与模型连接成完整管道
from sklearn.linear_model import LogisticRegression
pipeline = Pipeline([
    ('prep', preprocessor),
    ('clf', LogisticRegression())
])

pipeline.fit(X_train, y_train)
pipeline.score(X_test, y_test)

使用管道后,你不需要手动对训练集和测试集分别做变换,只需对整个管道调用一次 fitpredict,极大减少了出错概率。

模型评估的标准化流程

Scikit-learn 提供了一整套评估工具,确保你既能看到模型性能的全貌,也能深入诊断问题。

基本评估指标

  • 分类:accuracy_scoreprecision_scorerecall_scoref1_scoreroc_auc_score
  • 回归:mean_squared_errormean_absolute_errorr2_score
  • 聚类:adjusted_rand_scoresilhouette_score

交叉验证
避免单一训练集/测试集切分带来的偶然性:

from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5, scoring='f1')
print("F1 均值:", scores.mean(), "标准差:", scores.std())

混淆矩阵与分类报告

from sklearn.metrics import classification_report, confusion_matrix
y_pred = model.predict(X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

超参数搜索

from sklearn.model_selection import GridSearchCV
param_grid = {'n_estimators': [100, 200], 'max_depth': [5, 10]}
grid = GridSearchCV(RandomForestClassifier(), param_grid, cv=5, scoring='roc_auc')
grid.fit(X_train, y_train)
print(grid.best_params_, grid.best_score_)

Scikit-learn 的定位与局限

它是经典机器学习的入门首选和日常工作的主力,但你要清楚它的边界:

  • 优点:API 一致性极高,文档极其丰富,几百个算法都遵循同样的 fit/predict 模式;集成度好,从数据处理到模型部署评估一站式解决;社区成熟,排查问题容易。
  • 局限
  • 不适合深度学习(图像、文本大模型),需要用 PyTorch/TensorFlow。
  • 默认在 CPU 上运行单线程,不对 GPU 加速,处理极大规模数据时需要配合 PySpark 或 Dask 等分布式方案。
  • 一些先进算法(如 XGBoost、LightGBM、CatBoost)虽然提供了 scikit-learn 兼容接口,但本身是独立库,在处理结构化数据比赛中经常单独使用以获得最佳性能。

在实际工作中,Scikit-learn 更多扮演“快速验证”和“基线模型”的角色。拿到数据后,先用它搭一个完整管道、训练一个简单模型看效果,确认方向后再根据需求引入更复杂的算法或框架。这是高效、务实的机器学习实践方式。