• 机器学习【十一】管道模型


    把一系列算法打包在一起,让他们各司其职,形成一个流水线,即“管道模型”

    就像组装汽车的工厂流水线

    本节涉及:

    • 管道模型的基本概念和使用
    • 使用管道模型进行模型选择
    • 使用管道模型进行参数调优

    管道模型的基本概念和使用

    这种让我们若干个模型完美配合的功能,更完美的叫法——sklearn中的类(class)

    1.基本概念

    如果我们要对某个数据集进行进行模型训练的话,大概做法:

    载入数据集【继续使用make_blobs 生成数据集】,然后对数据集进行预处理【假设需要】

    #导入数据集生成器
    from sklearn.datasets import make_blobs
    #导入数据集拆分工具
    from sklearn.model_selection import train_test_split
    #导入预处理工具
    from sklearn.preprocessing import StandardScaler
    #导入多层感知器神经网络
    from sklearn.neural_network import MLPClassifier
    #导入画图工具
    import matplotlib.pyplot as plt
    #生成样本数量200,分类2,标准差5的数据集
    X,y = make_blobs(n_samples=200,centers=2,cluster_std=5)
    X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=38)
    #对数据进行预处理
    scaler = StandardScaler().fit(X_train)
    X_train_scaled = scaler.transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    print('训练集数据形态:',X_train_scaled.shape)
    print('测试集数据形态:',X_test_scaled.shape)
    训练集数据形态: (150, 2)
    测试集数据形态: (50, 2)

    #这段代码中,我们选择的是MLP多层感知神经网络作为下一步要用的分类器模型【因为MLP是典型的需要进行数据预处理的算法模型】

     【结果分析】

     训练集中的数据样本为150个,测试集中的样本数量为50个,特征数都是2

    看一下未经预处理的训练集和经过预处理的数据差别:

    #原始的训练集
    plt.scatter(X_train[:,0],X_train[:,1])
    #经过预处理的训练集
    plt.scatter(X_train_scaled[:,0],X_train_scaled[:,1],marker='^',edgecolor='k')
    plt.title('training set & scaled trianing set')
    plt.show()

     

    【结果分析】

     从图中可以看到,StandardScaler将训练集的数据变的更加聚拢——> 利于使用神经网络模型进行拟合

    使用网格搜索来确定MLP的最优参数:

    【本例中选择hidden_layer_sizes 和 alpha 进行实验】

    #导入网格搜索
    from sklearn.model_selection import GridSearchCV
    #设定网格搜索的模型参数字典
    params = {'hidden_layer_sizes':[(50,),(100,),(100,100)],'alpha':[0.0001,0.001,0.01,0.1]}
    #建立网格搜索模型
    grid = GridSearchCV(MLPClassifier(max_iter=1600,random_state=38),param_grid=params,cv=3)
    #拟合数据
    grid.fit(X_train_scaled,y_train)
    print('最佳得分:',grid.best_score_)
    print('最佳参数',grid.best_params_)
    最佳得分: 0.9533333333333334
    最佳参数 {'alpha': 0.0001, 'hidden_layer_sizes': (100,)}

    拟合测试集:

    print('测试集得分:',grid.score(X_test_scaled,y_test))
    测试集得分: 0.82

     由于想测试的参数组合有3*4=12个,需要做12次预处理吗?

    使用管道模型解决这个问题: 

    #导入管道模型
    from sklearn.pipeline import Pipeline
    #建立包含预处理和神经网络的管道模型
    pipeline = Pipeline([('scaler',StandardScaler()),('mlp',MLPClassifier(max_iter=1600,random_state=38))])
    #拟合数据
    pipeline.fit(X_train,y_train)
    print('使用管道模型的MLP模型评分:',pipeline.score(X_test,y_test))
    使用管道模型的MLP模型评分: 0.82

     【结果分析】

    这段代码中,我们导入了sklearn中的 Pipeline类,然后在这条流水线中安装了两个设备——进行预处理的StandardScaler 和 最大迭代数位1600的MLP多层感知神经网络

    然后用管道模型pipeline来拟合训练集,并对测试集进行评分

    如果生成的数据集中数据点的量级差异不大——管道模型的得分和之前的得分差距不大

     2.使用管道模型进行网格搜索

     刚使用管道模型将 数据预处理和模型训练打包 到了一起

     下面,进行网格搜索:

    #设置参数字典
    params = {'mlp__hidden_layer_sizes':[(50,),(100,),(100,100)],'mlp__alpha':[0.0001,0.001,0.01,0.1]}
    #将管道模型加入网格搜索
    grid = GridSearchCV(pipeline,param_grid=params,cv=3)
    #拟合数据
    grid.fit(X_train ,y_train)
    print('交叉验证最高分',grid.best_score_)
    print('最优参数',grid.best_params_)
    print('测试集得分',grid.score(X_test,y_test))
    交叉验证最高分 0.8533333333333334
    最优参数 {'mlp__alpha': 0.0001, 'mlp__hidden_layer_sizes': (100,)}
    测试集得分 0.84

    【随机生成的数据集不同,上述值不同】 

    【结果分析】

     

    通过使用管道模型,改变了交叉验证的方式:

     

    透视一下pipieline所进行处理的过程:

    print(pipeline.steps)
    [('scaler', StandardScaler(copy=True, with_mean=True, with_std=True)), ('mlp', MLPClassifier(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9,
           beta_2=0.999, early_stopping=False, epsilon=1e-08,
           hidden_layer_sizes=(100,), learning_rate='constant',
           learning_rate_init=0.001, max_iter=1600, momentum=0.9,
           n_iter_no_change=10, nesterovs_momentum=True, power_t=0.5,
           random_state=38, shuffle=True, solver='adam', tol=0.0001,
           validation_fraction=0.1, verbose=False, warm_start=False))]

     【结果分析】

     pipeline.steps 把包含在管道模型中的数据预处理scaler和多层感知神经网络MLP的全部参数返回,如同流水线的工作流程

    从结果可以看出,在GridsearchCV进行每一步交叉验证之前,pipeline都会对数据集和验证集进行StandardScaler预处理操作

    管道模型不仅可以把 数据预处理和模型训练集结合一起,也可以将很多不同的算法打包

  • 相关阅读:
    PHP静态页生成
    svn部署web项目
    Nginx出现403 forbidden
    Node-red的基础使用——inject/debug/function的使用(1)
    功能/性能测试报告的编写格式及模板
    node-red在不同环境安装步骤
    node-red实现接口自动化测试——初步认识
    docker删除image
    django测试开发,例一个接口的开发逻辑
    django测试平台开发,登录,验证,退出
  • 原文地址:https://www.cnblogs.com/expedition/p/10830477.html
Copyright © 2020-2023  润新知