基于PySpark 使用线性回归、随机森林以及模型融合实现天气预测

基于PySpark 实现天气预测与模型集成

在大数据分析与机器学习领域,Spark 提供了强大的计算能力和灵活的扩展性。本文将介绍如何利用 PySpark 完成以下任务:

1、数据预处理:清洗和编码天气数据。
2、特征工程:合并数值和分类特征。
3、模型训练与评估:构建线性回归和随机森林模型。
4、模型集成:通过投票机制提升预测准确性。
以下是完整的代码和每一步的实现细节。

一、数据预处理

  1. 读取与清洗数据
    我们使用 weatherAUS.csv 数据集,其中包含与澳大利亚各地天气相关的特征,例如温度、降雨量、湿度等。预处理包括:

将缺失值替换为 None。
删除含有缺失值的行。

def get_prepared_data():
    # 创建Spark会话
    spark = SparkSession.builder \
        .appName("WeatherPrediction") \
        .master("local[*]") \
        .getOrCreate()

    # 读取CSV数据
    df = spark.read.csv("weatherAUS.csv", header=True, inferSchema=True)
    df = df.select([when(col(c) == 'NA', None).otherwise(col(c)).alias(c) for c in df.columns])
    df = df.dropna()

    # 打印数据摘要
    numeric_cols = [...]  # 数值列列表
    df.describe(numeric_cols).show()

    return df

在这里插入图片描述

  1. 编码分类变量
    分类特征通过 StringIndexer 和 OneHotEncoder 转换为数值表示,用于后续机器学习模型的训练。

使用 StringIndexer 进行编码

categorical_cols = ['Location', 'WindGustDir', 'WindDir9am', 'WindDir3pm', 'RainToday']
indexers = [StringIndexer(inputCol=col_name, outputCol=col_name + "_index") for col_name in categorical_cols]

使用 OneHotEncoder 转换为独热编码

encoders = [OneHotEncoder(inputCol=col_name + "_index", outputCol=col_name + "_onehot") for col_name in categorical_cols]

在这里插入图片描述

二、特征工程

所有数值和独热编码特征通过 VectorAssembler 合并为一个特征向量列 features,以供模型使用。

feature_cols = numeric_cols + [col_name + "_onehot" for col_name in categorical_cols]
assembler = VectorAssembler(inputCols=feature_cols, outputCol="features")
df = assembler.transform(df)

在这里插入图片描述

三、模型训练与评估

  1. 线性回归模型
    线性回归用于预测天气,目标是 RainTomorrow 是否下雨(0或1)。我们使用 RegressionEvaluator 计算模型的均方根误差 (RMSE)。
def liner_model_train(df):
    lr = LinearRegression(labelCol="RainTomorrow_index", featuresCol="features")
    train_df, test_df = df.randomSplit([0.8, 0.2], seed=1234)
    lr_model = lr.fit(train_df)
    predictions = lr_model.transform(test_df)
    rmse = RegressionEvaluator(labelCol="RainTomorrow_index", metricName="rmse").evaluate(predictions)
    print(f"线性回归 RMSE: {rmse:.4f}")
    return predictions

在这里插入图片描述

  1. 随机森林模型
    随机森林是一种强大的分类模型,可处理复杂的非线性关系。我们使用 BinaryClassificationEvaluator 评估其准确率。
def random_forest_train(df):
    rf = RandomForestClassifier(labelCol="RainTomorrow_index", featuresCol="features", numTrees=100)
    train_df, test_df = df.randomSplit([0.8, 0.2], seed=1234)
    model = rf.fit(train_df)
    predictions = model.transform(test_df)
    accuracy = BinaryClassificationEvaluator(labelCol="RainTomorrow_index").evaluate(predictions)
    print(f"随机森林 准确率: {accuracy:.4f}")
    return predictions

在这里插入图片描述

四、模型集成与投票

通过结合线性回归和随机森林的预测结果,我们使用投票机制提升模型的总体表现。

