1.2 Scikit-learn 的核心模块


文档摘要

1.2 Scikit-learn 的核心模块 Scikit-learn 核心模块详解:从基础到实践 1. Scikit-learn 基础领域 Scikit-learn (也称为 ) 是 Python 中最受欢迎和功能强大的机器学习库之一。它建立在 NumPy, SciPy 和 matplotlib 之上,提供了简洁高效的工具,用于数据挖掘和数据分析。Scikit-learn 以其一致的接口、全面的算法和出色的文档而闻名,使其成为机器学习入门和进阶的理想选择。 在深入核心模块之前,我们先简要回顾 Scikit-learn 的基础领域,理解其设计哲学和主要功能: 统一的 API 设计: Scikit-learn 遵循统一的设计原则,所有模型和工具都共享一套通用的 API。

1.2 Scikit-learn 的核心模块

Scikit-learn 核心模块详解:从基础到实践

1. Scikit-learn 基础领域

Scikit-learn (也称为 sklearn) 是 Python 中最受欢迎和功能强大的机器学习库之一。它建立在 NumPy, SciPy 和 matplotlib 之上,提供了简洁高效的工具,用于数据挖掘和数据分析。Scikit-learn 以其一致的接口、全面的算法和出色的文档而闻名,使其成为机器学习入门和进阶的理想选择。

在深入核心模块之前,我们先简要回顾 Scikit-learn 的基础领域,理解其设计哲学和主要功能:

  • 统一的 API 设计: Scikit-learn 遵循统一的设计原则,所有模型和工具都共享一套通用的 API。这大大降低了学习曲线,用户可以快速上手并轻松切换不同的算法。核心 API 包括:

    • 估计器 (Estimator): 这是 Scikit-learn 中用于学习数据的对象。例如,分类器、回归器和聚类器都是估计器。估计器具有 fit(X, y) 方法用于从数据中学习模型,以及 predict(X) 方法用于对新数据进行预测。

    • 转换器 (Transformer): 用于数据预处理和特征工程。例如,标准化器、编码器和降维器都是转换器。转换器具有 fit(X) 方法用于学习转换参数,以及 transform(X) 方法用于应用转换。部分转换器也提供 fit_transform(X) 方法,将 fittransform 步骤合并。

    • 预测器 (Predictor): 是估计器的一个子类,用于监督学习任务。预测器具有 predict(X) 方法用于预测,以及 score(X, y) 方法用于评估模型性能。

  • 广泛的算法库: Scikit-learn 涵盖了各种机器学习算法,包括:

    • 分类 (Classification): 逻辑回归、支持向量机 (SVM)、决策树、随机森林、梯度提升树、K 近邻等。

    • 回归 (Regression): 线性回归、岭回归、Lasso 回归、决策树回归、随机森林回归、梯度提升树回归等。

    • 聚类 (Clustering): K-均值聚类、DBSCAN、层次聚类、高斯混合模型等。

    • 降维 (Dimensionality Reduction): 主成分分析 (PCA)、线性判别分析 (LDA)、非负矩阵分解 (NMF) 等。

    • 模型选择与评估 (Model Selection and Evaluation): 交叉验证、网格搜索、各种评估指标 (准确率、精确率、召回率、F1 分数、AUC、均方误差等)。

    • 预处理 (Preprocessing): 特征缩放、特征编码、缺失值处理、特征选择等。

  • 清晰的文档和丰富的示例: Scikit-learn 拥有详尽且易于理解的官方文档,包含了大量的示例代码和用户指南,帮助用户快速掌握库的使用方法和各种算法的原理。

1.2 Scikit-learn 的核心模块

