python学习10之管道清理建模

  在本次得学习中,我们将会学习如何使用管道清理建模代码。

  1、介绍

    管道是保持数据预处理和建模代码组织的简单方法。

    具体来说,一个管道捆绑包预处理和建模步骤,这样您就可以像使用单个步骤一样使用整个捆绑包。

  2、管道使用的好处

    更简洁的代码:在预处理的每个步骤中计算数据可能会变得混乱。使用管道,我们不需要在每个步骤中手动跟踪培训和验证数据。

    更少的bug:错误应用步骤或忘记预处理步骤的机会更少。

    易于产品化:将模型从原型转换为可大规模部署的东西可能非常困难。

  3、举例说明

    我们仍使用墨尔本住房情况得数据

import pandas as pd
from sklearn.model_selection import train_test_split
#加载数据
data = pd.read_csv('E:/data_handle/melb_data.csv')
#选择目标
y = data.Price
#使用数字预测器
melb_predictors = data.drop(['Price'],axis=1)
X = melb_predictors.select_dtypes(exclude=['object'])
#将数据分为训练和验证子集
X_train_full, X_valid_full, y_train, y_valid = train_test_split(X,y,train_size=0.8, test_size =0.2,random_state=0)

#“基数”是指列中唯一的数目
#选择技术相对较低的分类列(方便但随意)
categorical_cols = [cname for cname in X_train_full.columns if X_train_full[cname].nunique()<10
                    and X_train_full[cname].dtype == "object"]
#选择数字列
numerical_cols = [cname for cname in X_train_full.columns if X_train_full[cname].dtype in ['int64', 'float64']]
#仅仅保留所选列
my_cols = categorical_cols + numerical_cols
X_train = X_train_full[my_cols].copy()
X_valid = X_valid_full[my_cols].copy()

    我们使用下面的head()方法查看训练数据。注意,数据同时包含分类数据和缺少值的列。有了管道,两者都很容易处理!

print(X_train.head())

  4、构建管道

    1)步骤1:定义预处理步骤

 

      与管道将预处理和建模步骤捆绑在一起类似,我们使用ColumnTransformer类将不同的预处理步骤捆绑在一起。

      代码如下:在数值数据中输入缺失值,然后输入缺失值,并对分类数据应用一种热编码。

# 数字数据预处理
numerical_transformer = SimpleImputer(strategy='constant')

# 分类数据的预处理
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])

# 数值和分类数据的束预处理
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numerical_transformer, numerical_cols),
        ('cat', categorical_transformer, categorical_cols)
    ])

    2)步骤2:定义模型

 

        接下来,我们使用熟悉的RandomForestRegressor类定义一个随机森林模型。

model = RandomForestRegressor(n_estimators=100, random_state=0)

    3)、步骤3:创建和评估管道

        最后,我们使用Pipeline类来定义一个管道,它捆绑了预处理和建模步骤。

        有几件重要的事情需要注意:使用管道,我们预处理培训数据并将模型放入一行代码中。

        (相反,在没有管道的情况下,我们必须分别执行计算、一次热编码和模型训练。如果我们必须同时处理数值变量和分类变量,这将变得特别混乱!)

        使用管道,我们将X_valid中的未处理特性提供给predict()命令,管道在生成预测之前自动预处理这些特性。

        (但是,如果没有管道,我们必须记住在进行预测之前要对验证数据进行预处理。)

#第三步
from sklearn.metrics import mean_absolute_error

#在管道中捆绑预处理和建模代码
my_pipeline = Pipeline(steps=[('preprocessor', preprocessor),
                              ('model', model)
                             ])

#:训练数据预处理,拟合模型
my_pipeline.fit(X_train, y_train)

# 验证数据的预处理,得到预测
preds = my_pipeline.predict(X_valid)

# 评价模型
score = mean_absolute_error(y_valid, preds)
print('MAE:', score)

  5、总结

    管道对于清理机器学习代码和避免错误非常有用,对于具有复杂数据预处理的工作流尤其有用。

本次学习到此结束!!!!!

#删除有缺少值得列
cols_with_missing = [col for col in X_train_full.columns
if X_train_full[col].isnull().any()]
X_train_full.drop(cols_with_missing, axis=1, inplace=True)
X_valid_full.drop(cols_with_missing, axis=1, inplace=True)
#“基数”是指列中唯一的数目
#选择技术相对较低的分类列(方便但随意)
low_cardinality_cols = [cname for cname in X_train_full.columns
if X_train_full[cname].dtype == 'object']
#选择数字列
numerical_cols = [cname for cname in X_train_full.columns if X_train_full[cname].dtype in ['int64', 'float64']]
#仅仅保留所选列
my_cols = low_cardinality_cols + numerical_cols
X_train = X_train_full[my_cols].copy()
X_valid = X_valid_full[my_cols].copy()
原文地址:https://www.cnblogs.com/fb1704011013/p/11197865.html