开始#

本指南的目的是说明提供的一些主要功能。它假定您具备以下非常基本的工作知识 机器学习实践(模型拟合、预测、交叉验证、 等)。请参阅我们的安装说明进行安装。scikit-learnscikit-learn

Scikit-learn是一个开源机器学习库,支持 监督学习和无监督学习。它还为 模型拟合、数据预处理、模型选择、模型评估、 以及许多其他实用程序。

拟合和预测:估计器基础知识#

Scikit-learn提供数十种内置机器学习算法和 模型,称为 Estimators。每个估计量都可以拟合到一些数据 使用其 fit 方法。

下面是一个简单的示例,我们将 a 拟合到一些非常基本的数据:

>>> from sklearn.ensemble import RandomForestClassifier
>>> clf = RandomForestClassifier(random_state=0)
>>> X = [[ 1,  2,  3],  # 2 samples, 3 features
...      [11, 12, 13]]
>>> y = [0, 1]  # classes of each sample
>>> clf.fit(X, y)
RandomForestClassifier(random_state=0)

fit 方法通常接受 2 个输入:

  • 样本矩阵(或设计矩阵)X。的大小通常为 ,这意味着样本为 表示为行,要素表示为列。X(n_samples, n_features)

  • 目标值 y,它们是回归任务的实数,或者 用于分类的整数(或任何其他离散值集)。为 unsupervised learning 任务,无需指定。 是 通常是一个 1d 数组,其中第 个条目对应于 的第 个样本(行)的目标。yyiiX

Both 和 通常都期望是 numpy 数组或等效的类似数组的数据类型,尽管一些估计器与其他 格式,例如稀疏矩阵。Xy

一旦拟合了估计器,它就可以用于预测 新数据。您无需重新训练 estimator:

>>> clf.predict(X)  # predict classes of the training data
array([0, 1])
>>> clf.predict([[4, 5, 6], [14, 15, 16]])  # predict classes of new data
array([0, 1])

Transformers 和预处理器 pre-processors#

机器学习工作流通常由不同的部分组成。典型的 pipeline 包含一个预处理步骤,该步骤转换或插补 data 和预测目标值的最终预测因子。

在 中,预处理器和Transformers遵循与 Estimator 对象(它们实际上都继承自同一个类)。transformer 对象没有 predict 方法,而是一个 transform 方法,该方法输出一个 新转换的样本矩阵 :scikit-learnBaseEstimatorX

>>> from sklearn.preprocessing import StandardScaler
>>> X = [[0, 15],
...      [1, -10]]
>>> # scale data according to computed scaling values
>>> StandardScaler().fit(X).transform(X)
array([[-1.,  1.],
       [ 1., -1.]])

有时,您希望对不同的功能应用不同的转换: ColumnTransformer 专为这些 用例。

管道:链接预处理器和估计器#

Transformers 和 estimators (predictors) 可以组合成一个 单个统一对象:a .管道 提供与常规 estimator 相同的 API:它可以拟合并用于 使用 和 进行预测。正如我们稍后将看到的,使用 pipeline 也会防止你的数据泄露,即泄露一些 测试训练数据中的数据。fitpredict

在下面的示例中,我们加载 Iris 数据集,将其拆分 转换为 train 和 test set,并在 测试数据:

>>> from sklearn.preprocessing import StandardScaler
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.pipeline import make_pipeline
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.metrics import accuracy_score
...
>>> # create a pipeline object
>>> pipe = make_pipeline(
...     StandardScaler(),
...     LogisticRegression()
... )
...
>>> # load the iris dataset and split it into train and test sets
>>> X, y = load_iris(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
...
>>> # fit the whole pipeline
>>> pipe.fit(X_train, y_train)
Pipeline(steps=[('standardscaler', StandardScaler()),
                ('logisticregression', LogisticRegression())])
>>> # we can now use it like any other estimator
>>> accuracy_score(pipe.predict(X_test), y_test)
0.97...

模型评估#

将模型拟合到某些数据并不意味着它会很好地预测 看不见的数据。这需要直接评估。我们刚刚看到了拆分 数据集转换为训练集和测试集,但提供了许多其他 用于模型评估的工具,特别是用于交叉验证的工具。scikit-learn

我们在这里简要地展示如何执行 5 重交叉验证过程, 使用帮助程序。请注意, 也可以手动迭代 folds,使用不同的 数据拆分策略,并使用自定义评分函数。请参考 我们的用户指南了解更多详情:

>>> from sklearn.datasets import make_regression
>>> from sklearn.linear_model import LinearRegression
>>> from sklearn.model_selection import cross_validate
...
>>> X, y = make_regression(n_samples=1000, random_state=0)
>>> lr = LinearRegression()
...
>>> result = cross_validate(lr, X, y)  # defaults to 5-fold CV
>>> result['test_score']  # r_squared score is high because dataset is easy
array([1., 1., 1., 1., 1.])

自动参数搜索#

所有估计器都有参数(在 文学)。估计器的泛化能力 通常严重依赖于几个参数。例如,a 具有一个用于确定森林中树木数量的参数,以及一个用于确定每棵树的最大深度的参数。 很多时候,不清楚这些参数的确切值是多少 应该是,因为它们依赖于手头的数据。n_estimatorsmax_depth

Scikit-learn提供自动查找最佳参数的工具 组合(通过交叉验证)。在下面的示例中,我们随机 使用 Object 搜索 Random Forest 的 parameter space。当搜索 已结束,则其行为为 a 已安装 最佳参数集。在用户指南中阅读更多内容:

>>> from sklearn.datasets import fetch_california_housing
>>> from sklearn.ensemble import RandomForestRegressor
>>> from sklearn.model_selection import RandomizedSearchCV
>>> from sklearn.model_selection import train_test_split
>>> from scipy.stats import randint
...
>>> X, y = fetch_california_housing(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
...
>>> # define the parameter space that will be searched over
>>> param_distributions = {'n_estimators': randint(1, 5),
...                        'max_depth': randint(5, 10)}
...
>>> # now create a searchCV object and fit it to the data
>>> search = RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0),
...                             n_iter=5,
...                             param_distributions=param_distributions,
...                             random_state=0)
>>> search.fit(X_train, y_train)
RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0), n_iter=5,
                   param_distributions={'max_depth': ...,
                                        'n_estimators': ...},
                   random_state=0)
>>> search.best_params_
{'max_depth': 9, 'n_estimators': 4}

>>> # the search object now acts like a normal random forest estimator
>>> # with max_depth=9 and n_estimators=4
>>> search.score(X_test, y_test)
0.73...

注意

在实践中,您几乎总是希望搜索 pipeline 而不是单个 estimator。主要的 原因是,如果您将预处理步骤应用于整个数据集 而不使用 pipeline,然后执行任何类型的交叉验证, 您将打破 训练和测试数据。事实上,由于您对数据进行了预处理 使用整个数据集,有关测试集的一些信息是 可用于火车组。这将导致高估 估计器的泛化能力(您可以在此 Kaggle 中阅读更多内容 帖子)。

使用管道进行交叉验证和搜索将在很大程度上保持 你从这个常见的陷阱中。

后续步骤#

我们已经简要介绍了 Estimator 拟合和预测、预处理 步骤、管道、交叉验证工具和自动超参数 搜索。本指南应为您提供一些主要 函数库的功能,但还有更多功能要做!scikit-learn

请参阅我们的用户指南,了解有关我们所有工具的详细信息 提供。您还可以在 API 参考中找到公共 API 的详尽列表。

您还可以查看我们的众多示例: 说明了在许多不同的上下文中的用法。scikit-learn

这些教程还包含其他学习内容 资源。