Scikit-learn 的功能被组织成多个模块,方便用户根据需求选择和使用。以下是 Scikit-learn 的核心模块,我们将逐一进行详细讲解,并结合代码实践:

  • sklearn.datasets: 数据集模块,用于加载和生成各种数据集,方便用户进行模型训练和评估。

  • sklearn.preprocessing: 预处理模块,包含数据标准化、归一化、编码等预处理工具,为模型训练准备高质量数据。

  • sklearn.feature_selection: 特征选择模块,用于从原始特征中选择最相关的特征,提高模型性能和降低计算成本。

  • sklearn.model_selection: 模型选择模块,提供交叉验证、网格搜索等工具,用于评估模型性能和优化模型参数。

  • sklearn.linear_model: 线性模型模块,包含各种线性模型,如线性回归、逻辑回归、岭回归等。

  • sklearn.tree: 决策树模块,提供决策树及其集成算法,如随机森林和梯度提升树。

  • sklearn.metrics: 评估指标模块,用于计算模型性能指标,如准确率、精确率、召回率、F1 分数等。

  • sklearn.pipeline: 管道模块,用于将多个处理步骤串联起来,构建机器学习工作流。

接下来,我们将深入探讨每个核心模块,并通过代码示例详细说明其使用方法和应用场景。

1.2.1 sklearn.datasets 模块:数据加载与生成

sklearn.datasets 模块是 Scikit-learn 的数据仓库,提供了各种用于机器学习任务的内置数据集,以及生成合成数据集的功能。这使得用户可以快速获取数据,进行算法测试和模型验证。

常用内置数据集:

  • load_iris(): 鸢尾花数据集,经典的分类数据集,包含 3 个类别,每个类别 50 个样本,4 个特征 (花萼长度、花萼宽度、花瓣长度、花瓣宽度)。

  • load_boston(): 波士顿房价数据集,经典的回归数据集,包含 506 个样本,13 个特征 (如人均犯罪率、住宅平均房龄等),目标变量是房价中位数。

  • load_digits(): 手写数字数据集,用于图像分类,包含 1797 个 8x8 图像,共 10 个类别 (0-9)。

  • load_linnerud(): Linnerud 数据集,多变量回归数据集,包含生理测量和运动数据。

  • load_breast_cancer(): 乳腺癌数据集,二分类数据集,用于预测乳腺癌是良性还是恶性。

代码实践:

from sklearn.datasets import load_iris, load_boston # 加载鸢尾花数据集 iris = load_iris() print("鸢尾花数据集特征名称:", iris.feature_names) print("鸢尾花数据集目标类别:", iris.target_names) print("鸢尾花数据集数据形状:", iris.data.shape) # (150, 4) print("鸢尾花数据集目标形状:", iris.target.shape) # (150,) # 加载波士顿房价数据集 boston = load_boston() print("波士顿房价数据集特征名称:", boston.feature_names) print("波士顿房价数据集数据形状:", boston.data.shape) # (506, 13) print("波士顿房价数据集目标形状:", boston.target.shape) # (506,)

生成合成数据集:

sklearn.datasets 还提供了一些函数用于生成合成数据集,方便用户在特定场景下测试算法。常用的生成函数包括:

  • make_classification(): 生成分类数据集。可以控制样本数量、特征数量、类别数量、特征信息量等参数。

  • make_regression(): 生成回归数据集。可以控制样本数量、特征数量、噪声水平等参数。

  • make_blobs(): 生成聚类数据集,生成围绕多个中心点的高斯分布数据。

  • make_moons(): 生成月牙形数据集,用于测试非线性分类算法。

  • make_circles(): 生成圆形数据集,用于测试非线性分类算法。

代码实践:

from sklearn.datasets import make_classification, make_regression import matplotlib.pyplot as plt # 生成分类数据集 X_classification, y_classification = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, n_classes=2, random_state=42) plt.figure(figsize=(6, 4)) plt.scatter(X_classification[:, 0], X_classification[:, 1], c=y_classification, cmap='viridis') plt.title("合成分类数据集") plt.show() # 生成回归数据集 X_regression, y_regression = make_regression(n_samples=100, n_features=1, noise=20, random_state=42) plt.figure(figsize=(6, 4)) plt.scatter(X_regression, y_regression) plt.title("合成回归数据集") plt.show()

