.. currentmodule:: sklearn .. _glossary: ========================================= 常用术语和API元素词汇表 ========================================= 本词汇表旨在明确表示Scikit-learn及其API中应用的隐含和显式约定,同时为用户和贡献者提供参考。其目的是描述概念,并详细说明其对应的API或链接到文档中其他相关部分。通过从API参考和用户指南链接到词汇表条目,我们可以减少冗余和不一致性。 我们首先列出一般概念(以及任何不适用于其他部分的术语),但更具体的术语集合列在下面::ref:`glossary_estimator_types` 、:ref:`glossary_target_types` 、:ref:`glossary_methods` 、:ref:`glossary_parameters` 、:ref:`glossary_attributes` 、:ref:`glossary_sample_props` 。 一般概念 ================ .. glossary:: 一维 一维数组 一维数组。一个 ``.shape`` 长度为1的NumPy数组。一个向量。 二维 二维数组 二维数组。一个 ``.shape`` 长度为2的NumPy数组。通常表示一个矩阵。 API 指的是在Scikit-learn中实现的估计器的*特定*接口,以及本词汇表和:ref:`贡献者文档中概述的` 跨类型估计器的*广义*约定。 Scikit-learn的公共API主要在:ref:`api_ref` 中记录。然而,如果我们考虑任何访问它所需的标识符都不以 ``_`` 开头,我们不太正式地认为它是公共API。我们通常会尽力维护公共API中所有对象的:term:`向后兼容性` 。 以 ``_`` 开头的私有API,包括函数、模块和方法,不保证稳定性。 类数组 Scikit-learn 估计器和函数的 *输入* 最常见的数据格式是类数组类型,即任何可以通过 :func:`numpy.asarray` 生成适当形状(通常是 1 维或 2 维)和适当数据类型(通常是数值型)数组的对象。 这包括: * numpy 数组 * 数字列表 * 固定长度 k 的数字列表的列表 * 所有列均为数值型的 :class:`pandas.DataFrame` * 数值型的 :class:`pandas.Series` 它不包括: * :term:`稀疏矩阵` * 稀疏数组 * 迭代器 * 生成器 请注意,scikit-learn 估计器和函数的 *输出*(例如预测结果)通常应为数组或稀疏矩阵,或者是这些对象的列表(例如多输出 :class:`tree.DecisionTreeClassifier` 的 ``predict_proba`` )。返回列表或 `pandas.Series` 的估计器 ``predict()`` 方法是不合法的。 attribute attributes 我们主要使用属性来指代模型信息在拟合过程中存储在估计器上的方式。任何存储在估计器实例上的公共属性都必须以字母字符开头,并且在 :term:`fit` 或 :term:`partial_fit` 中设置时以单个下划线结尾。这些属性在估计器的 *Attributes* 文档中进行了说明。存储在属性中的信息通常是:用于预测或转换的充分统计量;:term:`直推式` 输出,如 :term:`labels_` 或 :term:`embedding_` ;或诊断数据,如 :term:`feature_importances_` 。 常见的属性列在 :ref:`下方 ` 。 公共属性可能与构造函数 :term:`参数` 同名,但附加一个 ``_`` 。这用于存储在拟合过程中计算的值。 validated or estimated version of the user's input. For example, :class:`decomposition.PCA` is constructed with an ``n_components`` parameter. From this, together with other parameters and the data, PCA estimates the attribute ``n_components_`` . Further private attributes used in prediction/transformation/etc. may also be set when fitting. These begin with a single underscore and are not assured to be stable for public access. A public attribute on an estimator instance that does not end in an underscore should be the stored, unmodified value of an ``__init__`` :term:`parameter` of the same name. Because of this equivalence, these are documented under an estimator's *Parameters* documentation. 向后兼容性 我们通常会尝试保持向后兼容性(即接口和行为可以扩展但不能更改或删除)从发布到发布,但有一些例外: 仅公共API 通过私有标识符(那些以 ``_`` 开头的)访问的对象的行为可能会在版本之间任意更改。 如文档所述 我们通常会假设用户已经遵守了文档中记录的参数类型和范围。如果文档要求一个列表而用户提供了一个元组,我们不保证版本之间的行为一致。 弃用 行为可能会在一段 :term:`弃用` 期(通常是两个版本)之后更改。使用Python的 :mod:`warnings` 模块发出警告。 关键字参数 我们有时会假设所有可选参数(除了 :term:`fit` 和类似方法的X和y)仅作为关键字参数传递,并且可能会重新按位置排序。 错误修复与增强 错误修复和 -- 较少见 -- 增强可能会改变估计器的行为,包括在相同数据和 :term:`random_state` 上训练的估计器的预测。当这种情况发生时,我们会尝试在变更日志中清楚地注明。 序列化 我们不保证在一个版本中序列化的估计器能够在后续版本中反序列化为等效模型。(对于 sklearn 包中的估计器,即使可能成功,我们也会在尝试反序列化时发出警告。)请参阅 :ref:`persistence_limitations` 。 :func:`utils.estimator_checks.check_estimator` 我们为估计器检查提供了有限的向后兼容性保证:我们可能会对使用此函数测试的估计器增加额外要求,通常是在非正式假设但未正式测试的情况下。 尽管我们与用户之间存在这种非正式契约,但软件是按许可证声明的那样提供的。当一个版本无意中引入了不向后兼容的更改时,这些被称为软件回归。 可调用对象 一个函数、类或实现了 ``__call__`` 方法的对象;任何在 `callable() `_ 的参数中返回 True 的东西。 分类特征 分类或名义 :term:`特征` 是指在整个数据群体中具有有限离散值集合的特征。这些通常表示为整数或字符串列。字符串将被大多数 scikit-learn 估计器拒绝,而整数将被视为有序或计数值。对于大多数估计器的使用,分类 变量应进行独热编码。值得注意的是,基于树的模型,如随机森林和梯度提升模型,通常使用整数码的分类变量效果更好且速度更快。 :class:`~sklearn.preprocessing.OrdinalEncoder` 有助于将字符串值的分类特征编码为顺序整数,而 :class:`~sklearn.preprocessing.OneHotEncoder` 可用于独热编码分类特征。 另请参阅 :ref:`preprocessing_categorical_features` 和 `categorical-encoding `_ 包,以获取与编码分类特征相关的工具。 克隆 克隆的 要复制一个 :term:`estimator instance` 并创建一个具有相同 :term:`parameters` 的新实例,但不包含任何拟合的 :term:`attributes` ,可以使用 :func:`~sklearn.base.clone` 。 当调用 ``fit`` 时,一个 :term:`meta-estimator` 通常会在拟合克隆实例之前克隆一个包装的估计器实例。(出于遗留原因,例外情况包括 :class:`~pipeline.Pipeline` 和 :class:`~pipeline.FeatureUnion` 。) 如果估计器的 `random_state` 参数是一个整数(或者估计器没有 `random_state` 参数),则返回一个 *精确克隆*:克隆和原始估计器将给出完全相同的结果。否则,返回一个 *统计克隆*:克隆可能会产生与原始估计器不同的结果。更多详细信息可以在 :ref:`randomness` 中找到。 常见测试 这指的是在 Scikit-learn 中几乎每个估计器类上运行的测试,以检查它们是否符合基本的 API 约定。它们可通过 :func:`utils.estimator_checks.check_estimator` 供外部使用,其中大部分实现位于 ``sklearn/utils/estimator_checks.py`` 。 注意:目前一些对常见测试制度的例外情况是硬编码在库中的,但我们希望用语义的 :term:`估计器标签` 来标记这些例外行为,以取代这种做法。 交叉拟合 交叉拟合 一种重采样方法,它迭代地将数据分成互斥的子集以进行两阶段的拟合。在第一阶段,互斥的子集使得可以在未在训练期间见过的数据上计算预测或变换。然后,计算得到的数据用于第二阶段。其目的是避免第一阶段的任何过拟合引入第二阶段输入数据分布的偏差。 有关其使用的示例,请参见::class:`~preprocessing.TargetEncoder` 、 :class:`~ensemble.StackingClassifier` 、 :class:`~ensemble.StackingRegressor` 和 :class:`~calibration.CalibratedClassifierCV` 。 交叉验证 交叉验证 一种重采样方法,它迭代地将数据分成互斥的“训练”和“测试”子集,以便可以在未见过的数据上评估模型性能。这节省了数据,因为它避免了需要保留一个“验证”数据集,并考虑了变异性,因为通常会进行多轮交叉验证。 有关更多详细信息,请参见 :ref:`用户指南 ` 。 弃用 我们使用弃用来逐渐违反我们的 :term:`向后兼容性` 保证,通常是为了: * 更改参数的默认值;或 * 移除参数、属性、方法、类等。 当使用已弃用的元素时,我们通常会发出警告,尽管这可能会有局限性。例如,当有人设置已弃用的参数时,我们会发出警告,但当他们访问估计器实例上的该参数属性时,可能不会发出警告。 请参见 :ref:`贡献者指南 ` 。 维度 可能用于指代 :term:`features` (即 :term:`n_features` )的数量,或者二维特征矩阵中的列数。 然而,维度也用于指代 NumPy 数组形状的长度,区分一维数组和二维矩阵。 文档字符串 模块、类、函数等的嵌入式文档,通常在代码中作为对象定义开头的字符串,并且可以通过对象的 ``__doc__`` 属性访问。 我们尽量遵守 `PEP257 `_ ,并遵循 `NumpyDoc 约定 `_ 。 双下划线 双下划线表示法 在为嵌套估计器指定参数名称时, ``__`` 可能在某些上下文中用于父和子之间的分隔。最常见的用法是在通过具有 :term:`set_params` 的元估计器设置参数时,因此在 :ref:`参数搜索 ` 中指定搜索网格。参见 :term:`parameter` 。 它还用于 :meth:`pipeline.Pipeline.fit` 中,将 :term:`sample properties` 传递给管道中估计器的 ``fit`` 方法。 数据类型 数据类型 NumPy 数组假设整个数组具有同质的数据类型,可以在数组(或稀疏矩阵)的 ``.dtype`` 属性中获得。我们通常假设 scikit-learn 数据的简单数据类型:浮点数或整数。 我们可能在编码或向量化之前支持对象或字符串数据类型。例如,我们的估计器不支持结构数组。 我们的文档有时会提供关于数据类型(dtype)精度的信息,例如 `np.int32` 、 `np.int64` 等。当提供精度时,它指的是 NumPy 的数据类型。如果使用任意精度,文档将参考数据类型 `integer` 或 `floating` 。请注意,在这种情况下,精度可能是平台相关的。 `numeric` 数据类型指的是同时接受 `integer` 和 `floating` 。 在选择 64 位数据类型(即 `np.float64` 和 `np.int64` )和 32 位数据类型(即 `np.float32` 和 `np.int32` )之间,实际上是在效率和精度之间进行权衡。64 位类型由于其较低的浮点误差,提供了更准确的结果,但需要更多的计算资源,导致操作速度变慢和内存使用增加。相比之下,32 位类型承诺提高操作速度和减少内存消耗,但引入了更大的浮点误差。效率的提升依赖于底层优化,如向量化、单指令多数据(SIMD)或缓存优化,但关键在于所使用算法的兼容性。 具体来说,精度的选择应考虑所使用的算法是否能有效利用 `np.float32` 。某些算法,尤其是某些最小化方法,专门为 `np.float64` 编码,这意味着即使传递了 `np.float32` ,也会触发自动转换回 `np.float64` 。这不仅否定了预期的计算节省,还引入了额外的开销,使得使用 `np.float32` 的操作意外地变慢且更占用内存,因为这一额外的转换步骤。 鸭子类型 我们尝试应用 `鸭子类型 `_ 来确定如何处理某些输入值(例如,检查给定的估计器是否是分类器)。也就是说,我们尽可能避免使用 ``isinstance`` ,而是依赖于属性的存在与否来确定对象的行为。在遵循这种方法时,需要一些细微的差别: * 对于某些估计器,属性可能只有在它被 :term:`拟合` 后才可用。例如,我们不能先验地确定在包含交替使用概率预测器和非概率预测器的网格搜索中, :term:`predict_proba` 是否可用。在下面的例子中,我们只能在将 ``clf`` 拟合到某些数据后才能确定它是否是概率性的:: >>> from sklearn.model_selection import GridSearchCV >>> from sklearn.linear_model import SGDClassifier >>> clf = GridSearchCV(SGDClassifier(), ... param_grid={'loss': ['log_loss', 'hinge']}) 这意味着我们只能在拟合后检查鸭子类型的属性,并且我们必须小心确保 :term:`元估计器` 仅根据底层估计器拟合后的状态呈现属性。 * 检查属性是否存在(使用 ``hasattr`` )通常与获取属性( ``getattr`` 或点符号)一样昂贵。在某些情况下,获取属性确实可能很昂贵(例如,对于某些 :term:`feature_importances_` 的实现,这可能表明这是一个 API 设计缺陷)。因此,应避免执行 ``hasattr`` 后跟 ``getattr`` 的代码;建议在 try-except 块中使用 ``getattr`` 。 * 为了确定估计器对某些特征的期望或支持的某些方面,我们使用 :term:`估计器标签` 而不是鸭子类型。 早停法 这包括在训练损失收敛之前停止迭代优化方法,以避免过拟合。这通常通过监控验证集上的泛化分数来完成。如果可用,它通过参数 ``early_stopping`` 激活,或者通过设置一个正的 :term:`n_iter_no_change` 。 估计器实例 我们有时使用这个术语来区分 :term:`估计器` 类和构造的实例。例如,在下面的代码中, ``cls`` 是一个估计器类,而 ``est1`` 和 ``est2`` 是实例:: cls = RandomForestClassifier est1 = cls() est2 = RandomForestClassifier() 示例 我们尝试为 API 中的大多数函数和类提供基本用法的示例: * 作为它们文档字符串中的 doctests(即在 ``sklearn/`` 库代码本身中)。 * 作为 :ref:`示例画廊 ` 中的示例,这些示例是从 ``examples/`` 目录中的脚本渲染的(使用 `sphinx-gallery `_ ),展示了估计器/函数的关键特性或参数。这些示例也应该在用户指南中引用。 * 有时在 :ref:`用户指南 ` (从 ``doc/`` 构建)中,与估计器的技术描述一起。 实验性 一个实验性工具已经可以使用,但其公共 API,如默认参数值或拟合属性,仍可能在未来的版本中更改,而不会有通常的 :term:`弃用` 警告政策。 评估指标 评估指标 评估指标提供了模型性能的度量标准。我们可能特别使用这个术语来指代 :mod:`~sklearn.metrics` 中的函数(不包括 :mod:`~sklearn.metrics.pairwise` ),这与交叉验证中使用的 :term:`score` 方法和 :term:`scoring` API 有所区别。参见 :ref:`model_evaluation` 。 这些函数通常接受一个真实值(或者在没有真实值的情况下,评估聚类的原始数据)和一个预测值,无论是 :term:`predict` 的输出( ``y_pred`` ),:term:`predict_proba` 的输出( ``y_proba`` ),还是任意评分函数的输出,包括 :term:`decision_function` ( ``y_score`` )。如果一个更高的分数表示一个更好的模型,函数通常以 ``_score`` 结尾,如果一个更低的分数表示一个更好的模型,则以 ``_loss`` 结尾。这种接口的多样性促使了评分 API 的产生。 请注意,一些估计器可以计算未包含在 :mod:`~sklearn.metrics` 中的指标,这些指标是估计器特定的,特别是模型似然性。 估计器标签 一个提议的功能(例如 :issue:`8022` ),通过一组语义标签来描述估计器的能力。这将使一些基于估计器检查的运行时行为成为可能,但也允许每个估计器在不被其他 :term:`common tests` 排除的情况下,测试其适当的恒定性。 目前,估计器标签的一些方面是通过方法的 :term:`duck typing` 来确定的,比如 ``predict_proba`` ,以及估计器对象上的一些特殊属性: .. glossary:: ``_estimator_type`` 这个字符串值属性将估计器标识为分类器、回归器等。它由混合类设置,例如 :class:`base.ClassifierMixin` ,但需要在 :term:`meta-estimator` 上更明确地采用。其值通常应通过诸如 :func:`base.is_classifier` 的帮助程序进行检查。 有关更详细的信息,请参阅 :ref:`estimator_tags` 。 feature features feature vector 在抽象意义上,特征是一个函数(在其数学意义上),将一个采样对象映射为一个数值或分类量。"特征" 也常用来指代这些量,即表示样本的向量的各个元素。在数据矩阵中,特征以列的形式表示:每一列包含将特征函数应用于一组样本的结果。 在其他地方,特征被称为属性、预测器、回归变量或自变量。 scikit-learn 中的几乎所有估计器都假设特征是数值的、有限的且不缺失的,即使它们在语义上具有不同的域和分布(分类、有序、计数值、实值、区间值)。另请参阅 :term:`categorical feature` 和 :term:`missing values` 。 ``n_features`` 表示数据集中特征的数量。 fitting 在估计器上调用 :term:`fit` (或 :term:`fit_transform` 、:term:`fit_predict` 等)。 fitted 估计器在 :term:`fitting` 之后的状态。 没有常规的程序来检查估计器是否已拟合。然而,未拟合的估计器: * 在调用预测方法(:term:`predict` 、:term:`transform` 等)时应引发 :class:`exceptions.NotFittedError` 。(:func:`utils.validation.check_is_fitted` 在内部用于此目的。) * 不应具有任何以字母开头的 :term:`attributes` 。 character 并以一个下划线结尾。(请注意,类的属性可能仍然存在描述符,但 hasattr 应该返回 False) function 我们为许多算法提供了临时函数接口,而 :term:`estimator` 类提供了更一致的接口。 特别是,Scikit-learn 可能提供一个函数接口,该接口将模型拟合到某些数据并返回学习到的模型参数,如 :func:`linear_model.enet_path` 中所示。对于传导模型,这也返回嵌入或聚类标签,如 :func:`manifold.spectral_embedding` 或 :func:`cluster.dbscan` 中所示。许多预处理转换器也提供了类似于调用 :term:`fit_transform` 的函数接口,如 :func:`preprocessing.maxabs_scale` 中所示。用户在使用这些等效于 ``fit_transform`` 的函数时应小心避免 :term:`data leakage` 。 我们没有关于何时提供或不提供估计器函数形式的严格政策,但维护者应考虑与现有接口的一致性,以及提供函数是否会使用户偏离最佳实践(关于数据泄露等)。 gallery 参见 :term:`examples` 。 hyperparameter hyper-parameter 参见 :term:`parameter` 。 impute imputation 大多数机器学习算法要求其输入没有 :term:`missing values` ,如果违反此要求,算法将无法工作。尝试填充(或插补)缺失值的算法被称为插补算法。 indexable 一个 :term:`array-like` 、:term:`sparse matrix` 、pandas DataFrame 或序列(通常是一个列表)。 induction inductive 归纳(与 :term:`transductive` 相对)机器学习 构建一个数据模型,然后可以应用于新的实例。 Scikit-learn 中的大多数估计器都是归纳性的,具有 :term:`预测` 和/或 :term:`转换` 方法。 joblib 一个 Python 库(https://joblib.readthedocs.io),用于在 Scikit-learn 中促进简单的并行化和缓存。 Joblib 面向高效地处理 numpy 数组,例如通过使用 :term:`内存映射` 。更多信息请参见 :ref:`并行性` 。 标签指示矩阵 多标签指示矩阵 多标签指示矩阵 用于表示多标签数据的格式,其中二维数组或稀疏矩阵的每一行对应一个样本,每一列对应一个类别,每个元素为 1 表示样本被标记为该类别,为 0 表示未被标记。 泄漏 数据泄漏 交叉验证中的一个问题,由于无意中将测试数据的知识包含在训练模型中,可能导致泛化性能被高估。 例如,在交叉验证分割中对整个数据集应用 :term:`转换器` 而不是每个训练部分时,就存在这种风险。 我们旨在提供接口(如 :mod:`~sklearn.pipeline` 和 :mod:`~sklearn.model_selection` ),以防止用户遇到数据泄漏问题。 内存映射 内存映射 内存映射 一种内存效率策略,将数据保留在磁盘上而不是复制到主内存中。可以使用 :obj:`numpy.memmap` 创建可读、写或两者兼备的数组的内存映射。 在使用 :term:`joblib` 在 Scikit-learn 中并行化操作时,可能会自动对大型数组进行内存映射,以减少多进程中的内存重复开销。 缺失值 大多数 Scikit-learn 估计器不支持缺失值。当它们 do (例如在 :class:`impute.SimpleImputer` 中), NaN 是浮点数数组中缺失值的首选表示。如果数组具有整数数据类型,则无法表示 NaN。出于这个原因,我们支持在 :term:`插补` 或学习可以在整数空间中执行时指定另一个 ``missing_values`` 值。 :term:`未标记数据 ` 是 :term:`目标` 中缺失值的一种特殊情况。 ``n_features`` 特征的数量。 ``n_outputs`` :term:`目标` 中输出的数量。 ``n_samples`` 样本的数量。 ``n_targets`` :term:`n_outputs` 的同义词。 narrative docs narrative documentation :ref:`用户指南 ` 的别名,即写在 ``doc/modules/`` 中的文档。与通过文档字符串提供的 :ref:`API 参考 ` 不同,用户指南旨在: * 按主题或使用方式将 Scikit-learn 提供的工具分组; * 通过比较,说明为什么有人会使用每个特定工具; * 提供工具的直观和技术描述; * 提供或链接到使用工具关键功能的 :term:`示例` 。 np 由于常规导入语句,Numpy 的简写:: import numpy as np online learning 模型通过在对应批次数据上进行预测后不久接收每个批次的真实 :term:`目标` 来迭代更新的过程。本质上,模型必须在每个批次后都可用于预测。参见 :term:`partial_fit` 。 out-of-core 一种效率策略,其中并非所有数据都一次性存储在主内存中,通常通过对数据批次进行学习来实现。参见 :term:`partial_fit` 。 outputs 单个标量/分类变量每个样本在 :term:`目标` 中。例如,在多标签分类中,每个可能的标签对应一个二进制输出。也称为 *响应*、 *任务* 或 *目标*。 参见 :term:`多类多输出` 和 :term:`连续多输出` 。 对 长度为二的元组。 parameter parameters param params 我们主要使用 *参数* 来指代可以在估计器的构造中指定的方面。例如, ``max_depth`` 和 ``random_state`` 是 :class:`~ensemble.RandomForestClassifier` 的参数。 估计器构造函数的参数未经修改地存储为估计器实例上的属性,并且通常以字母字符开头并以字母数字字符结尾。 每个估计器的构造函数参数在其文档字符串中描述。 我们不使用参数在统计学意义上的含义,其中参数是用于指定模型并可以从数据中估计的值。我们称之为参数的可能是统计学家称之为模型的超参数:用于配置模型结构的方面,通常不是直接从数据中学习的。然而,我们的参数也用于规定不影响学习模型的建模操作,例如用于控制并行性的 :term:`n_jobs` 。 当谈论一个 :term:`元估计器` 的参数时,我们可能也包括了被元估计器包装的估计器的参数。通常,这些嵌套参数通过使用 :term:`双下划线` ( ``__`` ) 来分隔作为参数的估计器及其参数来表示。因此 ``clf = BaggingClassifier(estimator=DecisionTreeClassifier(max_depth=3))`` 有一个深层参数 ``estimator__max_depth`` ,其值为 ``3`` ,可以通过 ``clf.estimator.max_depth`` 或 ``clf.get_params()['estimator__max_depth']`` 访问。 参数列表及其当前值可以从一个 :term:`估计器实例` 使用其 :term:`get_params` 方法检索。 在构造和拟合之间,可以使用 :term:`set_params` 修改参数。为此,参数通常在估计器构造时或设置每个参数时不进行验证或更改。参数验证在调用 :term:`fit` 时执行。 常见参数列在 :ref:`下方 ` 。 成对度量 成对度量 在其广义上,成对度量定义了一个用于测量两个样本(每个通常表示为一个 :term:`特征向量` )之间相似性或差异性的函数。我们特别通过 :func:`metrics.pairwise_distances` 提供了距离度量(以及像余弦距离这样的不当度量)的实现,并通过 :func:`metrics.pairwise.pairwise_kernels` 提供了核函数(一类受限的相似性函数)的实现。这些可以计算对称的成对距离矩阵,因此存储数据冗余。 另见 :term:`预计算` 和 :term:`度量` 。 请注意,对于大多数距离度量,我们依赖于 :mod:`scipy.spatial.distance` 的实现,但可能会在我们的上下文中为效率重新实现。:class:`metrics.DistanceMetric` 接口用于实现与高效邻居搜索集成的距离度量。 pd `Pandas `_ 的简写,由于传统的导入语句:: import pandas as pd precomputed 在算法依赖于 :term:`成对度量` 的情况下,并且可以从成对度量单独计算时,我们通常允许用户指定提供的 :term:`X` 已经是成对(不)相似性空间中的数据,而不是特征空间中的数据。也就是说,当传递给 :term:`fit` 时,它是一个方形、对称的矩阵,每个向量表示与每个样本的(不)相似性,而当传递给预测/转换方法时,每一行对应一个测试样本,每一列对应一个训练样本。 使用预计算的 X 通常通过将 ``metric`` 、 ``affinity`` 或 ``kernel`` 参数设置为字符串 'precomputed' 来指示。如果是这种情况,那么估计器应将 `pairwise` 估计器标签设置为 True。 矩形 可以表示为矩阵的数据,其中 :term:`样本` 位于第一轴上,而第二轴上是一组固定的、有限数量的 :term:`特征` ,称为矩形数据。 此术语排除了具有非向量结构的样本,例如文本、任意大小的图像、任意长度的时序数据、一组向量等。:term:`向量化器` 的目的是将此类数据转换为矩形形式。 sample samples 我们通常将此术语用作名词,表示单个特征向量。在其他地方,样本被称为实例、数据点或观测值。 ``n_samples`` 表示数据集中样本的数量,即数据数组 :term:`X` 中的行数。 sample property sample properties 样本属性是传递给估计器方法或类似函数的每个样本的数据(例如长度为 n_samples 的数组),与 :term:`特征` ( ``X`` )和 :term:`目标` ( ``y`` )并列但不同。最突出的例子是 :term:`样本权重` ; 参见其他内容在 :ref:`术语表_样本属性` 。 截至版本0.19,我们尚未有一致的方法来处理样本属性及其在 :term:`元估计器` 中的路由,尽管通常使用 ``fit_params`` 参数。 scikit-learn-contrib 一个用于发布与Scikit-learn兼容的库的场所,这些库得到了核心开发人员和贡献社区的广泛授权,但不是由核心开发团队维护的。 参见 https://scikit-learn-contrib.github.io。 scikit-learn增强提案 SLEP SLEPs API原则的变更以及依赖项或支持版本的变更通过 :ref:`SLEP ` 进行,并遵循 :ref:`治理` 中概述的决策过程。 对于所有投票,提案必须在投票前公开并讨论。此类提案必须是一个综合文档,形式为“Scikit-Learn增强提案”(SLEP),而不是一个问题的长篇讨论。SLEP必须作为拉取请求提交到 `增强提案 `_ 使用 `SLEP模板 `_ 。 semi-supervised semi-supervised learning semisupervised 在 :term:`拟合` 模型时,仅对作为训练数据提供的一些样本提供预期预测(标签或真实值)的学习。我们通常将标签 ``-1`` 应用于半监督分类中的 :term:`未标记` 样本。 稀疏矩阵 稀疏图 一种二维数值数据的表示方法,其内存效率高于相应的密集numpy数组,其中几乎所有元素都为零。我们使用 :mod:`scipy.sparse` 框架,该框架提供了 几种底层稀疏数据表示,或称为*格式*。 某些格式对于特定任务比其他格式更高效,当某种格式提供特别的好处时,我们会在Scikit-learn参数描述中尽力记录这一事实。 一些稀疏矩阵格式(特别是CSR、CSC、COO和LIL)区分*隐式*和*显式*零。显式零在数据结构中存储(即它们在 ``data`` 数组中消耗内存),而隐式零对应于在显式存储中未定义的每个元素。 Scikit-learn中使用了两种稀疏矩阵的语义: 矩阵语义 稀疏矩阵被解释为一个数组,其中隐式和显式零被解释为数字0。这是最常采用的解释,例如当稀疏矩阵用于特征矩阵或:term:`多标签指示矩阵` 时。 图语义 与:mod:`scipy.sparse.csgraph` 类似,显式零被解释为数字0,但隐式零表示一个被屏蔽或缺失的值,例如图中两个顶点之间缺少边,而显式值表示边的权重。这种解释被采用来表示聚类中的连通性,在最近邻表示中(例如:func:`neighbors.kneighbors_graph` ),以及在预计算距离表示中,其中仅需要每个点邻域内的距离。 在使用稀疏矩阵时,我们假设它稀疏是有充分理由的,并避免编写代码将用户提供的稀疏矩阵稠密化,而是保持稀疏性或在无法保持时引发错误。(即如果一个估计器不支持/不能支持稀疏矩阵)。 stateless 如果一个估计器在 :term:`fit` 过程中不存储任何信息,则它是无状态的。这些信息可以是 :term:`fit` 过程中学习到的参数或从训练数据计算出的统计数据。一个估计器是无状态的,如果它除了在 `__init__` 中设置的属性外没有其他属性。对于这些估计器,调用 :term:`fit` 只会验证在 `__init__` 中传递的公共 :term:`attributes` 。 supervised supervised learning 在 :term:`fitting` 模型时,每个样本都有可用的预期预测(标签或真实值),作为 :term:`y` 提供。这是在 :term:`classifier` 或 :term:`regressor` 等估计器中采用的方法。 target targets 在 :term:`supervised` (和 :term:`semisupervised` )学习中的 *因变量*,作为 :term:`y` 传递给估计器的 :term:`fit` 方法。也称为 *因变量*、*结果变量*、*响应变量*、*真实值* 或 *标签*。Scikit-learn 处理的目标具有最小的结构:来自有限集合的类别、有限的实值数、多个类别或多个数。参见 :ref:`glossary_target_types` 。 transduction transductive 与 :term:`inductive` 相对的转导机器学习方法旨在为特定数据集建模,但不将该模型应用于未见过的数据。例如 :class:`manifold.TSNE` 、:class:`cluster.AgglomerativeClustering` 和 :class:`neighbors.LocalOutlierFactor` 。 unlabeled unlabeled data 在拟合时具有未知真实值的样本;等效于 :term:`target` 中的 :term:`missing values` 。参见:term:`半监督` 和 :term:`无监督` 学习。 无监督 无监督学习 在学习过程中,每个样本没有可用的预期预测(标签或真实值), 例如在 :term:`聚类器` 和 :term:`异常检测器` 中。无监督估计器 会忽略传递给 :term:`拟合` 的任何 :term:`y` 。 .. _glossary_estimator_types: 类API和估计器类型 ================== .. glossary:: 分类器 分类器 具有有限离散可能输出值的 :term:`监督` (或 :term:`半监督` ):term:`预测器` 。 分类器支持建模某些 :term:`二元` 、:term:`多类` 、:term:`多标签` 或 :term:`多类多输出` 目标。 在 scikit-learn 中,所有分类器都支持多类分类,默认使用二元分类问题的 one-vs-rest 策略。 分类器在拟合后必须存储 :term:`classes_` 属性,并且通常继承自 :class:`base.ClassifierMixin` , 该类设置其 :term:`_estimator_type` 属性。 可以通过 :func:`~base.is_classifier` 区分分类器和其他估计器。 分类器必须实现: * :term:`拟合` * :term:`预测` * :term:`评分` 也可以实现 :term:`决策函数` 、:term:`预测概率` 和 :term:`预测对数概率` 。 聚类器 聚类器 具有有限离散输出值的 :term:`无监督` :term:`预测器` 。 聚类器通常在拟合后存储 :term:`labels_` ,如果是 :term:`直推式` 则必须这样做。 聚类器必须实现: * :term:`拟合` * 如果是 :term:`直推式` ,则实现 :term:`拟合预测` * 如果是 :term:`归纳式` ,则实现 :term:`预测` 密度估计器 对输入概率密度函数的 :term:`无监督` 估计。常用的技术包括: * :ref:`核密度估计 ` - 使用核函数,通过带宽参数控制来表示密度; * :ref:`高斯混合模型 ` - 使用高斯混合模型来表示密度。 估计器 估计器 管理模型估计和解码的对象。模型被估计为一个确定性函数,其输入包括: * 对象构造时提供的 :term:`参数` 或通过 :term:`set_params` 设置的参数; * 如果估计器的 :term:`random_state` 参数设置为 None,则使用全局 :mod:`numpy.random` 随机状态;以及 * 最近一次调用 :term:`fit` 、:term:`fit_transform` 或 :term:`fit_predict` 时传递的任何数据或 :term:`样本属性` ,或者在序列调用 :term:`partial_fit` 时类似传递的数据。 估计的模型存储在估计器实例的公共和私有 :term:`属性` 中,便于通过预测和转换方法进行解码。 估计器必须提供 :term:`fit` 方法,并且应该提供 :term:`set_params` 和 :term:`get_params` 方法,尽管这些方法通常通过继承自 :class:`base.BaseEstimator` 来提供。 某些估计器的核心功能也可以作为 :term:`函数` 提供。 特征提取器 特征提取器 一种 :term:`转换器` ,它接受输入,其中每个样本不是以固定长度的 :term:`类数组` 对象表示,而是为每个样本生成一个 :term:`特征` 的 :term:`类数组` 对象(因此对于一组样本生成一个二维的类数组对象)。换句话说,它将非矩形数据表示(有损地)映射为 :term:`矩形` 数据。 特征提取器必须实现至少以下方法: * :term:`fit` * :term:`transform` * :term:`get_feature_names_out` meta-estimator meta-estimators metaestimator metaestimators 一个以另一个估计器作为参数的 :term:`estimator` 。示例包括 :class:`pipeline.Pipeline` 、 :class:`model_selection.GridSearchCV` 、 :class:`feature_selection.SelectFromModel` 和 :class:`ensemble.BaggingClassifier` 。 在 meta-estimator 的 :term:`fit` 方法中,任何包含的估计器在拟合之前都应该被 :term:`cloned` (尽管 FIXME:Pipeline 和 FeatureUnion 目前不这样做)。一个例外是,估计器可以明确记录它接受一个预先拟合的估计器(例如,在 :class:`feature_selection.SelectFromModel` 中使用 ``prefit=True`` )。这方面已知的一个问题是,预先拟合的估计器在 meta-estimator 被克隆时会丢失其模型。即使所有包含的估计器都是预先拟合的,meta-estimator 也应该在预测之前调用 ``fit`` 。 在 meta-estimator 的主要行为(例如 :term:`predict` 或 :term:`transform` 实现)是基于提供的 *基础估计器*(或多个基础估计器)的预测/转换方法的情况下,meta-estimator 应该至少提供基础估计器提供的标准方法。在 meta-estimator 被 :term:`fitted` 之前,可能无法确定底层估计器提供了哪些方法(另请参阅 :term:`duck typing` ),为此 :func:`utils.metaestimators.available_if` 可能会有所帮助。它还应该提供(或修改)基础估计器提供的 :term:`estimator tags` 和 :term:`classes_` 属性。 Meta-estimators 应该尽可能少地验证数据,然后再将其传递给底层估计器。这样可以节省计算时间,并且可能允许底层估计器轻松处理非 :term:`rectangular` 数据。 异常检测器 异常检测器 一种 :term:`unsupervised` 的二元 :term:`predictor` ,它建模核心样本和异常样本之间的区别。 异常检测器必须实现: * :term:`fit` * :term:`fit_predict` 如果 :term:`transductive` * :term:`predict` 如果 :term:`inductive` 归纳式异常检测器还可以实现 :term:`decision_function` ,以提供一个标准化的内点分数,其中异常点的分数低于 0。:term:`score_samples` 可以提供每个样本的非标准化分数。 预测器 预测器 支持 :term:`predict` 和/或 :term:`fit_predict` 的 :term:`估计器` 。这包括 :term:`分类器` 、:term:`回归器` 、:term:`异常检测器` 和 :term:`聚类器` 。 在统计学中,“预测器”指的是 :term:`特征` 。 回归器 回归器 具有 :term:`连续` 输出值的 :term:`监督` (或 :term:`半监督` ):term:`预测器` 。 回归器通常继承自 :class:`base.RegressorMixin` ,该类设置其 :term:`_estimator_type` 属性。 回归器可以通过 :func:`~base.is_regressor` 与其他估计器区分开来。 回归器必须实现: * :term:`fit` * :term:`predict` * :term:`score` transformer transformers 支持 :term:`transform` 和/或 :term:`fit_transform` 的估计器。纯 :term:`直推式` 转换器,如 :class:`manifold.TSNE` ,可能不实现 ``transform`` 。 vectorizer vectorizers 参见 :term:`eature extractor` 。 有一些特定的API与一小类估计器相关,例如: .. glossary:: cross-validation splitter CV splitter cross-validation generator 一类非估计器的类,用于将数据集分割成一系列的训练和测试部分(参见 :ref:`cross_validation ` ), 通过提供 :term:`split` 和 :term:`get_n_splits` 方法。 注意,与估计器不同,这些类没有 :term:`fit` 方法,也不提供 :term:`set_params` 或 :term:`get_params` 。 参数验证可能在 ``__init__`` 中进行。 cross-validation estimator 一种内置交叉验证功能的估计器,用于自动选择最佳超参数(参见 :ref:`User Guide ` )。 一些交叉验证估计器的例子包括 :class:`弹性网络CV ` 和 :class:`逻辑回归CV ` 。 交叉验证估计器命名为 `EstimatorCV` ,通常与 `GridSearchCV(Estimator(), ...)` 大致等效。 使用交叉验证估计器相对于标准的 :term:`估计器` 类和 :ref:`网格搜索 ` 的优势在于, 它们可以利用预热启动,通过重用交叉验证过程中先前步骤的预计算结果。这通常会带来速度上的提升。 一个例外是 :class:`岭回归CV ` 类,它可以执行高效的留一法(LOO)交叉验证。 默认情况下,除了使用LOO-CV的 :class:`岭回归CV ` 之外,所有这些估计器在找到最佳超参数组合后, 都会在完整的训练数据集上重新拟合。 评分器 一种非估计器的可调用对象,用于在给定数据上评估估计器。 测试数据,返回一个数字。与 :term:`评估指标` 不同,返回的数字越大,必须对应于 *更好* 的分数。 参见 :ref:`评分参数` 。 更多示例: * :class:`metrics.DistanceMetric` * :class:`gaussian_process.kernels.Kernel` * ``tree.Criterion`` .. _glossary_metadata_routing: 元数据路由 ========== .. 术语表:: 消费者 一个消费 :term:`元数据` 的对象。这个对象通常是一个 :term:`估计器` 、一个 :term:`评分器` 或一个 :term:`CV 分割器` 。消费元数据意味着在计算中使用它,例如使用 :term:`样本权重` 来计算某种类型的分数。作为一个消费者并不意味着该对象总是接收到特定的元数据,而是意味着如果提供了元数据,它可以使用它。 元数据 与给定的 :term:`X` 和 :term:`y` 数据相关,但不直接是数据的一部分的数据,例如 :term:`样本权重` 或 :term:`组` ,并且会传递给不同的对象和方法,例如传递给 :term:`评分器` 或 :term:`CV 分割器` 。 路由器 一个将元数据路由到 :term:`消费者` 的对象。这个对象通常是一个 :term:`元估计器` ,例如 :class:`~pipeline.Pipeline` 或 :class:`~model_selection.GridSearchCV` 。一些路由器也可以是消费者。例如,当一个元估计器使用给定的 :term:`组` ,并且它也将其传递给某些子对象,例如 :term:`CV 分割器` 。 请参阅 :ref:`元数据路由用户指南 ` 以获取更多信息。 .. _glossary_target_types: 目标类型 ======== .. 术语表:: 二元 由两个类别组成的分类问题。二元目标可以表示为 :term:`多类` 问题,但只有两个标签。二元决策函数表示为一个一维数组。 语义上,通常认为一个类别是“正类”。除非另有指定(例如,在使用 :term:`evaluation metrics` 中的 :term:`pos_label` ),我们认为数值或字典序上较大的类别标签为正类:标签 [0, 1] 中,1 是正类;[1, 2] 中,2 是正类;['no', 'yes'] 中,'yes' 是正类;['no', 'YES'] 中,'no' 是正类。这会影响 :term:`decision_function` 等输出的结果。 请注意,从多类别 ``y`` 或连续 ``y`` 中采样的数据集可能看起来是二元的。 :func:`~utils.multiclass.type_of_target` 将返回 'binary' 表示二元输入,或仅包含单个类别的类似数组。 continuous 回归问题,其中每个样本的目标是一个有限浮点数,表示为浮点数(有时是整数)的一维数组。 :func:`~utils.multiclass.type_of_target` 将返回 'continuous' 表示连续输入,但如果数据全是整数,则会被识别为 'multiclass'。 continuous multioutput continuous multi-output multioutput continuous multi-output continuous 回归问题,其中每个样本的目标由 ``n_outputs`` 个 :term:`outputs` 组成,每个输出是一个有限浮点数,对于特定数据集中的固定整数 ``n_outputs > 1`` 。 连续多输出目标表示为多个 :term:`continuous` 目标,水平堆叠成形状为 ``(n_samples, n_outputs)`` 的数组。 :func:`~utils.multiclass.type_of_target` 将返回 'continuous-multioutput' 表示连续多输出输入,但如果数据全是整数,则会被识别为 'multiclass-multioutput'。 multiclass multi-class 多类别问题,其中每个样本的目标是多个类别中的一个。 A classification problem consisting of more than two classes. A multiclass target may be represented as a 1-dimensional array of strings or integers. A 2d column vector of integers (i.e. a single output in :term:`multioutput` terms) is also accepted. We do not officially support other orderable, hashable objects as class labels, even if estimators may happen to work when given classification targets of such type. For semi-supervised classification, :term:`unlabeled` samples should have the special label -1 in ``y`` . Within scikit-learn, all estimators supporting binary classification also support multiclass classification, using One-vs-Rest by default. A :class:`preprocessing.LabelEncoder` helps to canonicalize multiclass targets as integers. :func:`~utils.multiclass.type_of_target` will return 'multiclass' for multiclass input. The user may also want to handle 'binary' input identically to 'multiclass'. multiclass multioutput multi-class multi-output multioutput multiclass multi-output multi-class A classification problem where each sample's target consists of ``n_outputs`` :term:`outputs` , each a class label, for a fixed int ``n_outputs > 1`` in a particular dataset. Each output has a fixed set of available classes, and each sample is labeled with a class for each output. An output may be binary or multiclass, and in the case where all outputs are binary, the target is :term:`multilabel` . Multiclass multioutput targets are represented as multiple :term:`multiclass` targets, horizontally stacked into an array of shape ``(n_samples, n_outputs)`` . XXX: For simplicity, we may not always support string class labels for multiclass multioutput, and integer class labels should be used. :mod:`~sklearn.multioutput` 提供了使用多个单输出估计器来估计多输出问题的估计器。这可能无法完全考虑不同输出之间的依赖关系,而原生处理多输出情况的方法(例如决策树、最近邻、神经网络)可能会做得更好。 :func:`~utils.multiclass.type_of_target` 对于多类多输出输入将返回 'multiclass-multioutput'。 多标签 一个 :term:`多类多输出` 目标,其中每个输出都是 :term:`二进制` 。这可以表示为一个二维(密集)数组或整数的稀疏矩阵,使得每一列是一个独立的二进制目标,其中正标签用 1 表示,负标签通常用 -1 或 0 表示。稀疏多标签目标并不在所有支持密集多标签目标的地方都支持。 从语义上讲,多标签目标可以被认为是每个样本的一组标签。虽然内部不使用,但 :class:`preprocessing.MultiLabelBinarizer` 作为一个实用工具,用于从列表集表示转换为二维数组或稀疏矩阵。使用 :class:`preprocessing.LabelBinarizer` 对多类目标进行独热编码会将其转换为多标签问题。 :func:`~utils.multiclass.type_of_target` 对于多标签输入,无论是稀疏的还是密集的,都将返回 'multilabel-indicator'。 多输出 一个目标,其中每个样本具有多个分类/回归标签。参见 :term:`多类多输出` 和 :term:`连续多输出` 。我们目前不支持建模混合分类和回归目标。 .. _glossary_methods: 方法 ==== .. glossary:: ``decision_function`` 在一个已拟合的 :term:`分类器` 或 :term:`异常检测器` 中,预测一个 "软"得分,相对于每个类别的每个样本,而不是由 :term:`predict` 产生的"硬"分类预测。其输入通常只是一些观测数据,:term:`X` 。 如果估计器尚未 :term:`fitted` ,调用此方法应引发 :class:`exceptions.NotFittedError` 。 输出约定: 二分类 一个一维数组,其中严格大于零的值表示正类(即 :term:`classes_` 中的最后一个类)。 多分类 一个二维数组,其中行方向的 arg-maximum 是预测的类别。列按照 :term:`classes_` 排序。 多标签分类 Scikit-learn 在表示 :term:`multilabel` 决策函数时存在不一致性。它可能以两种方式之一表示: - 2d 数组的列表,每个数组的形状为 ( `n_samples` , 2),类似于多类多输出。列表的长度为 `n_labels` 。 - 单个二维数组,形状为 ( `n_samples` , `n_labels` ),其中数组中的每个'列'对应于单个二分类决策。这与多分类格式相同,尽管其语义不同:应像在二分类情况下一样,通过在 0 处阈值化来解释。 多输出分类 对应于每个多类决策函数的 2d 数组列表。 异常检测 一个一维数组,其中大于或等于零的值表示内点。 ``fit`` 每个估计器上都提供了 ``fit`` 方法。它通常接受一些 :term:`samples```X`` ,如果模型是监督学习,则接受 :term:`targets```y`` 。 并且可能还有其他 :term:`样本属性` ,例如 :term:`样本权重` 。 它应该: * 清除估计器上存储的任何先前的 :term:`属性` ,除非 :term:`热启动` 被使用; * 验证并解释任何 :term:`参数` ,理想情况下如果无效则引发错误; * 验证输入数据; * 从估计的参数和提供的数据中估计并存储模型属性;以及 * 返回现在 :term:`拟合` 的估计器以方便方法链。 :ref:`术语表_目标类型` 描述了 ``y`` 的可能格式。 ``fit_predict`` 特别用于 :term:`无监督` 、:term:`直推式` 估计器,这适合模型并返回训练数据上的预测(类似于 :term:`预测` )。在聚类器中,这些预测也存储在 :term:`标签_` 属性中,并且 ``.fit_predict(X)`` 的输出通常等同于 ``.fit(X).predict(X)`` 。 ``fit_predict`` 的参数与 ``fit`` 的参数相同。 ``fit_transform`` :term:`转换器` 上的一个方法,它适合估计器并返回转换后的训练数据。它的参数与 :term:`拟合` 中的参数相同,其输出应与调用 ``.fit(X, ...).transform(X)`` 的形状相同。然而,仍然存在罕见的情况,即 ``.fit_transform(X, ...)`` 和 ``.fit(X, ...).transform(X)`` 不返回相同的值,其中训练数据需要以不同方式处理(例如由于堆叠集成中的模型混合;这种情况应明确记录)。 :term:`直推式 <直推式>` 转换器也可能提供 ``fit_transform`` 但不提供 :term:`转换` 。 实现 ``fit_transform`` 的一个原因是单独执行 ``fit`` 和 ``transform`` 的效率不如一起执行。 :class:`base.TransformerMixin` 提供了一个默认实现,确保在 ``fit_transform`` 是否被专门化的情况下,转换器之间具有一致的接口。 在 :term:`归纳` 学习中——目标是学习一个可以应用于新数据的泛化模型——用户应该注意不要在进一步建模之前将 ``fit_transform`` 应用于整个数据集(即训练和测试数据一起),因为这会导致 :term:`数据泄露` 。 ``get_feature_names_out`` 主要用于 :term:`特征提取器` ,但也用于其他转换器,为估计器的 :term:`转换` 方法输出的每一列提供字符串名称。它输出一个字符串数组,并且可以接受一个类似数组的字符串作为输入,对应于可以从中生成输出列名称的输入列名称。如果未传递 `input_features` ,则将使用 `feature_names_in_` 属性。如果 `feature_names_in_` 属性未定义,则输入名称将被命名为 `[x0, x1, ..., x(n_features_in_ - 1)]` 。 ``get_n_splits`` 在一个 :term:`CV 分割器` (不是估计器)上,返回在给定相同参数的情况下,通过 :term:`分割` 的返回值迭代时将得到的元素数量。接受与分割相同的参数。 ``get_params`` 获取所有可以通过 :term:`set_params` 设置的 :term:`参数` 及其值。可以使用参数 ``deep`` ,当设置为 False 时,仅返回那些不包括 ``__`` 的参数,即不包括通过包含的估计器间接导致的参数。 大多数估计器采用 :class:`base.BaseEstimator` 中的定义,该定义仅采用为 ``__init__`` 定义的参数。 :class:`pipeline.Pipeline` 等类重新实现了 ``get_params`` 方法, 以声明在其 ``steps`` 参数中命名的估计器本身也是参数。 ``partial_fit`` 便于以在线方式拟合估计器。与 ``fit`` 不同,重复调用 ``partial_fit`` 不会清除模型, 而是用提供的数据更新模型。提供给 ``partial_fit`` 的数据部分可以称为小批量。 每个小批量必须具有一致的形状等。在迭代估计器中, ``partial_fit`` 通常只执行一次迭代。 ``partial_fit`` 也可用于 :term:`外存` 学习,尽管通常仅限于可以在线执行学习的情况, 即模型在每次 ``partial_fit`` 后即可使用,无需单独的处理来完成模型。 :class:`cluster.Birch` 引入了这样的约定:调用 ``partial_fit(X)`` 将生成一个未完成的模型, 但可以通过调用 ``partial_fit()`` (即不传递进一步的小批量)来完成模型。 通常,估计器参数在调用 ``partial_fit`` 之间不应被修改,尽管 ``partial_fit`` 也应验证它们 以及新的小批量数据。相比之下, ``warm_start`` 用于使用相同数据但不同参数重复拟合相同的估计器。 与 ``fit`` 类似, ``partial_fit`` 应返回估计器对象。 要清除模型,应构造一个新的估计器,例如使用 :func:`base.clone` 。 **注意**:在 ``fit`` 之后使用 ``partial_fit`` 会导致未定义的行为。 ``predict`` 为每个样本进行预测,通常只接受 :term:`X` 作为输入(但请参阅下面的回归器输出约定)。 :term:`分类器` 或 :term:`回归器` ,这个预测是在拟合时使用的相同目标空间中进行的(例如,如果拟合时的 ``y`` 由这些字符串组成,则可能是 {'red', 'amber', 'green'} 之一)。尽管如此,即使传递给 :term:`拟合` 的 ``y`` 是一个列表或其他类似数组的对象, ``predict`` 的输出应该始终是一个数组或稀疏矩阵。在 :term:`聚类器` 或 :term:`异常检测器` 中,预测是一个整数。 如果估计器尚未 :term:`拟合` ,调用此方法应引发 :class:`exceptions.NotFittedError` 。 输出约定: 分类器 形状为``(n_样本,)````(n_样本, n_输出)``的数组。:term:`多标签 ` 数据可以表示为稀疏矩阵,如果拟合时使用了稀疏矩阵。每个元素应该是分类器的 :term:`classes_` 属性中的一个值。 聚类器 形状为 ``(n_样本,)`` 的数组,其中每个值从 0 到 ``n_聚类 - 1`` (如果相应的样本被聚类),如果样本未被聚类则为 -1,如 :func:`cluster.dbscan` 中所示。 异常检测器 形状为 ``(n_样本,)`` 的数组,其中每个值为异常值时为 -1,否则为 1。 回归器 形状为 ``(n_样本,)`` 的数值数组,通常为 float64。一些回归器在其 ``predict`` 方法中有额外选项,允许它们返回相对于预测值的标准差( ``return_std=True`` )或协方差( ``return_cov=True`` )。在这种情况下,返回值是一个对应于(预测均值,标准差,协方差)的数组元组。 ``predict_log_proba`` :term:`predict_proba` 输出的自然对数,提供 以促进数值稳定性。 ``predict_proba`` 在 :term:`分类器` 和 :term:`聚类器` 中的一个方法,可以返回每个类别/簇的概率估计。其输入通常仅为一些观测数据,:term:`X` 。 如果估计器尚未 :term:`fitted` ,调用此方法应引发 :class:`exceptions.NotFittedError` 。 输出约定类似于 :term:`decision_function` ,除了在 :term:`二分类` 情况下,每个类别输出一列(而 ``decision_function`` 输出一个一维数组)。对于二分类和多分类预测,每行应加和为1。 与其他方法一样, ``predict_proba`` 仅在估计器可以进行概率预测时存在(参见 :term:`鸭子类型` )。这意味着该方法的存在可能取决于估计器参数(例如在 :class:`linear_model.SGDClassifier` 中)或训练数据(例如在 :class:`model_selection.GridSearchCV` 中),并且可能仅在拟合后出现。 ``score`` 估计器上的一个方法,通常是一个 :term:`预测器` ,用于评估其在给定数据集上的预测,并返回一个单一的数值分数。返回值越大应表示预测越好;默认情况下,分类器使用准确度,回归器使用 R^2。 如果估计器尚未 :term:`fitted` ,调用此方法应引发 :class:`exceptions.NotFittedError` 。 一些估计器实现了自定义的、特定于估计器的评分函数,通常是模型下数据的似然度。 ``score_samples`` 返回每个给定样本的分数的方法。*分数* 的确切定义因类而异。在密度估计的情况下,它可以是数据上的对数密度模型,并且在 在异常检测的情况下,它可能是数据的异常因子的对立面。 如果估计器尚未被 :term:`fitted` ,调用此方法应引发 :class:`exceptions.NotFittedError` 。 ``set_params`` 在任何估计器中都可用,接受与 :term:`get_params` 中的键相对应的关键字参数。每个参数都提供一个新值进行赋值,使得在调用 ``set_params`` 之后调用 ``get_params`` 将反映更改的 :term:`parameters` 。大多数估计器使用 :class:`base.BaseEstimator` 中的实现,该实现处理嵌套参数,并在估计器上将参数设置为属性。该方法在 :class:`pipeline.Pipeline` 及相关估计器中被重写。 ``split`` 在 :term:`CV splitter` (不是估计器)上,此方法接受参数(:term:`X` 、:term:`y` 、:term:`groups` ),其中所有参数都可能是可选的,并返回一个迭代器,遍历 ``(train_idx, test_idx)`` 对。每个 {train,test}_idx 是一个一维整数数组,其值从 0 到 ``X.shape[0] - 1`` ,长度任意,使得没有值同时出现在某个 ``train_idx`` 及其对应的 ``test_idx`` 中。 ``transform`` 在 :term:`transformer` 中,将输入(通常仅 :term:`X` )转换到某个转换空间(通常记为 :term:`Xt` )。输出是一个长度为 :term:`n_samples` 的数组或稀疏矩阵,并且在 :term:`fitting` 后列数固定。 如果估计器尚未被 :term:`fitted` ,调用此方法应引发 :class:`exceptions.NotFittedError` 。 .. _glossary_parameters: 参数 ==== 这些常见的参数名称,专门用于估计器构造(参见概念 :term:`parameter` ),有时也作为函数或非估计器构造函数的参数出现。 .. glossary:: ``class_weight`` 用于在拟合分类器时指定样本权重,作为目标类别 (:term:`target` ) 的函数。当同时支持并给出 :term:`sample_weight` 时,它将与 ``class_weight`` 贡献相乘。类似地,在多输出 (:term:`multioutput` ) 任务(包括多标签 (:term:`multilabel` ))中使用 ``class_weight`` 时,权重会跨输出(即 ``y`` 的列)相乘。 默认情况下,所有样本具有相等的权重,使得类别实际上按其在训练数据中的流行程度加权。这可以通过 ``class_weight={label1: 1, label2: 1, ...}`` 对所有类别标签显式实现。 更一般地, ``class_weight`` 被指定为一个字典,将类别标签映射到权重( ``{class_label: weight}`` ),使得命名类别的每个样本都被赋予该权重。 ``class_weight='balanced'`` 可用于通过给予每个样本与其类别在训练数据中的流行程度成反比的权重,使所有类别具有相等的权重: ``n_samples / (n_classes * np.bincount(y))`` 。类别权重将根据算法以不同方式使用:对于线性模型(如线性 SVM 或逻辑回归),类别权重将通过按每个样本的类别权重加权损失来改变损失函数。对于基于树的算法,类别权重将用于重新加权分裂准则。**注意**,然而这种再平衡不考虑每个类别中样本的权重。 对于多输出分类,使用字典列表来指定每个输出的权重。例如,对于四类别多标签分类,权重应为 ``[{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}]`` 而不是 ``[{1:1}, {2:5}, {3:1}, {4:1}]`` 。 ``class_weight`` 参数通过 :func:`utils.class_weight.compute_class_weight` 进行验证和解释。 ``cv`` 确定交叉验证分割策略,如在基于交叉验证的程序中使用。 ``cv`` 也可在估计器中使用,例如 :class:`multioutput.ClassifierChain` 或 :class:`calibration.CalibratedClassifierCV` ,这些估计器使用一个估计器的预测结果作为另一个估计器的训练数据,以避免过度拟合训练监督。 ``cv`` 的可能输入通常包括: - 一个整数,指定 K 折交叉验证中的折数。如果估计器是分类器(由 :func:`base.is_classifier` 确定),并且 :term:`targets` 可能代表二分类或多分类(但不是多输出)分类问题(由 :func:`utils.multiclass.type_of_target` 确定),K 折将在类别上进行分层。 - 一个 :term:`cross-validation splitter` 实例。请参阅 :ref:`User Guide ` 以了解 Scikit-learn 中可用的分割器。 - 一个生成训练/测试分割的迭代器。 在某些例外情况下(特别是当不使用交叉验证是一个选项时),默认值为 5 折。 ``cv`` 值通过 :func:`model_selection.check_cv` 进行验证和解释。 ``kernel`` 指定核方法算法中使用的核函数。例如,估计器 :class:`svm.SVC` 和 :class:`gaussian_process.GaussianProcessClassifier` 都有一个 ``kernel`` 参数,该参数接受要使用的核函数的名称作为字符串或用于计算核矩阵的可调用核函数。更多参考信息,请参阅 :ref:`kernel_approximation` 和 :ref:`gaussian_process` 用户指南。 ``max_iter`` 指定算法在停止之前可以执行的最大迭代次数。 对于涉及迭代优化的估计器,这决定了在 :term:`fit` 中要执行的最大迭代次数。如果在 ``max_iter`` 次迭代后仍未收敛,应引发 :class:`exceptions.ConvergenceWarning` 。请注意,“单次迭代”的解释在不同估计器之间不一致:有些(但不是所有)使用它来表示单个时期(即遍历数据中的每个样本)。 FIXME 也许我们应该有一些关于 ConvergenceWarning 和 max_iter 之间关系的共同测试。 ``memory`` 一些估计器利用 :class:`joblib.Memory` 在拟合过程中存储部分解决方案。因此,当再次调用 ``fit`` 时,这些部分解决方案已被记忆化并可以重用。 ``memory`` 参数可以指定为一个带有目录路径的字符串,或者可以使用 :class:`joblib.Memory` 实例(或具有类似接口的对象,即具有 ``cache`` 方法的对象)。 ``memory`` 值通过 :func:`utils.validation.check_memory` 进行验证和解释。 ``metric`` 作为参数,这是确定两个数据点之间距离的方案。参见 :func:`metrics.pairwise_distances` 。在实践中,对于某些算法,可能会使用不适当的距离度量(不遵守三角不等式的度量,如余弦距离)。 XXX: 层次聚类使用 ``affinity`` 表示这个含义。 我们还使用 *metric* 来指代 :term:`evaluation metrics` ,但避免将其作为参数名称使用。 ``n_components`` 一个 :term:`transformer` 应将输入转换成的特征数量。参见 :term:`components_` 以了解仿射投影的特殊情况。 ``n_iter_no_change`` 在停止迭代过程之前,等待没有改进的迭代次数。这也被称为*耐心*参数。它通常与 :term:`early stopping` 一起使用,以避免过早停止。 ``n_jobs`` 此参数用于指定应使用多少并发进程或线程来并行化使用 :term:`joblib` 的例程。 ``n_jobs`` 是一个整数,指定最大并发运行的工作者数量。如果给定 1,则完全不使用 joblib 并行化,这对于调试很有用。如果设置为 -1,则使用所有 CPU。对于 ``n_jobs`` 低于 -1 的情况,使用 (n_cpus + 1 + n_jobs) 个 CPU。例如,使用 ``n_jobs=-2`` ,则使用除一个以外的所有 CPU。 ``n_jobs`` 默认为 ``None`` ,这意味着*未设置*;通常会被解释为 ``n_jobs=1`` ,除非当前的 :class:`joblib.Parallel` 后端上下文指定了其他情况。 请注意,即使 ``n_jobs=1`` ,在某些配置中也可能使用低级并行化(通过 Numpy 和 OpenMP)。 有关 ``joblib`` 的使用及其与 scikit-learn 的交互的更多详细信息,请参阅我们的 :ref:`parallelism notes ` 。 ``pos_label`` 在正类不被假定的二分类问题中,必须用哪个值对正标签进行编码。此值通常需要计算非对称评估指标,如精确率和召回率。 ``random_state`` 每当随机化是 Scikit-learn 算法的一部分时,可以提供 ``random_state`` 参数来控制使用的随机数生成器。请注意,仅仅存在 ``random_state`` 并不意味着总是使用随机化,因为它可能取决于另一个参数,例如 ``shuffle`` ,是否被设置。 传递的值将影响函数返回结果的可重复性(:term:`fit` 、:term:`split` 或任何其他类似 :func:`~sklearn.cluster.k_means` 的函数)。 `random_state` 的值可以是: None(默认) 使用来自 :mod:`numpy.random` 的全局随机状态实例。多次调用函数将重用相同的实例,并产生不同的结果。 一个整数 使用由给定整数种子的新的随机数生成器。使用整数将在不同调用之间产生相同的结果。然而,检查您的结果在多个不同的随机种子下是否稳定可能是值得的。流行的整数随机种子是 0 和 `42 `_ 。整数值必须在范围 `[0, 2**32 - 1]` 内。 一个 :class:`numpy.random.RandomState` 实例 使用提供的随机状态,仅影响使用该相同随机状态实例的其他用户。多次调用函数将重用相同的实例,并产生不同的结果。 内部使用 :func:`utils.check_random_state` 来验证输入的 ``random_state`` 并返回一个 :class:`~numpy.random.RandomState` 实例。 有关如何控制 scikit-learn 对象的随机性并避免常见陷阱的更多详细信息,您可以参考 :ref:`randomness` 。 ``scoring`` 指定要最大化的评分函数(通常通过 :ref:`cross validation ` ),或者在某些情况下指定要报告的多个评分函数。评分函数可以是接受的 by :func:`metrics.get_scorer` 或一个可调用的 :term:`scorer` ,不要与 :term:`evaluation metric` 混淆,因为后者具有更多样化的 API。 ``scoring`` 也可以设置为 None,在这种情况下,使用估计器的 :term:`score` 方法。请参阅用户指南中的 :ref:`scoring_parameter` 。 当可以评估多个指标时, ``scoring`` 可以作为唯一字符串列表、键为名称、值为可调用对象的字典或返回字典的可调用对象给出。请注意,这 *不* 指定要最大化的评分函数,并且可以使用另一个参数(如 ``refit`` )来实现此目的。 ``scoring`` 参数通过 :func:`metrics.check_scoring` 进行验证和解释。 ``verbose`` 目前,Scikit-learn 中的日志记录处理并不非常一致,但当它作为选项提供时, ``verbose`` 参数通常可用于选择无日志记录(设置为 False)。任何 True 值应启用某些日志记录,但较大的整数(例如高于 10)可能需要完全详细程度。详细日志通常打印到标准输出。 估计器不应在默认的 ``verbose`` 设置下在标准输出上产生任何输出。 ``warm_start`` 当在同一数据集上重复拟合估计器,但参数值不同(例如,为了找到最大化性能的值,如 :ref:`grid search ` 中所示)时,可能可以重用从前一个参数值学到的模型方面,节省时间。当 ``warm_start`` 为真时,现有 :term:`fit` 模型的 :term:`attributes` 用于在后续的 :term:`fit` 调用中初始化新模型。 请注意,这仅适用于某些模型和某些 参数,甚至一些参数值的顺序。一般来说, ``warm_start`` 和控制估计器迭代次数的参数之间存在交互作用。 对于从 :mod:`~sklearn.ensemble` 导入的估计器, ``warm_start`` 将与 ``n_estimators`` 或 ``max_iter`` 交互。对于这些模型,通过 ``len(estimators_)`` 或 ``n_iter_`` 报告的迭代次数对应于自模型初始化以来学习的估计器/迭代总数。因此,如果一个模型已经用 `N` 个估计器初始化,并且调用 `fit` 时将 ``n_estimators`` 或 ``max_iter`` 设置为 `M` ,模型将训练 `M - N` 个新的估计器。 其他模型,通常使用基于梯度的求解器,具有不同的行为。它们都暴露了一个 ``max_iter`` 参数。报告的 ``n_iter_`` 对应于上次调用 ``fit`` 期间完成的迭代次数,并且最多为 ``max_iter`` 。因此,我们不考虑自初始化以来估计器的状态。 :term:`partial_fit` 也在调用之间保留模型,但有所不同:使用 ``warm_start`` 时,参数会改变,而数据在调用 ``fit`` 时(或多或少)保持不变;使用 ``partial_fit`` 时,数据的小批量会改变,而模型参数保持固定。 有些情况下,您希望使用 ``warm_start`` 来拟合不同的但密切相关的数据。例如,可以先对数据子集进行拟合,然后在完整数据集上微调参数搜索。对于分类,一系列 ``warm_start`` 调用 ``fit`` 中的所有数据必须包含每个类别的样本。 .. _glossary_attributes: Attributes ========== 参见概念 :term:`attribute` 。 .. glossary:: ``classes_`` 分类器已知的类别标签列表,每个标签映射到一个在模型表示中使用的数值索引。例如,从 :term:`predict_proba` 输出的数组具有与 ``classes_`` 对齐的列。对于 :term:`multi-output` 分类器, ``classes_`` 应该是一个列表的列表,每个输出对应一个类别列表。对于每个输出,类别应该按数值(或字符串的字母顺序)排序。 ``classes_`` 及其索引映射通常由 :class:`preprocessing.LabelEncoder` 管理。 ``components_`` 形状为 ``(n_components, n_features)`` 的仿射变换矩阵,在许多线性 :term:`transformers` 中使用,其中 :term:`n_components` 是输出特征的数量,:term:`n_features` 是输入特征的数量。 另请参见 :term:`components_` ,这是线性预测器中类似的属性。 ``coef_`` 广义线性模型 :term:`predictor` 的权重/系数矩阵,形状为 ``(n_features,)`` 用于二分类和单输出回归, ``(n_classes, n_features)`` 用于多类分类, ``(n_targets, n_features)`` 用于多输出回归。请注意,这不包括截距(或偏差)项,该项存储在 ``intercept_`` 中。 当可用时,通常不会提供 ``feature_importances_`` ,但可以计算为 ``coef_`` 中每个特征条目的范数。 另请参见 :term:`components_` ,这是线性变换器中类似的属性。 ``embedding_`` 训练数据在 :ref:`manifold learning ` 估计器中的嵌入,形状为 ``(n_samples, n_components)`` ,与 :term:`fit_transform` 的输出相同。另请参见 :term:`labels_` 。 ``n_iter_`` 当拟合一个可能因收敛而停止的迭代估计器时,实际执行的迭代次数。另请参阅 :term:`max_iter` 。 ``feature_importances_`` 在一些 :term:`predictors` 中可用的形状为 ``(n_features,)`` 的向量,用于提供模型预测中每个特征重要性的相对度量。 ``labels_`` 在 :term:`clusterers` 中,包含训练数据中每个样本的聚类标签的向量,与 :term:`fit_predict` 的输出相同。另请参阅 :term:`embedding_` 。 .. _glossary_sample_props: 数据和样本属性 ============== 参见概念 :term:`样本属性` 。 .. glossary:: ``groups`` 在交叉验证例程中用于标识相关样本。每个值是一个标识符,使得在支持的 :term:`CV splitter` 中,来自某些 ``groups`` 值的样本可能不会同时出现在训练集和相应的测试集中。参见 :ref:`group_cv` 。 ``sample_weight`` 每个样本的相对权重。直观上,如果所有权重都是整数,加权模型或分数应等同于重复样本次数等于权重中指定次数时计算的模型或分数。权重可以指定为浮点数,因此样本权重通常等效于一个常数正比例因子。 FIXME 这种解释在实践中总是如此吗?我们没有共同的测试。 一些估计器,如决策树,支持负权重。 FIXME: 此功能或其缺失可能在许多估计器中未经过测试或未记录。 并非完全如此,其中模型的其他参数考虑了区域中的样本数量,如 :class:`cluster.DBSCAN` 中的 ``min_samples`` 。在这种情况下,样本计数变为 转换为其权重的总和。 在分类中,样本权重也可以通过 :term:`class_weight` 估计器 :term:`parameter` 作为类的函数来指定。 ``X`` 表示在训练和预测时观察到的数据,用作学习中的自变量。使用大写字母表示它通常是一个矩阵(参见 :term:`rectangular` )。 当它是一个矩阵时,每个样本可以表示为一个 :term:`feature` 向量,或者与每个训练样本的 :term:`precomputed` (不)相似度向量。 ``X`` 也可能不是一个矩阵,并且可能需要一个 :term:`feature extractor` 或一个 :term:`pairwise metric` 在训练模型之前将其转换为一个矩阵。 ``Xt`` “转换后的 :term:`X` ”的简写。 ``y`` ``Y`` 表示在训练时可能作为学习中的因变量观察到的数据,但在预测时不可用,并且通常是预测的 :term:`target` 。该符号可能使用大写字母表示它是一个矩阵,表示 :term:`multi-output` 目标,例如;但我们通常使用 ``y`` ,有时甚至在假设多个输出时也这样做。