PySpark机器学习调参方法

本文详细介绍了PySpark中用于机器学习模型调参的CrossValidator和TrainValidationSplit方法,包括它们的工作原理和代码实例。通过交叉验证和训练验证分割,寻找最优超参数以提升模型性能,降低预测误差。文中还对比了两者的计算成本,强调了在大数据集上使用CrossValidator的优越性以及在数据量较小的情况下TrainValidationSplit的适用性。

本文为销量预测第8篇:机器学习调参方法
1篇:PySpark与DataFrame简介
2篇:PySpark时间序列数据统计描述,分布特性与内部特性
3篇:缺失值填充与异常值处理
4篇:时间序列特征工程
5篇:特征选择
6篇:简单预测模型
7篇:线性回归与广义线性模型
9篇:销量预测建模中常用的损失函数与模型评估指标

由于机器学习算法的性能高度依赖于超参数的选择,对机器学习超参数进行调优是一项繁琐但至关重要的任务,机器学习常见的超参数调整分为四种类型:

  1. 手动调参,很多情况下,依靠试错法手动对超参数进行调参优化,或者直接依据经验来指定;
  2. 网格搜索(Grid Search),针对超参数组合列表中的每一个组合,实例化给定的模型,做cv次交叉验证,将平均得分最高的超参数组合作为最佳的选择,返回模型最佳超参数组合;
  3. 随机搜索(RandomSearch),随机搜索并非尝试所有组合的参数值,而是从指定的分布中采样固定数量的参数设置,通过对搜索范围的随机取样选取超参数组合。
  4. 贝叶斯优化(bayesian optimization),给定优化的目标函数(代理函数,只需指定输入和输出,无需知道内部结构以及数学性质),通过不断地添加样本点来更新目标函数的后验分布(高斯过程),直到后验分布基本贴合于真实分布。
    简单的说,就是考虑了上一次参数的信息,从而更好的调整当前的参数。从而更有效的优化参数空间和运算时间。

在spark.ml中内置的超参数策略为网格搜索,具体地,分为cv交叉验证和训练集-验证集验证
下面具体展开二者的介绍,并给出代码。

1 .CrossValidator与TrainValidationSplit

spark.ml支持交叉验证(CrossValidator)和训练验证分割(TrainValidationSplit)两种模型超参数选择方法
 

1 交叉验证(CrossValidator)

交叉验证(CrossValidator)将数据集切分成k折数据集,分别用于训练和测试。例如,k=5时,CrossValidator会生成5份训练集和测试集,每一个数据对的训练数据占4/5,测试数据占1/5。为了评估一个ParamMap,CrossValidator 会计算5个不同的训练集测试集,通过Estimator拟合出模型的平均评估指标。在所有候选的参数组合中,通过循环遍历,尝试每一种可能性,表现平均最好的模型参数作为最终结果。通过k-fold交叉验证找到最佳的参数组合,以此在训练集上可以训练(fit)得到一个泛化能力强,误差相对小的的模型。
 

2 训练验证分割(TrainValidationSplit)

交叉验证的代价比较高昂,比如在线性回归中,regParam设置为4个,fitIntercept设置2个,elasticNetParam设置4个,最终将有(4 * 2 * 4) = 32个不同的模型待训练。为此Spark也为超参数调优提供了训练-验证切分TrainValidationSplit的方法。TrainValidationSplit按照trainRatio比例随机的把数据切分为训练集和测试集。使用指定的评估指标对验证集进行评估,得到最佳模型超参数。例如,当设置trainRatio=0.8时,TrainValidationSplit将会将数据切分80%作为数据集,20%作为验证集,并最终使用最好的ParamMap和完整的数据集来拟合评估器。相对于CrossValidator对每一个参数进行k次评估,TrainValidationSplit只对每个参数组合评估1次。因此计算代价没有这么高,但当训练数据集不够大的时候其得到的超参数结果用于预测相对不可信。

 

2.代码实例

下面通过一下几步展示交叉验证寻找最优参数的过程:

1.随机划分训练集测试集,求得使用最佳参数之前的评估指标,如mae

2.使用CrossValidator求得最优参数

  • 构建Estimator,如LinearRegression
  • 设置评估指标RegressionEvaluator
  • 在k-fold上拟合模型,得到模型的平均评估指标
  • 保存在评估指标上表现最好(如,mae最小)的参数key-value对

3.使用调参后的最优参数再次验证模型表现

 

import datetime
import pandas as pd
from pyspark.sql import SparkSession
from pyspark.ml.feature import Normalizer
from pyspark.ml.tuning import ParamGridBuilder,CrossValidator, TrainValidationSplit
from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml.regression import LinearRegression
from pyspark.ml.feature import VectorAssembler
from pyspark.sql.functions import *
from pyspark.sql.types import *
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
warnings.filterwarnings('ignore')
spark = SparkSession. \
    Builder(). \
    config("spark.sql.crossJoin.enabled", "true"). \
    config("spark.sql.execution.arrow.enabled", "false"). \
    enableHiveSupport(). \
    getOrCreate()


def read_importance_feature():
    """
    :return: list of importance of feature
    """
    importance_feature = spark.sql("""select feature from app.selection_result where cum_sum<0.99 order by update_date desc,update_time desc limit 1""").select("feature").collect()
    importance_list = [row.feature for row in importance_feature]
    print('..use' + str(len(importance_list)) + 'numbers of feature...')
    return importance_list


class best_param(
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值