sklearn.datasets 模块总结:

  • 提供了方便易用的接口加载和生成各种数据集。

  • 内置数据集涵盖了分类、回归、聚类等多种任务。

  • 合成数据集生成函数可以灵活控制数据特性,用于算法测试和实验。

1.2.2 sklearn.preprocessing 模块:数据预处理

sklearn.preprocessing 模块包含了各种数据预处理工具,用于将原始数据转换为更适合机器学习模型训练的形式。数据预处理是机器学习流程中至关重要的一步,它可以提高模型性能、加速模型训练,并增强模型的鲁棒性。

常用的预处理技术:

  • 标准化 (Standardization): 将数据转换为均值为 0,标准差为 1 的分布。常用 StandardScaler

  • 归一化 (Normalization): 将数据缩放到 [0, 1] 或 [-1, 1] 的范围内。常用 MinMaxScalerMaxAbsScaler

  • 正则化 (Normalization, 用于样本): 将每个样本的特征向量缩放到单位范数。常用 Normalizer

  • 二值化 (Binarization): 将数值特征转换为二值特征 (0 或 1)。常用 Binarizer

  • 独热编码 (One-Hot Encoding): 将类别特征转换为数值特征,用于处理类别变量。常用 OneHotEncoder

  • 标签编码 (Label Encoding): 将类别标签转换为数值标签,用于处理目标变量。常用 LabelEncoder

  • 缺失值处理 (Imputation): 填充数据集中的缺失值。常用 SimpleImputerKNNImputer

  • 多项式特征生成 (Polynomial Features): 生成多项式特征,用于扩展特征空间,提高模型复杂度。常用 PolynomialFeatures

代码实践:

from sklearn.preprocessing import StandardScaler, MinMaxScaler, OneHotEncoder, LabelEncoder, SimpleImputer import numpy as np # 示例数据 data = np.array([[1, -1, 2], [2, 0, 0], [0, 1, -1]]) # 标准化 scaler = StandardScaler() scaled_data = scaler.fit_transform(data) print("标准化后的数据:\n", scaled_data) # 归一化 (MinMaxScaler) min_max_scaler = MinMaxScaler() min_max_scaled_data = min_max_scaler.fit_transform(data) print("MinMaxScaler 归一化后的数据:\n", min_max_scaled_data) # 独热编码 encoder = OneHotEncoder() categorical_data = np.array([['male'], ['female'], ['female'], ['male']]) encoded_data = encoder.fit_transform(categorical_data).toarray() # toarray() 将稀疏矩阵转换为密集矩阵 print("独热编码后的数据:\n", encoded_data) # 标签编码 label_encoder = LabelEncoder() labels = np.array(['red', 'blue', 'green', 'red']) encoded_labels = label_encoder.fit_transform(labels) print("标签编码后的标签:\n", encoded_labels) print("原始类别:", label_encoder.classes_) # 查看原始类别 # 缺失值处理 (SimpleImputer) missing_data = np.array([[1, np.nan, 2], [np.nan, 0, 0], [0, 1, np.nan]]) imputer = SimpleImputer(strategy='mean') # 使用均值填充缺失值,可选 'median', 'most_frequent', 'constant' imputed_data = imputer.fit_transform(missing_data) print("缺失值填充后的数据:\n", imputed_data)

sklearn.preprocessing 模块总结:

  • 提供了丰富的数据预处理工具,涵盖了数据清洗、特征缩放、特征编码等多个方面。

  • 可以根据不同的数据类型和模型需求选择合适的预处理方法。

  • 预处理步骤可以有效地提升模型性能和数据质量。

1.2.3 sklearn.feature_selection 模块:特征选择

sklearn.feature_selection 模块提供了各种特征选择方法,用于从原始特征集中选择最相关的特征子集。特征选择可以帮助我们:

  • 提高模型性能: 去除冗余和不相关的特征,减少噪声干扰,提升模型泛化能力。

  • 降低计算成本: 减少特征维度,降低模型训练和预测的计算复杂度。

  • 增强模型可解释性: 选择少量关键特征,使模型更容易理解和解释。

