文章使用说明
以下是我在学习 Scikit-Learn 库时的学习笔记,内容涵盖了其基础功能和使用方法,包括数据加载、预处理、模型训练与评估等核心知识点。同时,笔记中还简要提及了 管道设计 和 超参数调优 等扩展特性,但具体的理论讲解和应用场景,将在后续的专题笔记中详细展开。
因此,本篇笔记主要以基础内容为主,适合Scikit-Learn 初学者阅读。
一、 什么是 Scikit-Learn?
Scikit-Learn 是一个强大的 机器学习 库,提供了丰富的工具用于 数据预处理、特征工程、模型训练与评估 等。它是基于 NumPy、SciPy 和 Matplotlib 构建的,非常适合构建、验证和部署机器学习模型。
Scikit-Learn 的核心优势在于:
- 统一的 API:所有模型的调用方式一致。
- 丰富的模型库:支持分类、回归、聚类、降维等任务。
- 简化的流程:通过一小部分代码完成完整的机器学习管道。
主要模块包括:
- 数据预处理:
sklearn.preprocessing
- 特征选择:
sklearn.feature_selection
- 模型选择与评估:
sklearn.model_selection
- 机器学习算法:分类、回归、聚类模型
- 降维:主成分分析(PCA)、奇异值分解(SVD)等
二、 基本工作流程
机器学习任务一般遵循以下步骤:
- 数据准备(加载数据、预处理)。
- 划分训练集和测试集。
- 选择模型并训练。
- 模型评估与优化。
- 预测新数据。
三、 Scikit-Learn 快速入门
我们以一个分类任务为例,使用鸢尾花数据集(Iris Dataset)展示完整流程。
# 导入必要库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
# 1. 加载数据
iris = load_iris()
X = iris.data # 特征
y = iris.target # 标签
# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 3. 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 4. 训练模型
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
# 5. 模型评估
y_pred = model.predict(X_test)
print("准确率:", accuracy_score(y_test, y_pred))
print("分类报告:\n", classification_report(y_test, y_pred))
四、 数据加载与生成
1.1 datasets.load_*
Scikit-Learn 提供了多个经典数据集(如鸢尾花、手写数字等),可以直接使用。
-
常见数据集:
load_iris()
:鸢尾花分类数据集load_digits()
:手写数字数据集load_boston()
:波士顿房价数据集(回归任务)load_wine()
:葡萄酒分类数据集
-
返回结果: 数据集通常是类似字典的对象,包含:
data
:特征数据target
:目标变量DESCR
:数据集描述
示例
from sklearn.datasets import load_iris
# 加载鸢尾花数据集
iris = load_iris()
# 查看数据集内容
print("数据集描述:\n", iris.DESCR[:500]) # 数据集描述
print("特征数据:\n", iris.data[:5]) # 前5行特征
print("目标变量:\n", iris.target[:5]) # 前5个标签
1.2 datasets.make_*
用于生成合成数据,适合测试机器学习算法。
- 常见函数:
make_classification()
:生成分类任务数据make_regression()
:生成回归任务数据make_blobs()
:生成聚类数据
示例
from sklearn.datasets import make_classification
# 生成分类数据
X, y = make_classification(n_samples=100, n_features=2, n_classes=2, random_state=42)
print("特征数据:\n", X[:5])
print("目标变量:\n", y[:5])
五、 数据预处理模块 sklearn.preprocessing
5.1 数据标准化 StandardScaler
将特征数据的均值调整为 0,标准差调整为 1,使数据分布均匀,适合梯度下降类模型。
- 常用方法:
fit()
:计算训练集的均值和标准差。transform()
:应用标准化变换。fit_transform()
:结合计算和变换。
示例
from sklearn.preprocessing import StandardScaler
import numpy as np
# 示例数据
data = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]])
# 初始化标准化器
scaler = StandardScaler()
# 标准化
data_scaled = scaler.fit_transform(data)
print("原始数据:\n", data)
print("标准化后:\n", data_scaled)
5.2 数据归一化 MinMaxScaler
将特征数据缩放到指定范围(默认 [0, 1])。
- 常用方法:
fit()
:计算训练集的最小值和最大值。transform()
:应用归一化。inverse_transform()
:将归一化数据恢复到原始范围。
示例
from sklearn.preprocessing import MinMaxScaler
# 示例数据
data = np.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
# 初始化归一化器
scaler = MinMaxScaler(feature_range=(0, 1))
# 归一化
data_scaled = scaler.fit_transform(data)
print("原始数据:\n", data)
print("归一化后:\n", data_scaled)
5.3 缺失值处理 SimpleImputer
用于填补缺失值,可选择填充策略,如均值、中位数或最常见值。
- 参数:
missing_values
:指定缺失值(如np.nan
)。strategy
:填充策略(mean
、median
或most_frequent
)。
示例
from sklearn.impute import SimpleImputer
# 示例数据
data = np.array([[1, 2], [np.nan, 3], [7, 6]])
# 初始化填充器
imputer = SimpleImputer(strategy='mean')
# 填补缺失值
data_filled = imputer.fit_transform(data)
print("原始数据:\n", data)
print("填充后:\n", data_filled)
六、 模型训练与评估
6.1 模型训练流程
Scikit-Learn 模型的 API 一致性非常高,以下是通用流程:
- 初始化模型:如
model = LogisticRegression()
。 - 训练模型:
model.fit(X_train, y_train)
。 - 预测新数据:
y_pred = model.predict(X_test)
。 - 评估模型:
accuracy_score(y_test, y_pred)
等评估函数。
6.2 分类任务示例:逻辑回归
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
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 初始化逻辑回归模型
model = LogisticRegression(max_iter=200)
# 训练模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估
print("准确率:", accuracy_score(y_test, y_pred))
6.3 回归任务示例:线性回归
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 示例数据
X = [[1], [2], [3], [4]]
y = [2.2, 4.4, 6.6, 8.8]
# 初始化线性回归模型
regressor = LinearRegression()
# 训练模型
regressor.fit(X, y)
# 预测
y_pred = regressor.predict(X)
# 评估
print("均方误差:", mean_squared_error(y, y_pred))
6.4 模型评估函数
-
分类评估:
accuracy_score()
:分类正确的比例。classification_report()
:精确率、召回率、F1 值等。confusion_matrix()
:混淆矩阵。
-
回归评估:
mean_squared_error()
:均方误差。r2_score()
:判定系数,衡量拟合优度。
七、常用模型大总结
Scikit-Learn 提供了分类、回归、聚类、降维等多种算法,以下是常用模型的分类及用途:
1. 分类模型
- 逻辑回归:
sklearn.linear_model.LogisticRegression
- 支持向量机(SVM):
sklearn.svm.SVC
- 决策树:
sklearn.tree.DecisionTreeClassifier
- 随机森林:
sklearn.ensemble.RandomForestClassifier
- K 近邻(KNN):
sklearn.neighbors.KNeighborsClassifier
- 朴素贝叶斯:
sklearn.naive_bayes.GaussianNB
2. 回归模型
- 线性回归:
sklearn.linear_model.LinearRegression
- 岭回归:
sklearn.linear_model.Ridge
- 随机森林回归:
sklearn.ensemble.RandomForestRegressor
- 支持向量回归(SVR):
sklearn.svm.SVR
3. 聚类模型
- K 均值(K-Means):
sklearn.cluster.KMeans
- 层次聚类(Agglomerative Clustering):
sklearn.cluster.AgglomerativeClustering
- DBSCAN:
sklearn.cluster.DBSCAN
4. 降维模型
- 主成分分析(PCA):
sklearn.decomposition.PCA
- 奇异值分解(SVD):
sklearn.decomposition.TruncatedSVD
- 线性判别分析(LDA):
sklearn.discriminant_analysis.LinearDiscriminantAnalysis
5. 集成模型
- 随机森林:
sklearn.ensemble.RandomForestClassifier
/Regressor
- 梯度提升(GBDT):
sklearn.ensemble.GradientBoostingClassifier
/Regressor
- 极限随机树(ExtraTrees):
sklearn.ensemble.ExtraTreesClassifier
/Regressor
- 投票分类器(VotingClassifier):
sklearn.ensemble.VotingClassifier
八、 超参数调优
超参数是模型训练前需要指定的参数,不会在训练过程中自动调整。
Scikit-Learn 提供了两种常用超参数调优方法:
2.1 网格搜索 GridSearchCV
功能:
- 对指定参数组合进行穷举搜索。
主要参数:
param_grid
:字典形式的参数搜索空间。cv
:交叉验证的折数。
示例
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
# 模拟数据
X = [[1, 2], [2, 3], [3, 4], [4, 5]]
y = [0, 1, 0, 1]
# 参数搜索空间
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
# 初始化模型
svc = SVC()
# 网格搜索
grid_search = GridSearchCV(svc, param_grid, cv=3)
grid_search.fit(X, y)
print("最佳参数:", grid_search.best_params_)
print("最佳得分:", grid_search.best_score_)
2.2 随机搜索 RandomizedSearchCV
功能:
- 随机从参数空间中采样,适用于参数空间较大的情况。
主要参数:
param_distributions
:参数搜索空间。n_iter
:搜索次数。
示例
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
import numpy as np
# 模拟数据
X = np.random.rand(100, 5)
y = np.random.randint(0, 2, size=100)
# 参数搜索空间
param_distributions = {
'n_estimators': [50, 100, 200],
'max_depth': [None, 10, 20, 30],
'min_samples_split': [2, 5, 10]
}
# 随机搜索
random_search = RandomizedSearchCV(RandomForestClassifier(), param_distributions, n_iter=10, random_state=42, cv=3)
random_search.fit(X, y)
print("最佳参数:", random_search.best_params_)
print("最佳得分:", random_search.best_score_)
九、管道
管道的作用:
- 将多个步骤串联起来,如数据预处理 + 特征选择 + 模型训练。
- 避免数据泄露(测试集信息泄露到训练过程)。
使用 Pipeline
主要组件:
Pipeline
:创建管道。make_pipeline
:自动命名步骤的简化方式。
示例
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
# 创建管道
pipeline = Pipeline([
('scaler', StandardScaler()), # 第一步:标准化
('svm', SVC(kernel='linear', C=1)) # 第二步:SVM分类
])
# 训练管道
pipeline.fit(X, y)
# 预测
y_pred = pipeline.predict(X)
print("预测结果:", y_pred)
十、Scikit-Learn 的扩展用法
以下内容涵盖了我阅读代码时碰见过的其他用法,包括交叉验证策略、特征选择、模型持久化、并行处理等。
1. 交叉验证策略
1.1 什么是交叉验证?
交叉验证(Cross-Validation)是将数据划分为多个训练集和验证集,交替用于模型训练和评估的一种方法,目的是提高模型的泛化能力。
1.2 常用的交叉验证策略
Scikit-Learn 提供了多种交叉验证策略,适用于不同场景。
-
KFold
(K 折交叉验证)
将数据分成K
份,依次使用其中一份作为验证集,其余作为训练集。from sklearn.model_selection import KFold import numpy as np X = np.arange(10) # 示例数据 kf = KFold(n_splits=5, shuffle=True, random_state=42) for train_index, test_index in kf.split(X): print("训练集:", train_index, "验证集:", test_index)
-
StratifiedKFold
(分层 K 折交叉验证)
保持标签的类别分布在训练集和验证集中的比例一致,适用于分类任务。from sklearn.model_selection import StratifiedKFold y = [0, 0, 1, 1, 1, 0, 1, 0, 0, 1] # 标签数据 skf = StratifiedKFold(n_splits=3, shuffle=True, random_state=42) for train_index, test_index in skf.split(X, y): print("训练集:", train_index, "验证集:", test_index)
-
LeaveOneOut
(留一验证法)
每次将一个样本作为验证集,其他样本作为训练集。from sklearn.model_selection import LeaveOneOut loo = LeaveOneOut() for train_index, test_index in loo.split(X): print("训练集:", train_index, "验证集:", test_index)
-
ShuffleSplit
(随机划分交叉验证)
每次随机划分训练集和验证集,控制每次划分的比例。from sklearn.model_selection import ShuffleSplit ss = ShuffleSplit(n_splits=5, test_size=0.2, random_state=42) for train_index, test_index in ss.split(X): print("训练集:", train_index, "验证集:", test_index)
2. 特征选择
2.1 为什么需要特征选择?
- 去除无关或冗余的特征,减少模型复杂性。
- 提高训练效率。
- 减轻过拟合,提高泛化能力。
2.2 特征选择方法
-
过滤法(Filter Method)
根据统计指标筛选特征。- 示例:
SelectKBest
from sklearn.feature_selection import SelectKBest, f_classif from sklearn.datasets import load_iris # 加载数据 iris = load_iris() X, y = iris.data, iris.target # 筛选得分最高的两个特征 selector = SelectKBest(score_func=f_classif, k=2) X_new = selector.fit_transform(X, y) print("筛选后的特征:\n", X_new[:5])
- 示例:
-
嵌入法(Embedded Method)
结合模型的特性自动选择重要特征。- 示例:基于随机森林的重要性
from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier() model.fit(X, y) print("特征重要性:\n", model.feature_importances_)
-
递归特征消除(RFE)
通过训练模型反复删除不重要的特征。from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression model = LogisticRegression() selector = RFE(model, n_features_to_select=2) X_new = selector.fit_transform(X, y) print("选择后的特征:\n", X_new[:5])
3. 模型持久化
3.1 为什么需要模型持久化?
- 保存训练好的模型,以便后续直接加载使用。
- 节省重复训练的时间。
3.2 常用方法
-
使用
joblib
from sklearn.ensemble import RandomForestClassifier import joblib # 训练模型 model = RandomForestClassifier() model.fit(X, y) # 保存模型 joblib.dump(model, 'model.pkl') # 加载模型 loaded_model = joblib.load('model.pkl') print("加载模型后预测:", loaded_model.predict(X[:5]))
-
使用
pickle
import pickle # 保存模型 with open('model.pkl', 'wb') as file: pickle.dump(model, file) # 加载模型 with open('model.pkl', 'rb') as file: loaded_model = pickle.load(file) print("加载模型后预测:", loaded_model.predict(X[:5]))
4. 并行处理
Scikit-Learn 支持并行处理,可以通过设置参数 n_jobs
实现,尤其适用于集成模型(如随机森林、梯度提升等)。
示例:随机森林中的并行处理
from sklearn.ensemble import RandomForestClassifier
# 并行训练模型
model = RandomForestClassifier(n_estimators=100, n_jobs=-1)
model.fit(X, y)
print("训练完成,支持并行处理。")
5. 管道优化与超参数调优
5.1 管道结合网格搜索
将管道与网格搜索结合,可以统一优化数据预处理步骤与模型参数。
示例:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
# 构建管道
pipeline = Pipeline([
('scaler', StandardScaler()),
('svm', SVC())
])
# 参数网格
param_grid = {
'svm__C': [0.1, 1, 10],
'svm__kernel': ['linear', 'rbf']
}
# 网格搜索
grid_search = GridSearchCV(pipeline, param_grid, cv=3)
grid_search.fit(X, y)
print("最佳参数:", grid_search.best_params_)
文章参考
- Scikit-Learn 官方文档:https://scikit-learn.org/stable/documentation.html
- 代码练习网站:https://www.kaggle.com