zoukankan      html  css  js  c++  java
  • sklearn-pipeline、GridSearchCV、train_test_split

    1、pipeline

    pipeline 实现了对全部步骤的流式化封装和管理,可以很方便地使参数集在新数据集上被重复使用。

    (当我们对训练集应用各种预处理操作时(特征标准化、主成分分析等等),我们都需要对测试集重复利用这些参数。)

    pipeline 可以用于下面几处:

    • 模块化 Feature Transform,只需写很少的代码就能将新的 Feature 更新到训练集中。

    • 自动化 Grid Search,只要预先设定好使用的 Model 和参数的候选,就能自动搜索并记录最佳的 Model。

    • 自动化 Ensemble Generation,每隔一段时间将现有最好的 K 个 Model 拿来做 Ensemble。

    可放在Pipeline中的步骤可能有:

    • 特征标准化是需要的,可作为第一个环节
    • 既然是分类器,classifier也是少不了的,自然是最后一个环节
    • 中间可加上比如数据降维(PCA)
    • 。。。

    调用 Pipeline 时,输入由元组构成的列表,每个元组第一个值为变量名,元组第二个元素是 sklearn 中的 transformer 或 Estimator。

    注意中间每一步是 transformer,即它们必须包含 fit 和 transform 方法,或者  fit_transform
    最后一步是一个 Estimator,即最后一步模型要有 fit 方法,可以没有 transform 方法。

    然后用 Pipeline.fit对训练集进行训练,pipe_lr.fit(X_train, y_train)
    再直接用 Pipeline.score 对测试集进行预测并评分 pipe_lr.score(X_test, y_test)

    from sklearn.preprocessing import StandardScaler
    
    from sklearn.decomposition import PCA
    
    from sklearn.linear_model import LogisticRegression
    
    from sklearn.pipeline import Pipeline
    
    pipe_lr = Pipeline([('sc', StandardScaler()), ('pca', PCA(n_components=2)), ('clf', LogisticRegression(random_state=1)) ])
    
    pipe_lr.fit(X_train, y_train)
    
    print('Test accuracy: %.3f' % pipe_lr.score(X_test, y_test))

    2、train_test_split(随机划分训练集和测试集

    一般形式: 
    train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train data和testdata,形式为:

    X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.4, random_state=0)

    参数解释: 
    - train_data:所要划分的样本特征集 
    - train_target:所要划分的样本结果 
    - test_size:样本占比,如果是整数的话就是样本的数量 
    - random_state:是随机数的种子。 
    - 随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。 
    随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则: 
    - 种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。

    from sklearn.cross_validation import train_test_split  
    train= loan_data.iloc[0: 55596, :]  
    test= loan_data.iloc[55596:, :]  
    # 避免过拟合,采用交叉验证,验证集占训练集20%,固定随机种子(random_state)  
    train_X,test_X, train_y, test_y = train_test_split(train,  target,  test_size = 0.2,  random_state = 0)  
    train_y= train_y['label']  
    test_y= test_y['label'] 

    3、GridSearchCV

    GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。这个时候就是需要动脑筋了。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法:拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,但是省时间省力,

    estimator:所使用的分类器,如estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',random_state=10), 并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个scoring参数,或者score方法。
    param_grid:值为字典或者列表,即需要最优化的参数的取值,param_grid =param_test1,param_test1 = {'n_estimators':range(10,71,10)}。
    scoring :准确度评价标准,默认None,这时需要使用score函数;或者如scoring='roc_auc',根据所选模型不同,评价准则不同。字符串(函数名),或是可调用对象,需要其函数签名形如:scorer(estimator, X, y);如果是None,则使用estimator的误差估计函数。scoring参数选择如下:

    参考地址:http://scikit-learn.org/stable/modules/model_evaluation.html


    cv :交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。
    refit :默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可用的训练集与开发集进行,作为最终用于性能评估的最佳模型参数。即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集。
    iid:默认True,为True时,默认为各个样本fold概率分布一致,误差估计为所有样本之和,而非各个fold的平均。
    verbose:日志冗长度,int:冗长度,0:不输出训练过程,1:偶尔输出,>1:对每个子模型都输出。
    n_jobs: 并行数,int:个数,-1:跟CPU核数一致, 1:默认值。
    pre_dispatch:指定总共分发的并行任务数。当n_jobs大于1时,数据将在每个运行点进行复制,这可能导致OOM,而设置pre_dispatch参数,则可以预先划分总共的job数量,使数据最多被复制pre_dispatch次

    常用方法:

    grid.fit():运行网格搜索
    grid_scores_:给出不同参数情况下的评价结果
    best_params_:描述了已取得最佳结果的参数的组合
    best_score_:成员提供优化过程期间观察到的最好的评分

     

  • 相关阅读:
    61. 最长不含重复字符的子字符串
    60. 礼物的最大价值 (未理解)
    59. 把数字翻译成字符串
    58. 把数组排成最小的数
    57. 数字序列中某一位的数字 (不懂)
    spring data jpa 官方文档
    idea 编译报错 源发行版 1.8 需要目标发行版 1.8
    idea maven 依赖报错 invalid classes root
    solr
    spring boot 官方文档
  • 原文地址:https://www.cnblogs.com/hester-tang/p/8707658.html
Copyright © 2011-2022 走看看