常用的特征选择方法:

  • 方差选择法 (Variance Threshold): 移除方差低于阈值的特征。假设方差小的特征信息量少。常用 VarianceThreshold

  • 单变量特征选择 (Univariate Feature Selection): 分别独立地评估每个特征与目标变量之间的关系,选择得分最高的特征。常用 SelectKBestSelectPercentile,搭配不同的评分函数 (如 f_classif 用于分类,f_regression 用于回归,chi2 用于卡方检验)。

  • 递归特征消除 (Recursive Feature Elimination, RFE): 迭代地训练模型,并在每次迭代中移除最不重要的特征,直到达到预期的特征数量。常用 RFERFECV (带交叉验证的 RFE)。

  • 基于模型的特征选择 (SelectFromModel): 使用一个已经训练好的模型 (如线性模型、树模型) 来评估特征的重要性,并选择重要性高于阈值的特征。常用 SelectFromModel

代码实践:

from sklearn.feature_selection import VarianceThreshold, SelectKBest, f_classif, RFE, SelectFromModel from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_iris # 加载鸢尾花数据集 iris = load_iris() X, y = iris.data, iris.target # 方差选择法 selector_var = VarianceThreshold(threshold=0.5) # 设置方差阈值 X_var_selected = selector_var.fit_transform(X) print("方差选择后特征数量:", X_var_selected.shape[1]) # 特征数量可能减少 # 单变量特征选择 (SelectKBest) selector_kbest = SelectKBest(score_func=f_classif, k=2) # 选择得分最高的 2 个特征,使用 f_classif 分类评分函数 X_kbest_selected = selector_kbest.fit_transform(X, y) print("SelectKBest 选择后特征数量:", X_kbest_selected.shape[1]) # 递归特征消除 (RFE) estimator = LogisticRegression(solver='liblinear', multi_class='ovr', random_state=42) # 使用逻辑回归作为估计器 selector_rfe = RFE(estimator, n_features_to_select=2, step=1) # 选择 2 个特征,每次迭代移除 1 个特征 X_rfe_selected = selector_rfe.fit_transform(X, y) print("RFE 选择后特征数量:", X_rfe_selected.shape[1]) print("RFE 选择的特征索引:", selector_rfe.support_) # 查看被选择的特征索引 print("RFE 特征排名:", selector_rfe.ranking_) # 查看特征排名 # 基于模型的特征选择 (SelectFromModel) model = LogisticRegression(penalty='l1', solver='liblinear', multi_class='ovr', random_state=42) # 使用 L1 正则化的逻辑回归 selector_model = SelectFromModel(model, threshold='median') # 选择特征重要性高于中位数的特征 X_model_selected = selector_model.fit_transform(X, y) print("SelectFromModel 选择后特征数量:", X_model_selected.shape[1])

sklearn.feature_selection 模块总结:

  • 提供了多种特征选择方法,可以根据不同的数据和模型选择合适的方法。

  • 特征选择可以有效地提高模型性能、降低计算成本和增强模型可解释性。

  • 需要根据具体任务和数据特点选择合适的特征选择策略。

1.2.4 sklearn.model_selection 模块:模型选择与评估

sklearn.model_selection 模块提供了模型选择和评估的工具,用于评估模型性能、选择最佳模型和优化模型参数。模型选择和评估是机器学习流程中至关重要的一步,它可以帮助我们构建可靠且泛化能力强的模型。