def model_voting(df):
    rf_predictions = random_forest_train(df)
    lr_predictions = liner_model_train(df)

    # 投票机制
    df_predictions = lr_predictions.alias("lr").join(rf_predictions.alias("rf"), on="id", how="inner") \
        .withColumn("final_prediction",
                    when((col("lr_prediction") >= 0.5) & (col("rf_prediction") == 1), 1)
                    .when((col("lr_prediction") < 0.5) & (col("rf_prediction") == 0), 0)
                    .otherwise(col("rf_prediction")))

    # 计算准确率
    correct_predictions = df_predictions.filter(col("final_prediction") == col("RainTomorrow_index")).count()
    total_predictions = df_predictions.count()
    accuracy = correct_predictions / total_predictions
    print(f"模型集成准确率: {accuracy:.4f}")

在这里插入图片描述

五、结果与总结

随机森林模型比线性回归模型表现更好的原因可以归结为以下几点:

1、随机森林能捕捉复杂的非线性关系和特征交互,而线性回归仅限于线性关系。
2、随机森林对噪声和异常值更加鲁棒,线性回归受离群值影响较大。
3、随机森林通过集成多棵决策树,降低了偏差和方差,同时提升了预测的准确性和鲁棒性。

因此,在像气象预测这样具有复杂非线性关系的数据集上,随机森林是更合适的选择。

六、完整代码与实现

完整代码可见本文顶部,可根据需求调整相关参数,并扩展到更复杂的天气预测任务中。通过 Spark 的强大并行计算能力,我们可以快速处理海量数据并训练复杂模型,为生产环境提供支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928495.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL — 数据库基础】深入理解数据库服务与数据库关系、MySQL连接创建、客户端工具及架构解析

目录 1. 数据库服务&#xff06;数据库&#xff06;表之间的关系 1.1 复习 my.ini 1.2 MYSQL服务基于mysqld启动而启动 1.3 数据库服务的具体含义 1.4 数据库服务&数据库&表之间的关系 2. 客户端工具 2.1 客户端连接MySQL服务器 2.2 客…

各种类型无人机性能及优缺点技术详解

无人机系统种类繁多、用途广泛&#xff0c;且特点鲜明&#xff0c;致使其在尺寸、质量、航程、航时、飞行高度、飞行速度以及任务载荷等多方面都有较大差异。以下是对几种常见类型无人机的性能、优缺点技术的详细解析&#xff1a; 一、固定翼无人机 1.性能&#xff1a; 固定翼…

yolo辅助我们健身锻炼

使用软件辅助健身能够大大提升运动效果并帮助你更轻松地达成健身目标。确保每次锻炼都更加高效且针对性强,精确记录你的训练进度,帮助你更清晰地看到自己的进步,避免无效训练。 借助YOLO11的尖端计算机视觉技术,跟踪和分析锻炼变得异常简单。它可以无缝检测和监控多种锻炼…

Linux修改系统及终端命令行中的用户名

0、前言 最近捣鼓了一下一个很久之前的用过的ubuntu系统&#xff0c;但是之前随意设置了一个用户名&#xff0c;突发奇想地去修改了一下这个ubuntu系统的系统用户名&#xff0c;发现修改起来还是有些麻烦&#xff0c;并没有那种一键修改的选项&#xff0c;所以在这篇博客下面记…

基于智能语音交互的智能呼叫中心工作机制

在智能化和信息化不断进步的现代&#xff0c;智能呼叫中心为客户提供高质量、高效率的服务体验&#xff0c;提升众多品牌用户的满意度和忠诚度。作为实现智能呼叫中心的关键技术之一的智能语音交互技术&#xff0c;它通过集成自然语言处理&#xff08;NLP&#xff09;、语音识别…

Linux条件变量线程池详解

一、条件变量 【互斥量】解决了线程间同步的问题&#xff0c;避免了多线程对同一块临界资源访问产生的冲突&#xff0c;但同一时刻对临界资源的访问&#xff0c;不论是生产者还是消费者&#xff0c;都需要竞争互斥锁&#xff0c;由此也带来了竞争的问题。即生产者和消费者、消费…

