简介
在 scikit-learn 中,管道(pipelines)和复合估计器(composite estimators)用于将多个转换器(transformers)和估计器组合成一个单一模型。当存在处理数据的固定步骤序列时,例如特征选择、归一化和分类,这会很有用。管道还可用于联合参数选择,并确保在交叉验证期间测试数据的统计信息不会泄露到训练模型中。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会立即为你解决问题。
管道 - 链接估计器
scikit-learn 中的 Pipeline 类用于将多个估计器链接成一个。这使你能够对数据调用一次 fit 和 predict,以拟合一整个估计器序列。它还允许进行联合参数选择,并有助于避免在交叉验证中出现数据泄露。
要创建一个管道,你需要提供一个 (键, 值) 对的列表,其中 键 是用于标识每个步骤的字符串,值 是一个估计器对象。以下是创建一个包含 PCA 转换器和 SVM 分类器的管道的示例:
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA
estimators = [('reduce_dim', PCA()), ('clf', SVC())]
pipe = Pipeline(estimators)
你可以使用索引或名称来访问管道的步骤:
pipe.steps[0] ## 按索引访问
pipe[0] ## 等同于上述操作
pipe['reduce_dim'] ## 按名称访问
你还可以使用 make_pipeline 函数作为构建管道的简写:
from sklearn.pipeline import make_pipeline
from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import Binarizer
make_pipeline(Binarizer(), MultinomialNB())
嵌套参数
你可以使用 <估计器>__<参数> 的语法来访问管道中估计器的参数。这对于在管道中所有估计器的参数上进行网格搜索很有用。以下是一个示例:
pipe.set_params(clf__C=10)
缓存转换器
拟合转换器的计算成本可能很高。为避免重复计算,你可以使用 memory 参数在管道中启用缓存转换器。此参数可以设置为一个目录,转换器将被缓存到该目录中,或者设置为一个 joblib.Memory 对象。以下是一个示例:
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from tempfile import mkdtemp
from shutil import rmtree
estimators = [('reduce_dim', PCA()), ('clf', SVC())]
cachedir = mkdtemp()
pipe = Pipeline(estimators, memory=cachedir)
## Clear the cache directory when no longer needed
rmtree(cachedir)
变换目标回归器
TransformedTargetRegressor 类用于在拟合回归模型之前对回归问题中的目标变量进行变换。当你想要对目标变量应用某种变换(例如取对数)时,这会很有用。预测结果会通过逆变换映射回原始空间。以下是一个将 TransformedTargetRegressor 与线性回归模型和分位数变换器一起使用的示例:
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.compose import TransformedTargetRegressor
from sklearn.preprocessing import QuantileTransformer
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
X, y = fetch_california_housing(return_X_y=True)
transformer = QuantileTransformer(output_distribution='normal')
regressor = LinearRegression()
regr = TransformedTargetRegressor(regressor=regressor, transformer=transformer)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
regr.fit(X_train, y_train)
regr.score(X_test, y_test)
特征联合 - 复合特征空间
FeatureUnion 类用于将多个变换器对象组合成一个新的变换器,该变换器会合并它们的输出。当你想要对数据的不同特征应用不同的变换时,这很有用,例如分别对文本、浮点数和日期进行预处理。这些变换器会并行应用,并且它们输出的特征矩阵会并排连接成一个更大的矩阵。以下是一个示例:
from sklearn.pipeline import FeatureUnion
from sklearn.decomposition import PCA
from sklearn.decomposition import KernelPCA
estimators = [('linear_pca', PCA()), ('kernel_pca', KernelPCA())]
combined = FeatureUnion(estimators)
总结
管道和复合估计器是 scikit-learn 中强大的工具,用于将变换器和估计器组合成单个模型。它们提供了便利性、参数选择和数据安全性。管道允许链接估计器、嵌套参数以及缓存变换器。像 TransformedTargetRegressor 和 FeatureUnion 这样的复合估计器分别提供变换和特征组合。这些概念对于构建能够有效预处理和处理异构数据的复杂机器学习模型至关重要。