Scikit-learn 是 Python 生态里最成熟、使用最广泛的机器学习库。它基于 NumPy 和 SciPy 构建,提供了一套统一、一致的接口,让你用几行代码就能完成从数据预处理到模型训练、评估的完整流程。它的设计哲学是“把机器学习做简单,但不是做简单的事”——接口简洁,但足以覆盖绝大多数经典算法和实际业务需求。
经典机器学习算法一览
Scikit-learn 覆盖了传统机器学习的主要领域,每个领域都有多个可选算法。常见任务和对应类如下:
- 分类:
LogisticRegression、SVC(支持向量机)、RandomForestClassifier、GradientBoostingClassifier、KNeighborsClassifier - 回归:
LinearRegression、Ridge、Lasso、RandomForestRegressor、GradientBoostingRegressor - 聚类:
KMeans、DBSCAN、AgglomerativeClustering - 降维:
PCA(主成分分析)、TruncatedSVD、t-SNE(用于可视化) - 模型选择与评估:
train_test_split、cross_val_score、GridSearchCV、classification_report
所有模型都遵循一致的 .fit() / .predict() / .transform() 接口,学习和替换算法的成本极低。
特征工程的核心工具
现实中,把原始数据直接扔进模型效果往往很差。Scikit-learn 的 sklearn.preprocessing 和 sklearn.compose 子模块提供了丰富的特征工程工具。
数值特征处理
StandardScaler:标准化(均值0,方差1),适合基于距离的算法(SVM、KNN、线性回归正则化)。MinMaxScaler:将特征缩放到 [0,1] 区间,适合神经网络或需要固定范围的场景。RobustScaler:对异常值鲁棒的缩放方式,用中位数和四分位数。
类别特征编码
OneHotEncoder:将类别变量转为二进制向量,适用于树模型和线性模型。LabelEncoder:将标签转为 0, 1, 2... 的整数,通常仅用于目标变量 y,不推荐用于特征(会引入虚假的大小关系)。OrdinalEncoder:有序类别编码,保留顺序信息。
文本特征提取
CountVectorizer:词频向量化。TfidfVectorizer:TF-IDF 向量化,同时过滤停用词和选择高频特征。
缺失值处理
SimpleImputer:用均值、中位数、众数或常数值填充缺失值。KNNImputer:用 K 近邻算法预测填充缺失值。
特征工程管道Pipeline 和 ColumnTransformer 是工程中必须掌握的组合工具。它们让你可以把多个处理步骤串联成一个整体,避免数据泄露,并且让代码更清晰。
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)
使用管道后,你不需要手动对训练集和测试集分别做变换,只需对整个管道调用一次 fit 和 predict,极大减少了出错概率。
模型评估的标准化流程
Scikit-learn 提供了一整套评估工具,确保你既能看到模型性能的全貌,也能深入诊断问题。
基本评估指标
- 分类:
accuracy_score、precision_score、recall_score、f1_score、roc_auc_score - 回归:
mean_squared_error、mean_absolute_error、r2_score - 聚类:
adjusted_rand_score、silhouette_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 更多扮演“快速验证”和“基线模型”的角色。拿到数据后,先用它搭一个完整管道、训练一个简单模型看效果,确认方向后再根据需求引入更复杂的算法或框架。这是高效、务实的机器学习实践方式。