Azure MMLSpark 实战:使用DataConversion进行航班延误数据清洗与回归分析

Azure MMLSpark 实战:使用DataConversion进行航班延误数据清洗与回归分析

SynapseML SynapseML 项目地址: https://gitcode.com/gh_mirrors/mm/mmlspark

概述

在大数据分析和机器学习项目中,数据清洗和预处理是至关重要的环节。Azure MMLSpark项目提供了一个强大的工具集,其中DataConversion模块能够高效地处理数据类型转换和特征工程任务。本文将通过一个航班延误预测的实际案例,详细讲解如何使用MMLSpark的DataConversion功能进行数据清洗,并构建回归模型。

数据准备

首先我们需要加载航班延误数据集。这个数据集包含了2012年9月的航班准点性能数据,存储为Parquet格式。Parquet是一种列式存储格式,特别适合大规模数据分析。

flightDelay = spark.read.parquet(
    "wasbs://publicwasb@mmlspark.blob.core.windows.net/On_Time_Performance_2012_9.parquet"
)

加载数据后,我们可以查看数据的基本信息和模式:

print("记录数: " + str(flightDelay.count()))
print("数据结构: ")
flightDelay.printSchema()
flightDelay.limit(10).toPandas()

数据类型转换

原始数据中,许多数值型字段(如Quarter、Month等)被存储为long类型。为了后续建模需要,我们需要将它们转换为double类型。MMLSpark的DataConversion模块提供了简洁的API来完成这个任务。

DataConversion支持多种数据类型转换:

  • 基本数值类型:boolean, byte, short, integer, long, float, double
  • 字符串类型:string
  • 分类类型:toCategorical
  • 日期类型:date(支持自定义格式)
from synapse.ml.featurize import DataConversion

flightDelay = DataConversion(
    cols=[
        "Quarter",
        "Month",
        "DayofMonth",
        "DayOfWeek",
        "OriginAirportID",
        "DestAirportID",
        "CRSDepTime",
        "CRSArrTime",
    ],
    convertTo="double",
).transform(flightDelay)

转换后,我们可以再次检查数据结构,确认类型转换已经生效。

数据分割

在建模前,我们需要将数据分为训练集和测试集:

train, test = flightDelay.randomSplit([0.75, 0.25])

这种75%/25%的划分比例是常见的做法,确保模型有足够的数据进行训练,同时保留足够的数据进行验证。

分类特征处理

在机器学习中,分类变量(如航空公司代码、出发时间段等)需要特殊处理。传统方法需要使用StringIndexer逐个转换,而DataConversion提供了更简洁的方式:

trainCat = DataConversion(
    cols=["Carrier", "DepTimeBlk", "ArrTimeBlk"], convertTo="toCategorical"
).transform(train)
testCat = DataConversion(
    cols=["Carrier", "DepTimeBlk", "ArrTimeBlk"], convertTo="toCategorical"
).transform(test)

这种批处理方式不仅代码更简洁,而且执行效率更高,特别是在处理大量分类特征时。

回归模型构建

我们选择线性回归模型来预测航班延误时间(ArrDelay)。这里使用了L-BFGS优化算法,并设置了弹性网络参数:

from synapse.ml.train import TrainRegressor
from pyspark.ml.regression import LinearRegression

lr = LinearRegression().setRegParam(0.1).setElasticNetParam(0.3)
model = TrainRegressor(model=lr, labelCol="ArrDelay").fit(trainCat)

参数说明:

  • RegParam(0.1):正则化参数,防止过拟合
  • ElasticNetParam(0.3):弹性网络混合参数,结合了L1和L2正则化

模型评估

模型训练完成后,我们需要评估其性能:

  1. 首先在测试集上进行预测:
scoredData = model.transform(testCat)
  1. 计算整体模型指标:
from synapse.ml.train import ComputeModelStatistics

metrics = ComputeModelStatistics().transform(scoredData)
metrics.toPandas()
  1. 查看单个预测的误差统计:
from synapse.ml.train import ComputePerInstanceStatistics

evalPerInstance = ComputePerInstanceStatistics().transform(scoredData)
evalPerInstance.select("ArrDelay", "prediction", "L1_loss", "L2_loss").limit(10).toPandas()

技术要点总结

  1. DataConversion优势

    • 简化数据类型转换流程
    • 支持批量处理多个列
    • 提供丰富的转换类型选项
    • 分类变量处理更高效
  2. 建模最佳实践

    • 始终进行数据探索和清洗
    • 合理划分训练/测试集
    • 根据特征性质选择适当处理方法
    • 使用多种指标全面评估模型
  3. 性能考虑

    • 对于大规模数据,批处理操作更高效
    • 分类变量转换可以显著减少内存使用
    • 合理设置正则化参数平衡偏差和方差

通过这个案例,我们展示了如何使用MMLSpark高效地完成数据清洗、特征工程和回归建模的全流程。DataConversion模块的强大功能使得数据预处理工作变得更加简单和高效,让数据科学家能够更专注于模型本身的优化和业务问题的解决。

SynapseML SynapseML 项目地址: https://gitcode.com/gh_mirrors/mm/mmlspark

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尤瑾竹Emery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值