常用的模型选择和评估技术:

  • 训练集-测试集划分 (Train-Test Split): 将数据集划分为训练集和测试集,训练集用于模型训练,测试集用于评估模型在未见过数据上的性能。常用 train_test_split

  • 交叉验证 (Cross-Validation): 将数据集划分为多个 folds,轮流使用其中一个 fold 作为验证集,其余 folds 作为训练集,多次评估模型性能,取平均值作为最终评估结果。常用的交叉验证方法包括 KFold (K 折交叉验证), StratifiedKFold (分层 K 折交叉验证,用于保持类别比例), cross_val_score (直接计算交叉验证得分), cross_validate (返回更详细的交叉验证结果)。

  • 网格搜索 (GridSearchCV): 用于系统地搜索模型超参数的最佳组合。用户指定超参数的候选值列表,网格搜索会遍历所有可能的组合,使用交叉验证评估每种组合的性能,并选择性能最佳的组合。

  • 随机搜索 (RandomizedSearchCV): 与网格搜索类似,但不是遍历所有可能的组合,而是在超参数空间中随机采样一定数量的组合进行评估。随机搜索在超参数空间较大时更有效率。

代码实践:

from sklearn.model_selection import train_test_split, KFold, StratifiedKFold, cross_val_score, GridSearchCV, RandomizedSearchCV from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_iris import numpy as np # 加载鸢尾花数据集 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, stratify=y) # stratify=y 保证训练集和测试集中类别比例一致 print("训练集形状:", X_train.shape) print("测试集形状:", X_test.shape) # K 折交叉验证 (KFold) kf = KFold(n_splits=5, shuffle=True, random_state=42) # 5 折交叉验证,shuffle=True 打乱数据 model = LogisticRegression(solver='liblinear', multi_class='ovr', random_state=42) scores_kf = cross_val_score(model, X_train, y_train, cv=kf, scoring='accuracy') # 使用交叉验证评估模型准确率 print("K 折交叉验证得分:", scores_kf) print("K 折交叉验证平均得分:", np.mean(scores_kf)) # 分层 K 折交叉验证 (StratifiedKFold) skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) # 5 折分层交叉验证 scores_skf = cross_val_score(model, X_train, y_train, cv=skf, scoring='accuracy') print("分层 K 折交叉验证得分:", scores_skf) print("分层 K 折交叉验证平均得分:", np.mean(scores_skf)) # 网格搜索 (GridSearchCV) param_grid = {'C': [0.1, 1, 10, 100], 'penalty': ['l1', 'l2']} # 定义超参数网格 grid_search = GridSearchCV(LogisticRegression(solver='liblinear', multi_class='ovr', random_state=42), param_grid, cv=3, scoring='accuracy') # 3 折交叉验证,评估指标为准确率 grid_search.fit(X_train, y_train) print("最佳超参数组合:", grid_search.best_params_) print("最佳模型得分:", grid_search.best_score_) best_model_grid = grid_search.best_estimator_ # 获取最佳模型 # 随机搜索 (RandomizedSearchCV) param_dist = {'C': np.logspace(-3, 3, 7), 'penalty': ['l1', 'l2']} # 定义超参数分布 random_search = RandomizedSearchCV(LogisticRegression(solver='liblinear', multi_class='ovr', random_state=42), param_dist, n_iter=10, cv=3, scoring='accuracy', random_state=42) # 随机搜索 10 组超参数,3 折交叉验证 random_search.fit(X_train, y_train) print("最佳超参数组合 (随机搜索):", random_search.best_params_) print("最佳模型得分 (随机搜索):", random_search.best_score_) best_model_random = random_search.best_estimator_ # 获取最佳模型

sklearn.model_selection 模块总结:

  • 提供了丰富的模型选择和评估工具,用于评估模型性能和优化模型参数。

  • 训练集-测试集划分、交叉验证、网格搜索和随机搜索是常用的模型评估和优化方法。

  • 合理的模型选择和评估可以帮助我们构建泛化能力强且可靠的机器学习模型。

1.2.5 sklearn.linear_model 模块:线性模型

sklearn.linear_model 模块包含了各种线性模型,用于解决回归和分类问题。线性模型简单高效,易于理解和解释,是机器学习中最基础和重要的模型之一。

