文章使用说明

以下是我在学习 Scikit-Learn 库时的学习笔记,内容涵盖了其基础功能和使用方法,包括数据加载、预处理、模型训练与评估等核心知识点。同时,笔记中还简要提及了 管道设计 和 超参数调优 等扩展特性,但具体的理论讲解和应用场景,将在后续的专题笔记中详细展开。

因此,本篇笔记主要以基础内容为主,适合Scikit-Learn 初学者阅读。


一、 什么是 Scikit-Learn?

Scikit-Learn 是一个强大的 机器学习 库,提供了丰富的工具用于 数据预处理特征工程模型训练与评估 等。它是基于 NumPy、SciPy 和 Matplotlib 构建的,非常适合构建、验证和部署机器学习模型。

Scikit-Learn 的核心优势在于:

主要模块包括:


二、 基本工作流程

机器学习任务一般遵循以下步骤:

  1. 数据准备(加载数据、预处理)。
  2. 划分训练集和测试集。
  3. 选择模型并训练。
  4. 模型评估与优化。
  5. 预测新数据。

三、 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 提供了多个经典数据集(如鸢尾花、手写数字等),可以直接使用。

示例

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_*

用于生成合成数据,适合测试机器学习算法。

示例

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,使数据分布均匀,适合梯度下降类模型。

示例

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])。

示例

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

用于填补缺失值,可选择填充策略,如均值、中位数或最常见值。

示例

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 一致性非常高,以下是通用流程:

  1. 初始化模型:如 model = LogisticRegression()
  2. 训练模型model.fit(X_train, y_train)
  3. 预测新数据y_pred = model.predict(X_test)
  4. 评估模型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 模型评估函数


七、常用模型大总结

Scikit-Learn 提供了分类、回归、聚类、降维等多种算法,以下是常用模型的分类及用途:


1. 分类模型

2. 回归模型

3. 聚类模型

4. 降维模型

5. 集成模型


八、 超参数调优

超参数是模型训练前需要指定的参数,不会在训练过程中自动调整。
Scikit-Learn 提供了两种常用超参数调优方法:

2.1 网格搜索 GridSearchCV

功能:

主要参数:

示例

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

功能:

主要参数:

示例

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

主要组件:

示例

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 提供了多种交叉验证策略,适用于不同场景。

  1. 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)
  2. 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)
  3. LeaveOneOut(留一验证法)
    每次将一个样本作为验证集,其他样本作为训练集。

    from sklearn.model_selection import LeaveOneOut
    
    loo = LeaveOneOut()
    for train_index, test_index in loo.split(X):
        print("训练集:", train_index, "验证集:", test_index)
  4. 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 特征选择方法
  1. 过滤法(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])
  2. 嵌入法(Embedded Method)
    结合模型的特性自动选择重要特征。

    • 示例:基于随机森林的重要性
    from sklearn.ensemble import RandomForestClassifier
    
    model = RandomForestClassifier()
    model.fit(X, y)
    
    print("特征重要性:\n", model.feature_importances_)
  3. 递归特征消除(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 常用方法
  1. 使用 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]))
  2. 使用 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_)

文章参考