管道 —— 机器学习 4/7
一个带预处理的部署(甚至测试)复杂模型的关键技术。
本课中你将学到如何使用 管道 来清理你的模型代码。
简介
- 管道是一个简单的技巧,它可以使你的预处理和训练模型的代码更加整齐。具体的来说,一个管道将预处理和训练步骤包裹起来,给用户感觉好像是一步。
- 许多数据科学家不适用管道技术而是拼凑模型,但是管道有许多重要的好处,包括:
- 更整洁的代码 每一步预处理的时候计算数据会很使得代码很凌乱,有了管道技术,你就不需要每一步都手动跟踪你的训练集和验证集数据了。
- 报错更少 忘记执行某一步或者忘记数据预处理的几率会更少
- 易于流水线化 将模型的原型机转化成可大规模部署的模式会出奇的困难。我们在这不会提到相关的技术难题,但是管道技术可以帮助我们解决。
- 模型验证有更多选择 你将在下一节看到一个相关的例子,使用的是交叉验证。
案例
- 和之前的例子一样,我们还是使用墨尔本的房价数据,跳过数据加载过程,现在我们已经有了训练集和验证集:
X_train
,X_valid
,y_train
,y_valid
。 - 我们可以用
head()
方法预览一下数据集,可以注意到数据集中既有分类变量,也有丢失值。有了管道技术,我们能很轻松的处理两种问题!
X_train.head()
- 我们只需三步就可以创建一个完整的管道。
第一步:定义预处理步骤
- 和管道包裹预处理和训练步骤类似,我们使用
ColumnTransformer
类来将不同的预处理步骤包裹在一起。下面的代码完成了:- 在数值数据中填补丢失值;
- 在分类变量中填补丢失值并采用热编码处理分类变量;
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
# Preprocessing for numerical data
numerical_transformer = SimpleImputer(strategy='constant')
# Preprocessing for categorical data
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
# Bundle preprocessing for numerical and categorical data
preprocessor = ColumnTransformer(
transformers=[
('num', numerical_transformer, numerical_cols),
('cat', categorical_transformer, categorical_cols)
])
步骤二:定义模型
- 下面我们用
RandomForestRegressor
类来定义一个随机森林模型
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(n_estimators=100, random_state=0)
第三步:创建并评价管道
- 最后,我们将使用
Pipeline
类来定义一个包裹预处理和模型训练的管道,下面的问题需要额外注意:- 有了管道技术,我们只需要一行代码来实现处理数据和训练模型。(相比较而言,我们一般需要分步进行填补、热编码、模型训练。在我们要同时处理数值类数据和分类变量时,代码就会显得很凌乱)
- 有了管道技术,我们可以直接使用
X_valid
中的特性来预测,管道会自动帮我们预处理特征在产生预测结果。(然而,没有管道,我们记得预处理验证集,再预测)
from sklearn.metrics import mean_absolute_error
# Bundle preprocessing and modeling code in a pipeline
my_pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('model', model)
])
# Preprocessing of training data, fit model
my_pipeline.fit(X_train, y_train)
# Preprocessing of validation data, get predictions
preds = my_pipeline.predict(X_valid)
# Evaluate the model
score = mean_absolute_error(y_valid, preds)
print('MAE:', score)
MAE: 160679.18917034855
结论
管道技术再清理机器学习代码和避免出错时有奇效。并且他们再复杂数据预处理的工作流中也十分有用。