「Mac畅玩鸿蒙与硬件38」UI互动应用篇15 - 猜数字增强版

本篇将带你实现一个升级版的数字猜谜游戏。相比基础版&#xff0c;新增了计分和历史记录功能&#xff0c;用户可以在每次猜测后查看自己的得分和猜测历史。此功能展示了状态管理的进阶用法以及如何保存和显示历史数据。 关键词 UI互动应用数字猜谜状态管理历史记录用户交互 一…

【IMF靶场渗透】

文章目录 一、基础信息 二、信息收集 三、flag1 四、flag2 五、flag3 六、flag4 七、flag5 八、flag6 一、基础信息 Kali IP&#xff1a;192.168.20.146 靶机IP&#xff1a;192.168.20.147 二、信息收集 Nmap -sP 192.168.20.0/24 Arp-scan -l nmap -sS -sV -p- -…

【C#】书籍信息的添加、修改、查询、删除

文章目录 一、简介二、程序功能2.1 Book类属性&#xff1a;方法&#xff1a; 2.2 Program 类 三、方法&#xff1a;四、用户界面流程&#xff1a;五、程序代码六、运行效果 一、简介 简单的C#控制台应用程序&#xff0c;用于管理书籍信息。这个程序将允许用户添加、编辑、查看…

【Code First】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

CLIP模型也能处理点云信息

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

配置宝塔php curl 支持http/2 发送苹果apns消息推送

由于宝塔面板默认的php编译的curl未加入http2的支持&#xff0c;如果服务需要使用apns推送等需要http2.0的访问就会失败&#xff0c;所以重新编译php让其支持http2.0 编译方法&#xff1a; 一、安装nghttp2 git clone https://github.com/tatsuhiro-t/nghttp2.git cd nghttp…

单片机学习笔记 12. 定时/计数器_定时

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

pytest自定义命令行参数

实际使用场景&#xff1a;pytest运行用例的时候&#xff0c;启动mitmdump进程试试抓包&#xff0c;pytest命令行启动的时候&#xff0c;传入mitmdump需要的参数&#xff08;1&#xff09;抓包生成的文件地址 &#xff08;2&#xff09;mitm的proxy设置 # 在pytest的固定文件中…

【排序用法】.NET开源 ORM 框架 SqlSugar 系列

&#x1f4a5; .NET开源 ORM 框架 SqlSugar 系列 &#x1f389;&#x1f389;&#x1f389; 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列…

sscanf与sprintf函数

本期介绍&#x1f356; 主要介绍&#xff1a;sscanf()、sprintf()这对输入/输出函数&#xff0c;并详细讲解了这两个函数的应用场景。 概述&#x1f356; 在C语言的输出和输入库中&#xff0c;有三对及其相似的库函数&#xff1a;printf()、scanf()、fprintf()、fscanf()、spri…

HCIE IGP双栈综合实验

实验拓扑 实验需求及解法 本实验模拟ISP网络结构&#xff0c;R1/2组成国家骨干网&#xff0c;R3/4组成省级网络&#xff0c;R5/6/7组成数据中 心网络。 配置所有ipv4地址&#xff0c;请自行测试直连。 R1 sysname R1 interface GigabitEthernet0/0/0ip address 12.1.1.1 255.…

关于NXP开源的MCU_boot的项目心得

MCU的启动流程细查 注意MCU上电第一个函数运行的就是Reset_Handler函数&#xff0c;下图是表示了这个函数做了啥事情&#xff0c;注意加强一下对RAM空间的段的印象&#xff0c;从上到下是栈&#xff0c;堆&#xff0c;.bss段&#xff0c;.data段。 bootloader的难点 固件完…

[October 2019]Twice SQL Injection

有一个登录框和一个注册页面&#xff0c;题目也说这个是二次注入&#xff0c;那么就用二次注入的payload就行 1 union select database()# //爆库 1 union select group_concat(table_name) from information_schema.tables where table_schemactftraining# //爆表 1 union …

更多开源创新 挑战OpenAI-o1的模型出现和AI个体模拟突破

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…