Scikit-learn 基础 Scikit-learn 基础详解:从入门到实践 1. Scikit-learn 的核心概念 在深入代码之前,我们首先需要了解 Scikit-learn 的几个核心概念,这些概念贯穿于库的各个模块,是理解和使用 Scikit-learn 的基石。 Estimator (估计器): Estimator 是 Scikit-learn 中的核心对象,它是一个实现了 方法和 方法的类。简单来说,Estimator 可以从数据中学习 (fit),并对新的数据进行预测 (predict)。 机器学习中的模型 (如分类器、回归器、聚类器) 和数据预处理工具 (如标准化器、特征选择器) 都属于 Estimator。
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 进行机器学习任务,通常遵循以下基本流程:
数据加载与准备: 加载数据集,并进行初步的数据探索和清洗。将数据划分为特征矩阵 (X) 和目标向量 (y)。
数据预处理与特征工程: 根据数据特点和模型需求,选择合适的 Transformer 进行数据预处理,例如标准化、归一化、缺失值处理、特征选择、特征降维等。
模型选择: 根据任务类型 (分类、回归、聚类等) 和数据特点,选择合适的 Estimator (模型)。
模型训练: 使用训练数据 (X_train, y_train) 调用 Estimator 的 fit() 方法进行模型训练。
模型评估: 使用测试数据 (X_test, y_test) 调用 Estimator 的 predict() 方法进行预测,并使用合适的评估指标 (如准确率、精确率、召回率、F1-score、均方误差等) 评估模型性能。
模型调优 (可选): 如果模型性能不佳,可以进行模型调优,例如调整模型参数、尝试不同的模型、进行特征工程等。
模型部署 (可选): 将训练好的模型部署到实际应用场景中。
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_train 和 X_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 会依次执行列表中的每个步骤:首先使用 StandardScaler 对 X_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,并为您的机器学习之旅打下坚实的基础。