常用的线性模型:

  • 线性回归 (Linear Regression): 用于回归问题,预测连续型目标变量。常用 LinearRegression

  • 岭回归 (Ridge Regression): 线性回归的正则化版本,通过 L2 正则化防止过拟合。常用 Ridge

  • Lasso 回归 (Lasso Regression): 线性回归的正则化版本,通过 L1 正则化进行特征选择和防止过拟合。常用 Lasso

  • 逻辑回归 (Logistic Regression): 用于二分类和多分类问题,预测类别型目标变量。常用 LogisticRegression

  • 感知机 (Perceptron): 二分类线性模型,是神经网络的基础。常用 Perceptron

代码实践:

from sklearn.linear_model import LinearRegression, Ridge, Lasso, LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, accuracy_score from sklearn.datasets import load_boston, load_iris # 回归模型示例 (波士顿房价数据集) boston = load_boston() X_reg, y_reg = boston.data, boston.target X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.3, random_state=42) # 线性回归 linear_reg = LinearRegression() linear_reg.fit(X_train_reg, y_train_reg) y_pred_linear_reg = linear_reg.predict(X_test_reg) mse_linear_reg = mean_squared_error(y_test_reg, y_pred_linear_reg) print("线性回归均方误差:", mse_linear_reg) # 岭回归 ridge_reg = Ridge(alpha=1.0) # alpha 为正则化强度 ridge_reg.fit(X_train_reg, y_train_reg) y_pred_ridge_reg = ridge_reg.predict(X_test_reg) mse_ridge_reg = mean_squared_error(y_test_reg, y_pred_ridge_reg) print("岭回归均方误差:", mse_ridge_reg) # Lasso 回归 lasso_reg = Lasso(alpha=0.1) # alpha 为正则化强度 lasso_reg.fit(X_train_reg, y_train_reg) y_pred_lasso_reg = lasso_reg.predict(X_test_reg) mse_lasso_reg = mean_squared_error(y_test_reg, y_pred_lasso_reg) print("Lasso 回归均方误差:", mse_lasso_reg) # 分类模型示例 (鸢尾花数据集) iris = load_iris() X_clf, y_clf = iris.data, iris.target X_train_clf, X_test_clf, y_train_clf, y_test_clf = train_test_split(X_clf, y_clf, test_size=0.3, random_state=42, stratify=y_clf) # 逻辑回归 logistic_reg = LogisticRegression(solver='liblinear', multi_class='ovr', random_state=42) logistic_reg.fit(X_train_clf, y_train_clf) y_pred_logistic_reg = logistic_reg.predict(X_test_clf) accuracy_logistic_reg = accuracy_score(y_test_clf, y_pred_logistic_reg) print("逻辑回归准确率:", accuracy_logistic_reg)

sklearn.linear_model 模块总结:

  • 提供了各种常用的线性模型,包括回归和分类模型。

  • 线性模型简单高效,易于理解和解释,适用于多种场景。

  • 可以通过正则化技术 (岭回归、Lasso 回归) 防止过拟合和进行特征选择。

1.2.6 sklearn.tree 模块:决策树

sklearn.tree 模块提供了决策树模型及其集成算法,用于解决分类和回归问题。决策树模型直观易懂,可解释性强,并且可以处理非线性关系。

常用的决策树模型:

  • 决策树分类器 (DecisionTreeClassifier): 用于分类问题。

  • 决策树回归器 (DecisionTreeRegressor): 用于回归问题。

  • 随机森林分类器 (RandomForestClassifier): 基于决策树的集成算法,通过构建多棵决策树并进行投票或平均预测结果,提高模型性能和鲁棒性。

  • 随机森林回归器 (RandomForestRegressor): 基于决策树的集成算法,用于回归问题。

  • 梯度提升树 (Gradient Boosting Trees, GBT): 一种强大的集成算法,通过迭代地训练新的决策树来纠正之前模型的错误,逐步提升模型性能。Scikit-learn 中通过 sklearn.ensemble 模块提供 GradientBoostingClassifierGradientBoostingRegressor


发布者: 作者: 转发
评论区 (0)
U