Scikit-learn 简单介绍和入门示例
1. 概述
Scikit-learn(简称 sklearn)是 Python 生态中最流行的 机器学习库,主要用于传统 ML 任务。它基于 NumPy、SciPy 和 Matplotlib,提供了统一的 API,涵盖 数据预处理、特征工程、模型训练、评估与调优。
定位:
- 适合:中小规模数据,原型验证,教学与科研
- 不适合:海量数据分布式计算(推荐 Spark ML、Dask ML)
2. 设计思想
Scikit-learn 遵循 模块化、统一接口、组合化 的原则。
主要接口规范:
fit(X, y=None)
:训练模型 / 学习参数predict(X)
:预测transform(X)
:数据变换(特征工程、降维)fit_transform(X)
:训练并变换(常用于预处理)score(X, y)
:评估模型get_params()
/set_params()
:超参数管理
统一接口的好处:无论是 SVM、决策树还是 PCA,调用方式都基本相同。
3. 模块全景
3.1 数据预处理
- 标准化与归一化:
StandardScaler
,MinMaxScaler
- 特征选择:
SelectKBest
,RFE
- 降维:
PCA
,TruncatedSVD
,TSNE
3.2 监督学习
分类:
- 线性:
LogisticRegression
,SGDClassifier
- 树模型:
DecisionTreeClassifier
,RandomForestClassifier
,GradientBoostingClassifier
- SVM:
SVC
- 朴素贝叶斯:
GaussianNB
- 线性:
回归:
- 线性:
LinearRegression
,Ridge
,Lasso
- 树模型:
DecisionTreeRegressor
,RandomForestRegressor
- 支持向量回归:
SVR
- 线性:
3.3 非监督学习
- 聚类:
KMeans
,DBSCAN
,AgglomerativeClustering
,GaussianMixture
- 降维:
PCA
,NMF
3.4 模型选择与评估
交叉验证:
cross_val_score
,KFold
调参:
GridSearchCV
,RandomizedSearchCV
指标:
- 分类:准确率、精确率、召回率、F1、ROC-AUC
- 回归:均方误差 (MSE)、R²
3.5 工程工具
- Pipeline:将预处理和模型打包成流水线
- Joblib:模型保存与加载
- 并行计算:内置多核并行支持
4. 工作流程
一个典型的 Scikit-learn 项目通常包括:
- 数据准备:加载、清洗、划分(
train_test_split
) - 预处理:标准化、特征选择、降维
- 建模:选择分类/回归/聚类算法
- 评估:使用交叉验证与指标函数
- 调参:
GridSearchCV
或RandomizedSearchCV
- 部署:模型持久化 (
joblib.dump/load
)
5. 简单示例
以 鸢尾花分类 为例:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
# 数据加载
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 构建流水线:标准化 + SVM 分类器
pipeline = Pipeline([
("scaler", StandardScaler()),
("clf", SVC(kernel="linear"))
])
# 训练与预测
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
# 评估
print("Accuracy:", accuracy_score(y_test, y_pred))
6. 优势与不足
优势
- 统一 API,学习成本低
- 覆盖大多数传统 ML 算法
- 性能不错,底层部分用 Cython/C++ 优化
- 文档和社区生态完善
不足
- 不支持大规模分布式数据
- 不包含深度学习模型
- 在线学习能力有限(部分算法支持
partial_fit
)
7. 适用场景
- 原型验证:快速测试不同算法
- 教学与科研:直观 API 适合学习
- 工程应用:中小规模数据的分类/回归/聚类
- 特征工程 + 调参:配合 Pandas/Numpy 使用
8.入门示例yanz演示
阶段一:入门(快速上手)
目标:掌握 Scikit-learn 的基本 API,能完成简单的分类/回归任务。
学习要点
- 熟悉
fit / predict / transform
接口 - 使用
train_test_split
划分数据 - 调用常见模型:
LinearRegression
,LogisticRegression
,SVC
,KNeighborsClassifier
- 使用
accuracy_score
、mean_squared_error
等指标
综合示例:鸢尾花分类
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 数据集
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 模型
clf = LogisticRegression(max_iter=200)
clf.fit(X_train, y_train)
# 预测与评估
y_pred = clf.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
阶段二:提升(实战技巧)
目标:掌握 Pipeline、特征工程、模型调参,能在真实数据集上完成较复杂的任务。
学习要点
- Pipeline:整合预处理与建模
- 特征工程:
StandardScaler
,OneHotEncoder
,PCA
- 交叉验证:
cross_val_score
- 超参数调优:
GridSearchCV
,RandomizedSearchCV
- 模型选择:比较不同模型性能
综合示例:房价预测(加州房价数据集)
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_squared_error
# 数据集
X, y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 流水线:标准化 + 随机森林
pipe = Pipeline([
("scaler", StandardScaler()),
("rf", RandomForestRegressor(random_state=42))
])
# 超参数搜索
param_grid = {
"rf__n_estimators": [50, 100],
"rf__max_depth": [10, 20, None]
}
grid = GridSearchCV(pipe, param_grid, cv=3, scoring="neg_mean_squared_error")
grid.fit(X_train, y_train)
# 预测与评估
y_pred = grid.predict(X_test)
print("Best params:", grid.best_params_)
print("MSE:", mean_squared_error(y_test, y_pred))
阶段三:高级(综合应用)
目标:能 系统性构建机器学习项目,包括数据预处理、特征选择、模型集成、结果可视化与解释。
学习要点
- 特征选择:
SelectKBest
,RFE
- 集成学习:
VotingClassifier
,StackingClassifier
- 概率估计与模型校准:
CalibratedClassifierCV
- 模型解释:
permutation_importance
,PartialDependenceDisplay
- 保存与部署:
joblib.dump
,joblib.load
综合示例:信用卡客户违约预测(分类任务)
import joblib
import pandas as pd
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, VotingClassifier
from sklearn.pipeline import Pipeline
from sklearn.metrics import classification_report
# 假设已加载信用卡客户数据 (X: 特征, y: 是否违约)
data = pd.read_csv("credit_card.csv")
X = data.drop("default", axis=1)
y = data["default"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
# 流水线:预处理 + 特征选择 + 集成学习
pipe = Pipeline([
("scaler", StandardScaler()),
("select", SelectKBest(score_func=f_classif, k=10)),
("clf", VotingClassifier(estimators=[
("rf", RandomForestClassifier(random_state=42)),
("gb", GradientBoostingClassifier(random_state=42))
], voting="soft"))
])
# 随机搜索调参
param_dist = {
"clf__rf__n_estimators": [100, 200],
"clf__gb__learning_rate": [0.05, 0.1]
}
search = RandomizedSearchCV(pipe, param_dist, cv=3, scoring="f1", n_iter=4, random_state=42)
search.fit(X_train, y_train)
# 预测与评估
y_pred = search.predict(X_test)
print("Best params:", search.best_params_)
print(classification_report(y_test, y_pred))
# 模型保存
joblib.dump(search.best_estimator_, "credit_model.pkl")
总结
- 入门:掌握 API + 简单模型(Logistic/SVC/LinearRegression)
- 提升:学会 Pipeline、特征工程、调参(GridSearchCV/RandomizedSearchCV)
- 高级:综合应用,能做完整 ML 项目(特征选择 + 集成学习 + 模型解释 + 部署)
Scikit-learn 常用 API 汇总
1️、数据集工具
from sklearn import datasets
from sklearn.model_selection import train_test_split
datasets.load_iris()
:鸢尾花分类datasets.load_digits()
:手写数字识别datasets.fetch_california_housing()
:加州房价数据datasets.make_classification()
:生成分类数据datasets.make_regression()
:生成回归数据train_test_split(X, y, test_size=0.2, random_state=42)
:划分训练/测试集
2️、数据预处理
from sklearn.preprocessing import StandardScaler, MinMaxScaler, Normalizer
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
- 标准化:
StandardScaler().fit_transform(X)
- 归一化:
MinMaxScaler().fit_transform(X)
- 正则化:
Normalizer().fit_transform(X)
- 独热编码:
OneHotEncoder().fit_transform(X)
- 标签编码:
LabelEncoder().fit_transform(y)
3️、特征工程
from sklearn.feature_selection import SelectKBest, f_classif, RFE
from sklearn.decomposition import PCA
- 特征选择:
SelectKBest(score_func=f_classif, k=10).fit_transform(X, y)
- 递归特征消除:
RFE(estimator, n_features_to_select=5).fit_transform(X, y)
- 主成分分析:
PCA(n_components=2).fit_transform(X)
4️、常用模型
分类
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
- 逻辑回归:
LogisticRegression()
- 支持向量机:
SVC(kernel="linear")
- 决策树:
DecisionTreeClassifier()
- 随机森林:
RandomForestClassifier(n_estimators=100)
- 梯度提升:
GradientBoostingClassifier()
- 朴素贝叶斯:
GaussianNB()
- 最近邻:
KNeighborsClassifier(n_neighbors=5)
回归
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor
- 线性回归:
LinearRegression()
- 岭回归:
Ridge(alpha=1.0)
- Lasso 回归:
Lasso(alpha=0.1)
- 支持向量回归:
SVR(kernel="rbf")
- 随机森林回归:
RandomForestRegressor(n_estimators=100)
聚类 / 非监督学习
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from sklearn.mixture import GaussianMixture
- KMeans 聚类:
KMeans(n_clusters=3)
- DBSCAN:
DBSCAN(eps=0.5, min_samples=5)
- 层次聚类:
AgglomerativeClustering(n_clusters=3)
- 高斯混合模型:
GaussianMixture(n_components=3)
5️、模型评估
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.metrics import mean_squared_error, r2_score
分类指标:
accuracy_score(y_true, y_pred)
precision_score(y_true, y_pred)
recall_score(y_true, y_pred)
f1_score(y_true, y_pred)
roc_auc_score(y_true, y_prob)
classification_report(y_true, y_pred)
回归指标:
mean_squared_error(y_true, y_pred)
r2_score(y_true, y_pred)
混淆矩阵:
confusion_matrix(y_true, y_pred)
6️、模型选择与调参
from sklearn.model_selection import cross_val_score, KFold, StratifiedKFold
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
交叉验证:
cross_val_score(model, X, y, cv=5)
K 折:
KFold(n_splits=5)
分层 K 折:
StratifiedKFold(n_splits=5)
网格搜索:
GridSearchCV(estimator, param_grid, cv=3, scoring="accuracy")
随机搜索:
RandomizedSearchCV(estimator, param_distributions, cv=3, n_iter=10)
7️、工程工具
from sklearn.pipeline import Pipeline
import joblib
流水线:
pipe = Pipeline([ ("scaler", StandardScaler()), ("clf", SVC()) ])
模型保存:
joblib.dump(model, "model.pkl")
模型加载:
model = joblib.load("model.pkl")