饭店流量预测

作者: 透明的红萝卜123 | 来源:发表于2019-02-15 15:08 被阅读0次

    lightgbm 模型


    import lightgbm as lgbm
    from sklearn import metrics
    from sklearn import model_selection
    
    
    np.random.seed(42)
    
    model = lgbm.LGBMRegressor(
        objective='regression', #目标函数,回归任务
        max_depth=5, #最大深度
        num_leaves=25, #叶子节点个数
        learning_rate=0.007, #学习率
        n_estimators=1000, # 最佳迭代轮数
        min_child_samples=80,
        subsample=0.8, #采样
        colsample_bytree=1,
        reg_alpha=0,
        reg_lambda=0,
        random_state=np.random.randint(10e6)
    )
    
    n_splits = 6
    #K折交叉验证
    cv = model_selection.KFold(n_splits=n_splits, shuffle=True, random_state=42)
    
    val_scores = [0] * n_splits
    
    sub = submission['id'].to_frame()
    sub['visitors'] = 0
    
    feature_importances = pd.DataFrame(index=X_train.columns)
    
    for i, (fit_idx, val_idx) in enumerate(cv.split(X_train, y_train)):
        #fit代表训练集,val代表验证集。validation(验证)
        X_fit = X_train.iloc[fit_idx]
        y_fit = y_train.iloc[fit_idx]
        X_val = X_train.iloc[val_idx]
        y_val = y_train.iloc[val_idx]
        
        model.fit(
            X_fit,
            y_fit,
            eval_set=[(X_fit, y_fit), (X_val, y_val)],
            eval_names=('fit', 'val'),
            eval_metric='l2',
            early_stopping_rounds=200,
            feature_name=X_fit.columns.tolist(),
            verbose=False
        )
        
        val_scores[i] = np.sqrt(model.best_score_['val']['l2'])
        sub['visitors'] += model.predict(X_test, num_iteration=model.best_iteration_)
        feature_importances[i] = model.feature_importances_
        
        print('Fold {} RMSLE: {:.5f}'.format(i+1, val_scores[i]))
        
    sub['visitors'] /= n_splits
    sub['visitors'] = np.expm1(sub['visitors'])
    
    val_mean = np.mean(val_scores)
    val_std = np.std(val_scores)
    
    print('Local RMSLE: {:.5f} (±{:.5f})'.format(val_mean, val_std))
    
    Fold 1 RMSLE: 0.48936
    Fold 2 RMSLE: 0.49091
    Fold 3 RMSLE: 0.48654
    Fold 4 RMSLE: 0.48831
    Fold 5 RMSLE: 0.48788
    Fold 6 RMSLE: 0.48706
    Local RMSLE: 0.48834 (±0.00146)
    

    修改参数

    model = lgbm.LGBMRegressor(
        objective='regression', #目标函数,回归任务
        max_depth=5, #最大深度
        num_leaves=25, #叶子节点个数
        learning_rate=0.007, #学习率
        n_estimators=1000, # 最佳迭代轮数
        min_child_samples=80,
        colsample_bytree=1,
        random_state=np.random.randint(10e6)
    )
    

    交叉验证


    【机器学习】Cross-Validation(交叉验证)详解.

    在机器学习里,通常来说我们不能将全部用于数据训练模型,否则我们将没有数据集对该模型进行验证,从而评估我们的模型的预测效果。为了解决这一问题,有如下常用的方法:

    1、K-fold Cross Validation

    一种折中的办法叫做K折交叉验证,和LOOCV的不同在于,我们每次的测试集将不再只包含一个数据,而是多个,具体数目将根据K的选取决定。比如,如果K=5,那么我们利用五折交叉验证的步骤就是:

    1.将所有数据集分成5份

    2.不重复地每次取其中一份做测试集,用其他四份做训练集训练模型,之后计算该模型在测试集上的MSE_i

    3.将5次的MSE_i取平均得到最后的MSE

    image
    不难理解,其实LOOCV是一种特殊的K-fold Cross Validation(K=N)
    2 、实践

    K折交叉验证:sklearn.model_selection.KFold(n_splits=3, shuffle=False, random_state=None)

    思路:将训练/测试数据集划分n_splits个互斥子集,每次用其中一个子集当作验证集,剩下的n_splits-1个作为训练集,进行n_splits次训练和测试,得到n_splits个结果

    注意点:对于不能均等份的数据集,其前n_samples % n_splits子集拥有n_samples // n_splits + 1个样本,其余子集都只有n_samples // n_splits样本

    参数说明:

    n_splits:表示划分几等份

    shuffle:在每次划分时,是否进行洗牌

    ①若为Falses时,其效果等同于random_state等于整数,每次划分的结果相同

    ②若为True时,每次划分的结果都不一样,表示经过洗牌,随机取样的

    random_state:随机种子数

    相关文章

      网友评论

        本文标题:饭店流量预测

        本文链接:https://www.haomeiwen.com/subject/vmbreqtx.html