Pipeline()的作用就是把所有模型塞到管道里,调用管道时依次对数据进行处理,得到最终的分类结果。使用管道的有点有:
1.更干净的代码:在预处理的每个步骤中考虑数据可能会变得混乱。
2.使用管道,您无需在每个步骤中手动跟踪培训和验证数据。
3.错误更少:错误地使用步骤或忘记预处理步骤的机会更少。
4.易于实现生产:很难将模型从原型过渡到可大规模部署的模型。
通常会按照以下顺序来构建管道:【数据标准化的学习器—特征提取的学习器—执行预测的学习器/分类器】其中最后一个模型一定要是估计器,例如分类器。
Pipeline就是把这几个模型塞到管子里合并成一个模型调用,当训练样本数据送进Pipeline进行处理时, 它会逐个调用每个模型的fit()和transform()方法,其中最后一个节点的fit()方法来拟合数据。
————————————————
原文链接:Python学习笔记外传之sklearn中的Pipeline串联用法(一)https://blog.csdn.net/u010230273/article/details/98493025.
#模型串联
pip=Pipeline(
[ #所有模型写进列表内
(‘模型一名称’,模型一调用), #模型名称可以自己命名
(‘模型二名称’,模型二调用),
(‘模型三名称’, 模型三调用)
]
)
#模型调用
model=pip.fit(x,y)
综上所诉,pipeline()的作用就是封装打包各个模块,下面简单介绍一下本文所设计的pipeline结构:
- clf(Pipeline)[
preprocessor(ColumnTransformer)[
numerical_transformer[
SimpleImputer],
categorical_transformer(Pipeline)[
SimpleImputer,
OneHotEncoder]],
model[RandomForestRegressor]
]
import pandas as pd
from sklearn.model_selection import train_test_split
# Read the data
X_full = pd.read_csv('C:/Users/Administrator/Desktop/home-data-for-ml-course/train.csv', index_col='Id')
X_test_full = pd.read_csv('C:/Users/Administrator/Desktop/home-data-for-ml-course/test.csv', index_col='Id')
# Remove rows with missing target, separate target from predictors
X_full.dropna(axis=0, subset=['SalePrice'], inplace=True)
y = X_full.SalePrice
X_full.drop(['SalePrice'], axis=1, inplace=True)
# Break off validation set from training data
X_train_full, X_valid_full, y_train, y_valid = train_test_split(X_full, y,
train_size=0.8, test_size=0.2,
random_state=0)
# "Cardinality" means the number of unique values in a column
# Select categorical columns with relatively low cardinality (convenient but arbitrary)
categorical_cols = [cname for cname in X_train_full.columns if
X_train_full[cname].nunique() < 10 and
X_train_full[cname].dtype == "object"]
# Select numerical columns
numerical_cols = [cname for cname in X_train_full.columns if
X_train_full[cname].dtype in ['int64', 'float64']]
# Keep selected columns only
my_cols = categorical_cols + numerical_cols
X_train = X_train_full[my_cols].copy()
X_valid = X_valid_full[my_cols].copy()
X_test = X_test_full[my_cols].copy()
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
# 数值数据的预处理SimpleImputer用于缺失值补全,constant用常量补全
#定义数值型特征预处理器
numerical_transformer = SimpleImputer(strategy='constant')
# 预处理分类数据
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),#most_frequent频次最多的
('onehot', OneHotEncoder(handle_unknown='ignore'))#ignore表示当validation data中出现training data中没出现的值时,忽略。
])
# 捆绑预处理数字和分类数据
preprocessor = ColumnTransformer(
transformers=[
('num', numerical_transformer, numerical_cols),
('cat', categorical_transformer, categorical_cols)
])
# 定义模型--随机森林
model = RandomForestRegressor(n_estimators=100, random_state=0)
首先介绍一下本文用来处理缺失值的SimpleImputer类。
SimpleImputer类提供了处理输入缺失值的基本策略。缺失值可以用常量值或使用缺失值所在列的统计信息(平均值、中位数或最频繁)进行填充。当使用’most_frequent’或’constant’策略时,SimpleImputer类还支持表示为字符串值或pandas分类的分类数据。
以下代码演示如何使用包含缺少值的列(轴0)的平均值替换缺少值。
import numpy as np
from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
x = [[7, 2, 3], [4, np.nan, 6], [10, 5, 9]]
data = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]]
Fit = imp_mean.fit(x)
print(Fit)
SimpleImputer(copy=True,fill_value=None,missing_values=nan,strategy=‘mean’,verbose=0)
查看用来填补每列的值使用:Fit.statistics_
Fit.statistics_
[7. 3.5 6.]
计算过程【(7+4+10)/3=7】【(2+5)/2=3.5】【(3+6+9)/3=6】
【注】mean是每列非‘nan’的数值的均值,如某列为[2,np.nan,np.nan]则mean为2/1=2
new_data = imp_mean.transform(data)
print(imp_mean.transform(data))
[[7. 2. 3.]
[4. 3.5 6.]
[10. 3.5 9.]]
SimpleImputer用法来源:https://blog.csdn.net/qq_40773512/article/details/82662191.
与管道将预处理和建模步骤捆绑在一起的方式类似,本文使用ColumnTransformer类将不同的预处理步骤捆绑在一起,如在数字数据中估算缺失值,以及插补缺失值,并对分类数据应用一键编码。
sklearn文档ColumnTransformer简介:https://scikit-learn.org/stable/modules/generated/sklearn.compose.ColumnTransformer.html?highlight=columntransformer.
from sklearn.compose import ColumnTransformer
preprocessor = ColumnTransformer(
transformers=[
('num', numerical_transformer, numerical_cols),
('cat', categorical_transformer, categorical_cols)
])
transformers:(名称,转换器,列)元组的列表,指定要应用于数据子集的转换器对象。
最后,我们使用Pipeline类来定义捆绑了预处理和建模步骤的管道。
通过管道,我们可以预处理训练数据并将模型拟合到一行代码中。
# 在管道中捆绑预处理和建模代码
clf = Pipeline(steps=[('preprocessor', preprocessor),
('model', model)
])
接下来就是常规操作了,通过管道,我们将X_valid中未处理的特征提供给predict()命令,并且管道在生成预测之前自动对特征进行预处理。
# 预处理训练数据,拟合模型
clf.fit(X_train, y_train)
#预处理验证数据,获得预测
preds = clf.predict(X_valid)
print('MAE:', mean_absolute_error(y_valid, preds))
MAE: 17861.780102739725
# 预处理测试数据,拟合模型
preds_test =clf.predict(X_test)
# 保存至文件
output = pd.DataFrame({'Id': X_test.index,
'SalePrice': preds_test})
output.to_csv('.../submission_datawork5.csv', index=False)