1. Scikit-learn 基础


文档摘要

Scikit-learn 基础 Scikit-learn 基础详解:从入门到实践 1. Scikit-learn 的核心概念 在深入代码之前,我们首先需要了解 Scikit-learn 的几个核心概念,这些概念贯穿于库的各个模块,是理解和使用 Scikit-learn 的基石。 Estimator (估计器): Estimator 是 Scikit-learn 中的核心对象,它是一个实现了 方法和 方法的类。简单来说,Estimator 可以从数据中学习 (fit),并对新的数据进行预测 (predict)。 机器学习中的模型 (如分类器、回归器、聚类器) 和数据预处理工具 (如标准化器、特征选择器) 都属于 Estimator。

1. Scikit-learn 基础

Scikit-learn 基础详解:从入门到实践

1. Scikit-learn 的核心概念

在深入代码之前,我们首先需要了解 Scikit-learn 的几个核心概念,这些概念贯穿于库的各个模块,是理解和使用 Scikit-learn 的基石。

  • Estimator (估计器): Estimator 是 Scikit-learn 中的核心对象,它是一个实现了 fit(X, y) 方法和 predict(T) 方法的类。简单来说,Estimator 可以从数据中学习 (fit),并对新的数据进行预测 (predict)。 机器学习中的模型 (如分类器、回归器、聚类器) 和数据预处理工具 (如标准化器、特征选择器) 都属于 Estimator。

  • Transformer (转换器): Transformer 是一种特殊的 Estimator,它主要用于数据预处理和特征工程。Transformer 除了 fit(X, y) 方法外,还实现了 transform(X) 方法,用于将输入数据 X 转换成新的数据表示形式。例如,StandardScaler 用于标准化数据,PCA 用于降维。很多 Transformer 也实现了 fit_transform(X, y) 方法,用于在拟合数据的同时进行转换,提高效率。

  • Predictor (预测器): Predictor 也是一种特殊的 Estimator,主要用于监督学习任务,例如分类和回归。Predictor 实现了 predict(X) 方法,用于对输入数据 X 进行预测,返回预测结果。常见的 Predictor 包括 LinearRegression, LogisticRegression, DecisionTreeClassifier, RandomForestClassifier 等。

  • Dataset (数据集): Scikit-learn 内置了一些常用的数据集,方便用户快速进行模型训练和测试。这些数据集通常以 Bunch 对象的形式存在,包含数据 (data)、目标值 (target)、特征名称 (feature_names) 等属性。例如,著名的鸢尾花数据集 (iris dataset) 和波士顿房价数据集 (boston dataset) 都可以在 Scikit-learn 中直接加载。

  • Pipeline (管道): Pipeline 是一种将多个 Estimator 串联起来的工具,它可以将数据预处理、特征工程和模型训练等步骤整合到一个流程中。使用 Pipeline 可以简化代码,提高效率,并避免数据泄露等问题。

2. Scikit-learn 的基本流程

使用 Scikit-learn 进行机器学习任务,通常遵循以下基本流程:

  1. 数据加载与准备: 加载数据集,并进行初步的数据探索和清洗。将数据划分为特征矩阵 (X) 和目标向量 (y)。

  2. 数据预处理与特征工程: 根据数据特点和模型需求,选择合适的 Transformer 进行数据预处理,例如标准化、归一化、缺失值处理、特征选择、特征降维等。

  3. 模型选择: 根据任务类型 (分类、回归、聚类等) 和数据特点,选择合适的 Estimator (模型)。

  4. 模型训练: 使用训练数据 (X_train, y_train) 调用 Estimator 的 fit() 方法进行模型训练。

  5. 模型评估: 使用测试数据 (X_test, y_test) 调用 Estimator 的 predict() 方法进行预测,并使用合适的评估指标 (如准确率、精确率、召回率、F1-score、均方误差等) 评估模型性能。

  6. 模型调优 (可选): 如果模型性能不佳,可以进行模型调优,例如调整模型参数、尝试不同的模型、进行特征工程等。

  7. 模型部署 (可选): 将训练好的模型部署到实际应用场景中。

3. Scikit-learn 代码实践与详解

接下来,我们将通过具体的代码示例,详细讲解 Scikit-learn 的基本用法和常用模块。

3.1 数据加载与准备

Scikit-learn 提供了 datasets 模块,用于加载内置数据集和生成模拟数据。

from sklearn import datasets from sklearn.model_selection import train_test_split # 加载鸢尾花数据集 iris = datasets.load_iris() X = iris.data # 特征矩阵 y = iris.target # 目标向量 feature_names = iris.feature_names # 特征名称 target_names = iris.target_names # 目标类别名称 print("特征矩阵 (X) 的形状:", X.shape) print("目标向量 (y) 的形状:", y.shape) print("特征名称:", feature_names) print("目标类别名称:", target_names) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) print("训练集特征矩阵 (X_train) 的形状:", X_train.shape) print("测试集特征矩阵 (X_test) 的形状:", X_test.shape)

