Scikit-learn:estimator 对象
在 Scikit-learn 中几乎所有机器学习功能都是围绕一种统一的核心对象展开的这种对象通常叫作 estimator 对象。无论是做分类、回归、聚类还是做数据标准化、降维、特征选择我们在代码中接触到的大多数“模型”或“处理器”本质上都可以看作 estimator 对象。理解 estimator 对象有助于把 Scikit-learn 看成一个结构统一、接口一致的机器学习工具库而不是一堆彼此分散的函数。一、什么是 estimator 对象estimator 可以直译为“估计器”。estimator 对象是遵循 Scikit-learn 统一接口约定的对象通常通过 fit 从数据中学习参数、结构或统计量并进一步提供预测、变换或评分等能力。例如• 线性回归模型是 estimator• 决策树分类器是 estimator• KMeans 聚类器是 estimator• StandardScaler 标准化器也是 estimator• PCA 降维器也是 estimator这说明estimator 并不只指“预测模型”也包括各种数据变换器。二、为什么 Scikit-learn 要使用 estimator 对象Scikit-learn 的一个重要特点就是接口统一。如果不同算法各自使用完全不同的调用方式那么学习成本会很高代码也难以组合。而 estimator 对象的意义就在于把各种算法都包装成一类具有统一使用方式的对象。例如不同算法虽然内部原理差别很大但通常都遵循类似的基本过程• 先创建对象• 再用数据进行训练或拟合• 然后进行预测、变换或评分不同 estimator 虽然内部原理差别很大但通常都遵循类似的基本使用方式不过它们并不一定同时具备 predict、transform 和 score 这些方法。这种统一设计使得• 不同模型之间更容易替换• 管道Pipeline更容易构建• 交叉验证与网格搜索更容易复用• 整体代码风格更整齐因此estimator 对象可以看作是 Scikit-learn 统一接口思想的核心载体。三、estimator 的基本使用方式一个 estimator 对象最常见的使用过程通常分为两步。1、创建对象先根据需要选择某个算法并创建对应对象。例如from sklearn.linear_model import LinearRegression model LinearRegression()这里的 model 就是一个 estimator 对象。2、调用 fit() 进行拟合model.fit(X, y)fit() 的作用是让 estimator 根据数据学习参数、结构或必要的统计量。对于监督学习任务通常使用fit(X, y)其中• X 是特征矩阵• y 是目标变量而对于某些无监督学习任务则可能只需要fit(X)例如聚类、降维、标准化等。四、不同类型的 estimator虽然 estimator 的接口风格比较统一但它们的功能并不完全相同。estimator 是总称分类器、回归器、聚类器、变换器都属于 estimator 的不同类型。1、分类器用于分类任务学习样本属于哪一类。例如• 逻辑回归 LogisticRegression• 决策树 DecisionTreeClassifier• K 近邻 KNeighborsClassifier这类 estimator 在拟合之后通常可以对新样本调用 predict() 给出类别结果。2、回归器用于回归任务预测连续数值。例如• 线性回归 LinearRegression• 岭回归 Ridge• 决策树回归 DecisionTreeRegressor这类 estimator 在拟合后也常通过 predict() 输出预测值。3、聚类器用于无监督学习中的聚类任务。例如• K 均值聚类 KMeans• 基于密度的带噪声应用空间聚类 DBSCAN它们通常不依赖监督目标 y而是从 X 中发现数据的分组结构。4、变换器用于对数据进行转换、缩放、编码或降维。例如• 标准化器 StandardScaler• 最小—最大缩放器 MinMaxScaler• 主成分分析 PCA这类对象通常除了 fit() 之外还常配合 transform() 使用。五、estimator 的常见方法不同 estimator 支持的方法不完全相同但一些方法非常常见。1、fit()fit() 用于让对象从数据中学习。model.fit(X, y)或者scaler.fit(X)这是几乎所有 estimator 最核心的方法。2、predict()predict() 常见于分类器和回归器用于对新数据做预测。y_pred model.predict(X_test)分类器输出类别回归器输出数值。3、transform()transform() 常见于变换器用于把原始数据转换成新的数据表示。X_scaled scaler.transform(X)例如标准化之后数据的数值范围或分布会发生变化但样本本身仍然是一一对应的。4、fit_transform()有些变换器同时提供 fit_transform()表示“先拟合再转换”。X_scaled scaler.fit_transform(X)这是一种方便写法尤其常用于预处理阶段。5、score()一些 estimator 提供 score() 方法用于快速评估模型效果。score model.score(X_test, y_test)不过不同 estimator 中 score() 的含义可能不同因此使用时应结合具体模型理解。例如分类器的默认 score() 常对应准确率回归器的默认 score() 常对应决定系数 R²。要注意的是不是每个 estimator 都同时具备 predict、transform 和 score。例如• 监督学习模型常见 predict• 变换器常见 transform• 一些 estimator 提供 score• GridSearchCV、Pipeline 这类复合对象会把底层 estimator 的能力进一步包装出来六、一个简单示例下面用线性回归说明 estimator 对象的基本使用方式。import numpy as npfrom sklearn.linear_model import LinearRegression # 构造简单数据X np.array([[1], [2], [3], [4], [5]])y np.array([2, 4, 6, 8, 10]) # 创建 estimator 对象model LinearRegression() # 拟合数据model.fit(X, y) # 预测新样本result model.predict([[6]]) print(预测结果, result)此例中• LinearRegression() 创建了一个 estimator 对象• fit(X, y) 让它根据样本学习线性关系• predict([[6]]) 则让它对新输入进行预测因此estimator 并不是某一个具体模型的名称而是对一类遵循统一接口规范的对象的统称。七、为什么说 estimator 是 Scikit-learn 的核心如果从更整体的角度看Scikit-learn 中很多高级功能其实都建立在 estimator 对象之上。例如• Pipeline 需要把多个 estimator 串联起来• GridSearchCV 需要接收一个 estimator 作为待搜索模型• 交叉验证工具通常也围绕 estimator 展开• 模型选择与比较本质上也是不同 estimator 之间的替换与评估也就是说很多工具之所以能够通用正是因为它们面对的不是彼此完全不同的算法而是一组遵循统一接口的 estimator 对象。因此可以说estimator 对象是 Scikit-learn 组织机器学习功能的基本单位。 小结estimator 对象是 Scikit-learn 中最核心的统一对象形式。无论是分类器、回归器、聚类器还是标准化器、降维器本质上都属于 estimator。它们通过统一的接口组织机器学习流程使模型训练、数据变换、预测与评估能够以一致的方式进行。“点赞有美意赞赏是鼓励”