2.1 估计器 (Estimator) Scikit-learn 核心概念:估计器 (Estimator) 详解 Scikit-learn (也称为 sklearn) 是 Python 中最受欢迎的机器学习库之一。它提供了一系列用于分类、回归、聚类、降维、模型选择和预处理的有效工具。Scikit-learn 的核心设计理念围绕着估计器 (Estimator) 这一概念展开。理解估计器是掌握 Scikit-learn 的关键。 什么是估计器 (Estimator)? 在 Scikit-learn 中,估计器 (Estimator) 是一个实现了 方法和 方法的 Python 类。 简单来说,估计器是用于学习数据模式和进行预测的对象。
Scikit-learn (也称为 sklearn) 是 Python 中最受欢迎的机器学习库之一。它提供了一系列用于分类、回归、聚类、降维、模型选择和预处理的有效工具。Scikit-learn 的核心设计理念围绕着估计器 (Estimator) 这一概念展开。理解估计器是掌握 Scikit-learn 的关键。
在 Scikit-learn 中,估计器 (Estimator) 是一个实现了 fit(X, y) 方法和 predict(X) 方法的 Python 类。 简单来说,估计器是用于学习数据模式和进行预测的对象。它们是 Scikit-learn 的基石,几乎所有的机器学习模型和数据预处理工具都以估计器的形式提供。
核心特点:
一致的接口: 所有 Scikit-learn 的估计器都遵循统一的接口设计,这使得在不同的模型和预处理步骤之间切换变得非常容易。
参数化: 估计器通常包含可以调整的参数(也称为超参数),用于控制模型的行为。
学习和预测: 估计器通过 fit() 方法从数据中学习,并通过 predict() 方法对新数据进行预测。
可以把估计器想象成一个“学习机器”或“模型工厂”。 你给它一些数据 (通过 fit() 方法),它会“学习”数据中的规律,然后你可以用它来预测新的、未知的数据 (通过 predict() 方法)。
Scikit-learn 中的估计器可以根据其功能大致分为以下几类:
监督学习估计器 (Supervised Learning Estimators): 用于解决监督学习问题,即学习输入特征 X 和目标变量 y 之间的映射关系。
分类器 (Classifiers): 用于预测离散的目标变量(类别标签)。例如,逻辑回归 (LogisticRegression)、支持向量机 (SVC)、决策树 (DecisionTreeClassifier)、随机森林 (RandomForestClassifier) 等。
回归器 (Regressors): 用于预测连续的目标变量(数值)。例如,线性回归 (LinearRegression)、岭回归 (Ridge)、套索回归 (Lasso)、决策树回归 (DecisionTreeRegressor)、随机森林回归 (RandomForestRegressor) 等。
无监督学习估计器 (Unsupervised Learning Estimators): 用于解决无监督学习问题,即在没有目标变量的情况下,从数据 X 中学习模式。
聚类器 (Clustering Estimators): 用于将数据点划分为不同的组(簇)。例如,K-均值聚类 (KMeans)、DBSCAN (DBSCAN)、层次聚类 (AgglomerativeClustering) 等。
降维器 (Dimensionality Reduction Estimators): 用于减少数据的维度,同时保留尽可能多的信息。例如,主成分分析 (PCA)、奇异值分解 (TruncatedSVD)、t-分布邻域嵌入 (TSNE) 等。
特征提取器 (Feature Extraction Estimators): 用于从原始数据中提取有用的特征。例如,词袋模型 (CountVectorizer)、TF-IDF 转换器 (TfidfVectorizer)、图像特征提取器 (如 PCA 也可用于特征提取) 等。
预处理估计器 (Preprocessing Estimators): 用于数据预处理,例如特征缩放、特征编码、缺失值处理等。
缩放器 (Scalers): 用于将特征缩放到一定的范围。例如,标准化 (StandardScaler)、最小-最大缩放 (MinMaxScaler)、鲁棒缩放 (RobustScaler) 等。
编码器 (Encoders): 用于将类别特征转换为数值特征。例如,独热编码 (OneHotEncoder)、标签编码 (LabelEncoder)、有序编码 (OrdinalEncoder) 等。
缺失值处理器 (Imputers): 用于处理数据中的缺失值。例如,均值填充 (SimpleImputer)、K-最近邻填充 (KNNImputer)、迭代填充 (IterativeImputer) 等。
模型选择与评估估计器 (Model Selection and Evaluation Estimators): 用于模型评估、参数调优和模型选择。
交叉验证器 (Cross-validation): 用于评估模型的泛化能力。例如,K 折交叉验证 (KFold)、分层 K 折交叉验证 (StratifiedKFold)、留一交叉验证 (LeaveOneOut) 等。
网格搜索与随机搜索 (GridSearchCV, RandomizedSearchCV): 用于寻找最佳的超参数组合。
评估指标 (Metrics): 用于评估模型的性能。例如,准确率 (accuracy_score)、精确率 (precision_score)、召回率 (recall_score)、F1 分数 (f1_score)、均方误差 (mean_squared_error)、R 方 (r2_score) 等。
所有 Scikit-learn 估计器都遵循一套通用的 API,其中最核心的方法包括:
fit(X, y=None): 训练模型。
X: 训练数据特征矩阵。通常是一个 NumPy 数组或 Pandas DataFrame,形状为 (n_samples, n_features),其中 n_samples 是样本数量,n_features 是特征数量。
y: (仅监督学习估计器需要) 训练数据的目标变量。通常是一个 NumPy 数组或 Pandas Series,形状为 (n_samples,)。
返回值: self (估计器自身),允许链式调用。
功能: fit() 方法是估计器学习数据模式的关键步骤。它根据提供的训练数据 (X, y) (对于监督学习) 或 X (对于无监督学习) 来调整模型的内部参数。这个过程也被称为模型训练 或 模型拟合。
内部状态: fit() 方法执行后,估计器会学习到一些内部状态,这些状态存储在估计器的属性中,通常以 下划线 _ 结尾。例如,线性回归模型训练后,其系数会存储在 coef_ 属性中,截距会存储在 intercept_ 属性中。
predict(X): 使用训练好的模型进行预测。
X: 待预测的数据特征矩阵。形状与 fit() 方法中的 X 相同,即 (n_samples, n_features)。
返回值: 预测结果。对于分类器,返回预测的类别标签;对于回归器,返回预测的数值;对于聚类器,返回簇标签。
功能: predict() 方法使用 fit() 方法学习到的模型参数,对新的输入数据 X 进行预测。它将数据 X 输入到训练好的模型中,并返回模型的预测结果。
transform(X): 数据转换。
X: 待转换的数据特征矩阵。形状与 fit() 方法中的 X 相同。
返回值: 转换后的数据特征矩阵。形状可能与输入 X 不同,取决于具体的转换器。
功能: transform() 方法用于对数据进行转换,例如特征缩放、降维、特征提取等。这个方法通常用于预处理估计器和降维估计器。它利用 fit() 方法学习到的转换规则,将输入数据 X 转换为新的表示形式。
fit_transform(X, y=None): 先训练模型,再进行数据转换。
X: 训练数据特征矩阵。
y: (可选) 训练数据的目标变量。
返回值: 转换后的训练数据特征矩阵。
功能: fit_transform() 方法是 fit() 方法和 transform() 方法的组合。它首先调用 fit(X, y) 方法学习转换规则,然后再使用学习到的规则对输入数据 X 进行转换。在训练数据上进行预处理时,通常使用 fit_transform() 方法,而在测试数据或新数据上进行预处理时,则使用 transform() 方法。 这样可以避免信息泄露,保证模型评估的可靠性。
score(X, y): 评估模型性能。
X: 测试数据特征矩阵。
y: 测试数据的真实目标变量。
返回值: 模型的评分。评分指标取决于具体的估计器类型。对于分类器,通常是准确率 (accuracy);对于回归器,通常是 R 方 (R-squared)。
功能: score() 方法用于评估模型在测试数据上的性能。它根据给定的测试数据 (X, y),计算模型的评分指标。评分指标越高,通常表示模型性能越好。
get_params(deep=True): 获取估计器的参数。
deep: 布尔值,默认为 True。如果为 True,则递归获取所有子估计器的参数。
返回值: 一个包含估计器参数的字典。
功能: get_params() 方法用于获取估计器的所有可设置的参数及其当前值。这对于理解估计器的配置和进行参数调优非常有用。
set_params(**params): 设置估计器的参数。
**params: 要设置的参数,以关键字参数的形式传入。
返回值: self (估计器自身),允许链式调用。
功能: set_params() 方法用于设置估计器的参数。可以通过字典或关键字参数的形式传入要设置的参数及其新值。这对于调整模型的超参数非常重要。
为了更好地理解估计器的使用,我们通过一些代码示例来演示不同类型估计器的应用。
4.1 监督学习:分类器 (Classifier)
我们使用经典的 Iris (鸢尾花) 数据集,演示如何使用 LogisticRegression 分类器进行分类。
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 # 1. 加载数据集 iris = load_iris() X, y = iris.data, iris.target # 2. 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 3. 创建 LogisticRegression 分类器估计器 logistic_reg = LogisticRegression(random_state=42, max_iter=1000) # 可以设置超参数 # 4. 训练模型 (使用 fit 方法) logistic_reg.fit(X_train, y_train) # 5. 预测 (使用 predict 方法) y_pred = logistic_reg.predict(X_test) # 6. 评估模型性能 (使用 score 方法 或其他评估指标) accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy:.2f}") # 输出 Accuracy: 0.97 # 7. 获取模型参数 (使用 get_params 方法) params = logistic_reg.get_params() print(f"Model parameters: {params}") # 8. 设置模型参数 (使用 set_params 方法) logistic_reg.set_params(C=0.1) # 调整正则化强度 print(f"Updated parameters: {logistic_reg.get_params()}")
代码详解:
加载数据集: 使用 load_iris() 函数加载 Iris 数据集。
划分数据集: 使用 train_test_split() 函数将数据集划分为训练集和测试集。
创建估计器: 创建 LogisticRegression 分类器实例。可以设置超参数,例如 random_state 用于控制随机性,max_iter 设置最大迭代次数。
训练模型: 调用 fit(X_train, y_train) 方法,使用训练数据训练 LogisticRegression 模型。模型会学习特征 X_train 和目标变量 y_train 之间的关系。
预测: 调用 predict(X_test) 方法,使用训练好的模型对测试集 X_test 进行预测,得到预测结果 y_pred。
评估模型: 使用 accuracy_score(y_test, y_pred) 函数计算模型的准确率,评估模型在测试集上的性能。
获取参数: 使用 get_params() 方法获取 LogisticRegression 模型的所有参数及其当前值。
设置参数: 使用 set_params(C=0.1) 方法设置模型的 C 参数 (正则化强度)。
4.2 监督学习:回归器 (Regressor)
我们使用 Boston Housing (波士顿房价) 数据集,演示如何使用 LinearRegression 回归器进行回归预测。
from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 1. 加载数据集 boston = load_boston() X, y = boston.data, boston.target # 2. 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 3. 创建 LinearRegression 回归器估计器 linear_reg = LinearRegression() # 4. 训练模型 (使用 fit 方法) linear_reg.fit(X_train, y_train) # 5. 预测 (使用 predict 方法) y_pred = linear_reg.predict(X_test) # 6. 评估模型性能 (使用 score 方法 或其他评估指标) mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) print(f"Mean Squared Error: {mse:.2f}") # 输出 Mean Squared Error: 21.52 print(f"R-squared: {r2:.2f}") # 输出 R-squared: 0.71 # 7. 查看模型系数和截距 print(f"Coefficients: {linear_reg.coef_}") print(f"Intercept: {linear_reg.intercept_}")
代码详解:
代码结构与分类器示例类似,主要区别在于:
使用 LinearRegression 回归器 代替 LogisticRegression 分类器。
评估指标使用均方误差 (mean_squared_error) 和 R 方 (r2_score),而不是准确率。
可以查看回归模型的系数 (coef_) 和截距 (intercept_),这些是模型训练后学习到的内部状态。
4.3 无监督学习:聚类器 (Clustering Estimator)
我们使用 Iris 数据集,演示如何使用 KMeans 聚类器进行聚类分析。
from sklearn.datasets import load_iris from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score # 1. 加载数据集 iris = load_iris() X = iris.data # 聚类是无监督学习,不需要目标变量 y # 2. 创建 KMeans 聚类器估计器 kmeans = KMeans(n_clusters=3, random_state=42) # 设置簇的数量 # 3. 训练模型并进行聚类 (使用 fit_predict 方法 或先 fit 再 predict) cluster_labels = kmeans.fit_predict(X) # fit_predict 一步完成训练和预测 # 或者: # kmeans.fit(X) # cluster_labels = kmeans.predict(X) # 4. 评估聚类效果 (使用 silhouette_score 等指标) silhouette_avg = silhouette_score(X, cluster_labels) print(f"Silhouette Score: {silhouette_avg:.2f}") # 输出 Silhouette Score: 0.55 # 5. 查看簇中心点 print(f"Cluster Centers: {kmeans.cluster_centers_}")
代码详解:
聚类是无监督学习,所以 fit() 方法只需要输入特征矩阵 X,不需要目标变量 y。
fit_predict(X) 方法将训练和预测 (聚类) 步骤合并在一起。 也可以先使用 fit(X) 训练模型,再使用 predict(X) 进行聚类。
评估聚类效果可以使用轮廓系数 (silhouette_score) 等指标。
可以查看聚类后的簇中心点 (cluster_centers_),这是 KMeans 模型训练后学习到的内部状态。
4.4 预处理:缩放器 (Scaler)
我们使用 Boston Housing 数据集,演示如何使用 StandardScaler 进行特征标准化。
from sklearn.datasets import load_boston from sklearn.preprocessing import StandardScaler import numpy as np # 1. 加载数据集 boston = load_boston() X = boston.data # 2. 创建 StandardScaler 缩放器估计器 scaler = StandardScaler() # 3. 训练缩放器并进行数据转换 (使用 fit_transform 方法) X_scaled = scaler.fit_transform(X) # fit_transform 一步完成训练和转换 # 或者: # scaler.fit(X) # X_scaled = scaler.transform(X) # 4. 查看缩放后的数据 (部分数据) print("Original data (first 5 samples):\n", X[:5]) print("\nScaled data (first 5 samples):\n", X_scaled[:5]) # 5. 查看缩放器的均值和标准差 (学习到的参数) print("\nMean of each feature after scaling:\n", np.mean(X_scaled, axis=0)) # 接近 0 print("\nStandard deviation of each feature after scaling:\n", np.std(X_scaled, axis=0)) # 接近 1
代码详解:
预处理估计器也遵循 fit 和 transform 方法。
fit_transform(X) 方法用于在训练数据上训练缩放器并进行转换。
transform(X) 方法用于使用训练好的缩放器对新数据进行转换。
StandardScaler 将数据标准化为均值为 0,标准差为 1 的分布。
可以查看缩放器学习到的均值 (mean_) 和标准差 (scale_),这些是模型训练后学习到的内部状态。
估计器 (Estimator) 是 Scikit-learn 的核心概念。 理解估计器的原理和使用方法是掌握 Scikit-learn 的关键。
核心要点回顾:
统一的接口: 所有 Scikit-learn 估计器都遵循 fit(X, y) 和 predict(X) (以及 transform(X), fit_transform(X), score(X, y), get_params(), set_params()) 等通用方法。
不同的类型: Scikit-learn 提供了各种类型的估计器,用于解决监督学习、无监督学习、数据预处理和模型选择等不同类型的机器学习任务。
fit() 方法是学习的关键: fit() 方法用于从数据中学习模型参数或转换规则。
predict() 和 transform() 方法是应用的关键: predict() 方法用于进行预测,transform() 方法用于数据转换。
fit_transform() 方法用于高效的训练数据转换: fit_transform() 方法结合了训练和转换步骤,在训练数据预处理时非常方便。
score() 方法用于模型评估: score() 方法用于评估模型在测试数据上的性能。
get_params() 和 set_params() 方法用于参数管理: 这两个方法用于获取和设置估计器的参数,方便进行模型配置和参数调优。
通过本文的详细讲解和代码示例,相信您对 Scikit-learn 估计器有了更深入的理解。掌握估计器是使用 Scikit-learn 进行机器学习建模的基础,希望本文能帮助您更好地入门和应用 Scikit-learn。