代码详解:

  • datasets.load_iris(): 加载鸢尾花数据集,返回一个 Bunch 对象。

  • iris.data, iris.target, iris.feature_names, iris.target_names: 分别获取数据集的特征矩阵、目标向量、特征名称和目标类别名称。

  • train_test_split(X, y, test_size=0.3, random_state=42): 将数据集划分为训练集和测试集。

    • test_size=0.3: 设置测试集占总数据集的比例为 30%。

    • random_state=42: 设置随机种子,保证每次划分结果一致,方便复现。

3.2 数据预处理

Scikit-learn 的 preprocessing 模块提供了多种数据预处理方法,包括标准化、归一化、编码、缺失值处理等。

3.2.1 标准化 (StandardScaler)

标准化将数据缩放到均值为 0,标准差为 1 的分布。适用于大多数机器学习算法,特别是基于距离的算法 (如 KNN, SVM, 神经网络)。

from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaler.fit(X_train) # 在训练集上拟合标准化器 X_train_scaled = scaler.transform(X_train) # 对训练集进行标准化 X_test_scaled = scaler.transform(X_test) # 对测试集进行标准化 print("原始训练集特征矩阵 (X_train) 的均值 (部分特征):", X_train[:5].mean(axis=0)) print("原始训练集特征矩阵 (X_train) 的标准差 (部分特征):", X_train[:5].std(axis=0)) print("标准化后训练集特征矩阵 (X_train_scaled) 的均值 (部分特征):", X_train_scaled[:5].mean(axis=0)) print("标准化后训练集特征矩阵 (X_train_scaled) 的标准差 (部分特征):", X_train_scaled[:5].std(axis=0))

代码详解:

  • StandardScaler(): 创建 StandardScaler 对象。

  • scaler.fit(X_train): 在训练集 X_train 上拟合标准化器,计算训练集的均值和标准差。

  • scaler.transform(X_train): 使用拟合好的标准化器对训练集 X_train 进行标准化,得到 X_train_scaled

  • scaler.transform(X_test): 使用 相同的 标准化器 (在训练集上拟合的) 对测试集 X_test 进行标准化,得到 X_test_scaled重要: 预处理器的拟合必须在训练集上进行,然后应用于训练集和测试集,以避免数据泄露。

3.2.2 归一化 (MinMaxScaler)

归一化将数据缩放到指定的范围,通常是 [0, 1] 或 [-1, 1]。适用于对数据范围敏感的算法,或者需要将特征缩放到统一范围的情况。

from sklearn.preprocessing import MinMaxScaler min_max_scaler = MinMaxScaler() min_max_scaler.fit(X_train) # 在训练集上拟合归一化器 X_train_minmax = min_max_scaler.transform(X_train) # 对训练集进行归一化 X_test_minmax = min_max_scaler.transform(X_test) # 对测试集进行归一化 print("原始训练集特征矩阵 (X_train) 的最小值 (部分特征):", X_train[:5].min(axis=0)) print("原始训练集特征矩阵 (X_train) 的最大值 (部分特征):", X_train[:5].max(axis=0)) print("归一化后训练集特征矩阵 (X_train_minmax) 的最小值 (部分特征):", X_train_minmax[:5].min(axis=0)) print("归一化后训练集特征矩阵 (X_train_minmax) 的最大值 (部分特征):", X_train_minmax[:5].max(axis=0))

代码详解:

  • MinMaxScaler(): 创建 MinMaxScaler 对象。

  • 用法与 StandardScaler 类似,fit() 方法在训练集上计算最小值和最大值,transform() 方法进行归一化。

3.3 模型选择与训练

Scikit-learn 的 linear_model, tree, neighbors, svm, naive_bayes 等模块提供了各种机器学习模型。

3.3.1 逻辑回归 (LogisticRegression)

逻辑回归是一种常用的分类算法,尤其适用于二分类问题。

from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 创建逻辑回归模型 logreg = LogisticRegression(random_state=42) # 使用标准化后的训练数据训练模型 logreg.fit(X_train_scaled, y_train) # 在测试集上进行预测 y_pred_logreg = logreg.predict(X_test_scaled) # 评估模型性能 (准确率) accuracy_logreg = accuracy_score(y_test, y_pred_logreg) print("逻辑回归模型在测试集上的准确率:", accuracy_logreg)

代码详解:

  • LogisticRegression(random_state=42): 创建 LogisticRegression 对象。random_state 用于设置随机种子,保证结果可复现。

  • logreg.fit(X_train_scaled, y_train): 使用标准化后的训练集 X_train_scaled 和对应的目标向量 y_train 训练逻辑回归模型。

  • logreg.predict(X_test_scaled): 使用训练好的模型对标准化后的测试集 X_test_scaled 进行预测,得到预测结果 y_pred_logreg

  • accuracy_score(y_test, y_pred_logreg): 计算预测结果 y_pred_logreg 与真实标签 y_test 之间的准确率。

