zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    python调webservice和COM接口
    [转]Python存取XML方法简介
    python中json的操作示例
    [转]PictureEx.h和PictureEx.cpp源文件
    WebBrowser中取对应的图片资源
    #pragma section
    python调win32api调整屏幕分辨率
    徐思201771010132《面向对象程序设计(Java)》第十二周学习总结
    徐思/杨玲《面向对象程序设计(Java)》第十一周学习总结
    徐思201771010132《面向对象程序设计(java)》第十周学习总结
  • 原文地址:https://www.cnblogs.com/fb1704011013/p/11197865.html
Copyright © 2011-2022 走看看