Azure MMLSpark 实战:使用DataConversion进行航班延误数据清洗与回归分析
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正则化
模型评估
模型训练完成后,我们需要评估其性能:
- 首先在测试集上进行预测:
scoredData = model.transform(testCat)
- 计算整体模型指标:
from synapse.ml.train import ComputeModelStatistics
metrics = ComputeModelStatistics().transform(scoredData)
metrics.toPandas()
- 查看单个预测的误差统计:
from synapse.ml.train import ComputePerInstanceStatistics
evalPerInstance = ComputePerInstanceStatistics().transform(scoredData)
evalPerInstance.select("ArrDelay", "prediction", "L1_loss", "L2_loss").limit(10).toPandas()
技术要点总结
-
DataConversion优势:
- 简化数据类型转换流程
- 支持批量处理多个列
- 提供丰富的转换类型选项
- 分类变量处理更高效
-
建模最佳实践:
- 始终进行数据探索和清洗
- 合理划分训练/测试集
- 根据特征性质选择适当处理方法
- 使用多种指标全面评估模型
-
性能考虑:
- 对于大规模数据,批处理操作更高效
- 分类变量转换可以显著减少内存使用
- 合理设置正则化参数平衡偏差和方差
通过这个案例,我们展示了如何使用MMLSpark高效地完成数据清洗、特征工程和回归建模的全流程。DataConversion模块的强大功能使得数据预处理工作变得更加简单和高效,让数据科学家能够更专注于模型本身的优化和业务问题的解决。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考