3.3.2 决策树 (DecisionTreeClassifier)

决策树是一种基于树结构的分类算法,易于理解和解释。

from sklearn.tree import DecisionTreeClassifier # 创建决策树分类器 dtree = DecisionTreeClassifier(random_state=42) # 使用训练数据训练模型 (这里使用原始数据,未标准化) dtree.fit(X_train, y_train) # 在测试集上进行预测 y_pred_dtree = dtree.predict(X_test) # 评估模型性能 (准确率) accuracy_dtree = accuracy_score(y_test, y_pred_dtree) print("决策树模型在测试集上的准确率:", accuracy_dtree)

代码详解:

  • DecisionTreeClassifier(random_state=42): 创建 DecisionTreeClassifier 对象。

  • 用法与 LogisticRegression 类似,fit() 方法进行训练,predict() 方法进行预测。

  • 注意: 决策树模型通常对特征的尺度不敏感,因此这里使用了原始数据 X_trainX_test,没有进行标准化。

3.4 模型评估

Scikit-learn 的 metrics 模块提供了各种模型评估指标,包括分类指标 (准确率、精确率、召回率、F1-score、AUC 等) 和回归指标 (均方误差、平均绝对误差、R 平方等)。

除了 accuracy_score 之外,常用的分类评估指标还包括:

from sklearn.metrics import classification_report, confusion_matrix # 分类报告 (包含精确率、召回率、F1-score 等) print("逻辑回归模型分类报告:") print(classification_report(y_test, y_pred_logreg, target_names=target_names)) print("\n决策树模型分类报告:") print(classification_report(y_test, y_pred_dtree, target_names=target_names)) # 混淆矩阵 print("\n逻辑回归模型混淆矩阵:") print(confusion_matrix(y_test, y_pred_logreg)) print("\n决策树模型混淆矩阵:") print(confusion_matrix(y_test, y_pred_dtree))

代码详解:

  • classification_report(y_test, y_pred, target_names=target_names): 生成分类报告,包含每个类别的精确率 (precision)、召回率 (recall)、F1-score 和支持度 (support),以及宏平均 (macro avg) 和加权平均 (weighted avg)。

  • confusion_matrix(y_test, y_pred): 生成混淆矩阵,用于可视化模型在每个类别上的预测情况。

3.5 Pipeline 的使用

Pipeline 可以将数据预处理和模型训练步骤串联起来,简化代码并提高效率。

from sklearn.pipeline import Pipeline # 创建 Pipeline pipeline_logreg = Pipeline([ ('scaler', StandardScaler()), # 第一步: 标准化 ('classifier', LogisticRegression(random_state=42)) # 第二步: 逻辑回归分类器 ]) # 使用 Pipeline 训练模型 pipeline_logreg.fit(X_train, y_train) # 注意: 这里使用原始的 X_train 和 y_train,Pipeline 会自动进行标准化 # 使用 Pipeline 进行预测 y_pred_pipeline_logreg = pipeline_logreg.predict(X_test) # 注意: 这里使用原始的 X_test,Pipeline 会自动进行标准化 # 评估 Pipeline 模型的性能 (准确率) accuracy_pipeline_logreg = accuracy_score(y_test, y_pred_pipeline_logreg) print("Pipeline 逻辑回归模型在测试集上的准确率:", accuracy_pipeline_logreg)

代码详解:

  • Pipeline([...]): 创建一个 Pipeline 对象,参数是一个列表,列表中的每个元素是一个元组,元组的第一个元素是步骤的名称 (字符串),第二个元素是 Estimator 对象 (Transformer 或 Predictor)。

  • pipeline_logreg.fit(X_train, y_train): 使用 Pipeline 训练模型。Pipeline 会依次执行列表中的每个步骤:首先使用 StandardScalerX_train 进行标准化,然后将标准化后的数据传递给 LogisticRegression 进行训练。

  • pipeline_logreg.predict(X_test): 使用 Pipeline 进行预测。Pipeline 会对 X_test 进行相同的预处理 (标准化),然后使用训练好的 LogisticRegression 模型进行预测。

4. 总结与展望

本文详细介绍了 Scikit-learn 的基础知识,包括核心概念、基本流程和常用模块。通过代码示例,我们学习了如何使用 Scikit-learn 进行数据加载、数据预处理、模型选择、模型训练和模型评估。Pipeline 的使用进一步简化了机器学习流程。

Scikit-learn 作为一个功能强大且易于使用的机器学习库,为我们提供了丰富的工具和方法。掌握 Scikit-learn 的基础知识是进行机器学习实践的重要一步。在未来的学习中,您可以进一步探索 Scikit-learn 的高级特性,例如模型选择与调优、交叉验证、集成学习、聚类分析、降维技术等,并将其应用于更复杂的实际问题中。

希望本文能够帮助您入门 Scikit-learn,并为您的机器学习之旅打下坚实的基础。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U