【Kaggle】练习赛《洪水数据集的回归预测》(下)

前言

上篇《洪水数据集的回归预测》(上) 介绍了该数据集非常特殊之处,各特征都非常类似,没有特别之处,各特征之间的相关系数几乎为零。同时,各类模型不敏感,最理想的模型居然是线性回归,决定系数 R 2 R^2 R2,也只有 0.846。对这样的一个问题,我们如何突破呢?

方向一

既然线性模型效果相对于其他模型算是较好的,因此我们选择深度学习的MLP【多层感知器(multilayer Perceptron)】模型进行尝试,核心代码如下,

数据归一化

sc = preprocessing.StandardScaler()
X_scaled=sc.fit_transform(X) 
X_valid_scaled = sc.transform(X_valid)
test_scaled = sc.transform(test)
建模
model = Sequential() 
model.add(Dense(64, kernel_initializer = 'normal', activation = 'relu',
input_shape = (20,))) 
model.add(Dense(64, activation = 'relu'))
model.add(Dense(32, activation = 'relu'))
model.add(Dense(1))

第一个版本,中间层只有 64 一层

编译
model.compile(loss = 'mse', optimizer = RMSprop(learning_rate=0.0005),  metrics =  ['mean_absolute_error']
)

这里选择 RMSprop 做为优化器,我尝试过用 Adam 效果差不多,同样,这里的学习率也可以做适当的调整。

训练
history = model.fit(X_scaled, y,    batch_size=128, epochs = 500, verbose = 1, validation_split = 0.2, callbacks = [EarlyStopping(monitor = 'val_loss', patience = 20)]
)

6988/6988 ━━━━━━━━━━━━━━━━━━━━ 13s 2ms/step - loss: 3.5157e-04 - mean_absolute_error: 0.0147 - val_loss: 3.5295e-04 - val_mean_absolute_error: 0.0146
Epoch 147/500
6988/6988 ━━━━━━━━━━━━━━━━━━━━ 13s 2ms/step - loss: 3.5114e-04 - mean_absolute_error: 0.0147 - val_loss: 3.6086e-04 - val_mean_absolute_error: 0.0145

第一版本,训练数据和验证数据分别 用train_test_split方式来进行训练
采用早停的方式来终止训练,这里共训练了147次,MSE 可以达到0.0145~0.0146之前

LOSS 结果
plt.plot(history.epoch,history.history.get('loss'),label="loss")
plt.xlabel("epoch")
plt.ylabel("MSE")
plt.legend()

在这里插入图片描述

查看验证结果
y_valid_pred = model.predict(X_valid_scaled)
r2_score(y_valid,y_valid_pred)

0.8628182472445698

0.8628,这个结果大大的超过了预期,第一个版本成绩为0.859,因此就选用了这个标题了,现在所展示的是第二个版本,具体详见 完整代码

以下是我当天提交结果

在这里插入图片描述

正当以为找到方案一,调整模型层数和相关参数提升模型效果时,很快发现又出称瓶颈(0.8645),不得不需要找到另外的突破的方式。

方案二

在上篇留了一个坑 ,也在总结 写到"如果直接用上述的数据建模的话, R 2 R^2 R2 的上限不太可能会突破0.85",尽管方案一突破了0.85 ,来到了0.86 这个区别,难道不能上0.87 那个区间吗。因此,我们突破常规思路,必须从数据集入手,有效的进行特征工具(FE),提升这些特征的有效性。

上文提到那些特征没有特色,具体普遍性,而机器学习在寻找特征的基本思想就是找出与别人不一校样的东西,如果一组数据没有波动,也不能称之为特征,因此,需要我们找出不一样的波动的东西,顺着这个思路,我们把以上原有特征的统计量给找出来,看看能发现什么。

选择统计量分析
# 求出相关的统计量,并删除原特征
def cleaning(dataset):features = dataset.columns.tolist()dataset['mean_features'] = 0.1*dataset[features].mean(axis=1)dataset['std_features'] = dataset[features].std(axis=1)dataset['max_features'] = dataset[features].max(axis=1)dataset['min_features'] = dataset[features].min(axis=1)dataset['median_features'] = 0.1*dataset[features].median(axis=1)# just keep the descriptive statisticsdataset = dataset.drop(features, axis=1)return dataset
# 将原始数据和训练数据合并
dataset = pd.concat([original_data, train_data.drop('id', axis=1)], ignore_index=True)
X = dataset
X = X.drop(["FloodProbability"], axis=1)
X = cleaning(X)
y = dataset["FloodProbability"]
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats# Plot scatter plots and regression lines for each feature in separate plots
for i, col in enumerate(X.columns):plt.figure(figsize=(6, 4))  # Create a new figure for each feature# Scatter plot and regression linesns.regplot(x=X[col], y=y, color='darkturquoise', line_kws={'color': 'red'}, scatter_kws={'alpha': 0.5})  # Set alpha for dot transparency# Calculate linear regressionslope, intercept, r_value, p_value, std_err = stats.linregress(X[col], y)# Add title including the regression coefficientsplt.title(f'{col} vs Target\nSlope: {slope:.2f}, Intercept: {intercept:.2f}')# Setting labelsplt.xlabel(col)plt.ylabel('Target')plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们惊奇的发现,这些统计量与目标值【FloodProbability】居有具较强的相关性。
以此为起点,我们以上述统计量为特征,进行建模分析。
以下没有优化的结果如下

模型原始特征 R 2 R^2 R2统计量特征的 R 2 R^2 R2
LinearRegression0.8454600.84561
Lasso-5.51093-5.51093
Ridge0.8454600.84561
ElasticNet-5.51093-5.51093
SVR0.696670.78454
RandomForestRegressor0.653940.86045
XGBRegressor0.809420.869125
LGBMRegressor0.7671980.869094
CatBoostRegressor0.846690.869264
DL-MLP0.8628180.865859

以上表数据均为验证集的结果,未进行提交的成绩。

为了取得更好的成绩,我们将最好的三个模型进行融合。

xgb_pred = xgb.predict(test_t)
lgb_pred = lgb.predict(test_t)
cat_pred = cat.predict(test_t)
sample['FloodProbability'] = (xgb_pred+lgb_pred+cat_pred)/3
sample.to_csv("submit_melt.csv",index=None)

详见 notebook

最终,提交到竞赛中得到 0.86887的成绩,截止发稿,最好成绩为0.86932。
在这里插入图片描述

到这里暂告一段落,要想继续提升我们的成绩,还是有一定的空间,有几个方向供小伙伴参考

  • 上述的三个模型都是采用默认参数的方式,都可以进行 optuna 进行优化,参照我的几篇文章,如《肥胖风险的多类别预测》的 Optuna 进行微调部分。
  • 在融合方式中可以用不同权重进行优化。
  • 模型训练时可以用5折交叉验证来提升模型的泛化能力。

总结

  1. 写这篇文章的初衷,是为了一种思维的突破,改变原先常规的特征基础,选用统计量作为特征,这是我在以往所没有碰到过的,基于这一点,拿来分享给大家。
  2. 这种方法其实是有条件的,并非所有的题目都可以这样,只有当这些特征具有以下特点是,如所有特征具有共同的特性,并其相关性为零,特征量不太少,用一般的树形模型没法提升时。
  3. 每个数据集基于特征都有一个理论上限,如果已接近这个天花板时,就需要改变原先的特征,像本题,是一种完全改变的方式,除此之外,有扩展,PCA等方式。
    以上这些观点是我自己的感受和体会,并非一定正确,如有不想法和建议,欢迎评论。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

64位Office API声明语句第118讲

跟我学VBA,我这里专注VBA, 授人以渔。我98年开始,从源码接触VBA已经20余年了,随着年龄的增长,越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友,都来学习VBA,利用VBA,起码可以提高…

Python进阶:函数

Python进阶 函数的定义和调用 函数定义通常采用def关键词,后面跟着函数名及圆括号内的参数列表。 def function_name (parameters):"""函数文档字符串"""# 函数体...return expression # 可选,用于返回函数结果function_name是函数…

富格林:曝光欺诈陷阱阻挠受骗亏损

富格林悉知,今年以来,国际金融市场动荡,黄金价格则表现强势,黄金投资热潮再起,黄金作为避险工具的价值再度成为世人瞩目的焦点。然而做好黄金投资却不是那么容易的,没有掌握一定的做单技巧,便难…

达梦数据库导入数据问题

进行数据导入的时候遇到了导入数据问题 第一个问题: 该工具不能解析此文件,请使用更高版本的工具 这个是因为版本有点低,需要下载最新的达梦数据库 第二个问题: (1)本地编码:PG_GBK, 导入文…

全国31省对外开放程度、经济发展水平、ZF干预程度指标数据(2000-2022年)

01、数据介绍 自2000年至2022年,中国的对外开放程度不断深化、经济发展水平不断提高、ZF不断探索并调整自身在经济运行中的角色和定位,以更好地适应国内外环境的变化,也取得了举世瞩目的成就。这一期间,中国积极融入全球经济体系…

《1w实盘and大盘基金预测 day30》

今日预测: 3123-3150-3177 探底回升,震荡上涨,收小红小绿 双创指数后期上涨的幅度也是会大于上证的,四月底的时候就提醒建仓。 关注板块:医疗、地产、电力、证券 这周预测 这周上证指数最高看到3200 继续看涨&#…

简单的知识蒸馏

import os os.environ[TF_CPP_MIN_LOG_LEVEL] 2 os.environ["KERAS_BACKEND"] "tensorflow" os.environ[HF_ENDPOINT] https://hf-mirror.com import keras from keras import layers from keras import ops import numpy as np # 随着训练的进行&…

大模型日报2024-05-06

大模型日报 2024-05-06 大模型技术 智谱AI 正研发对标Sora的国产文生视频模型,最快年内发布 摘要: 估值超200亿的国内 A1大模型独角兽公司“智谱 A“正在研发对标OpenAl Sora的高质量文生视频模型,预计最快年内发布。据悉,成立于2019年的智谱…

selenium解放双手--记某电力学校的刷课脚本

免责声明:本文仅做技术交流与学习... 重难点: 1-对目标网站的html框架具有很好的了解,定位元素,精准打击. 2-自动化过程中窗口操作的转换. 前置知识: python--selenium模块的操作使用 前端的html代码 验证码自动化操作 Chrome & Chromedriver : Chrome for Testing ava…

[机器学习-02] 数据可视化神器:Matplotlib和Seaborn工具包实战图形大全

目录 引言 正文 01-Matplotlib包的使用示例 1)Matplotlib导入方式 2)折线图绘制 3)散点图绘制 4)柱状图绘制 5)饼图绘制 6)等高线图绘制 7)箱线图绘制 8)较为复杂…

7zip如何只压缩文件不带上级目录?

在使用7zip进行文件压缩的时候,如果直接选择要压缩的文件进行压缩,得到的压缩包则会多包含一层顶层目录,解压缩之后需要点击两次才能进入到实际目录中,为了解决这个问题,本文根据探索找到了一种解决办法。 如下是一个演…

表空间的概述

目录 表空间的属性 表空间的类型 永久性表空间(PermanentTablespace) 临时表空间(Temp Tablespace ) 撤销表空间(Undo Tablespace) 大文件表空间(BigfileTablespace) 表空间的状态 联机状态(Online) 读写状态(Read Write) 只读状态(Read) 脱机状态(Offline) Oracle从…

Java_从入门到JavaEE_09

一、构造方法/构造器 含义:和new一起是创建对象的功能 特点: 与类名相同的方法没有返回项 注意: 当类中没有写构造方法时,系统会默认添加无参构造(无参数的构造方法)构造方法可以重载的 有参构造好处&…

JavaWeb入门-HTML

一、HTML 1.HTML 网络的骨架 超文本标记语言 ①超文本 图片、音频、视频、普通文本。。。 ②标记语言 语法&#xff1a;通过标签的形式展示 a.双标签 <html>内容</html> b.单标签 <br> 2.HelloWorld ①新建网页文件&#xff08;后…

代码随想录算法训练营第四十三天| 1049. 最后一块石头的重量 II,494. 目标和,474.一和零

题目链接&#xff1a;1049. 最后一块石头的重量 II 思路 把石头分成重量尽量相同的两堆&#xff0c;这样就能保证最后一块石头的重量最小。转换为01背包问题&#xff0c;重量和价值都是stone。 ①dp数组&#xff0c;dp[j]表示容量为j的背包可以装的最大价值为dp[j] ②递推公式…

探索Linux目录结构:深入理解Linux文件系统

探索Linux目录结构&#xff1a;深入理解Linux文件系统 Linux操作系统以其强大的稳定性和灵活性而闻名&#xff0c;其中一个关键特征就是其独特的文件系统结构。深入了解Linux目录结构对于系统管理员和开发人员至关重要。本文将带您深入探索Linux文件系统的目录结构&#xff0c…

透明加密软件选哪个好?选择时一定要注意以下三点

透明加密软件哪个好&#xff1f; 这是许多企事业单位在面临数据防泄漏问题时经常思考的问题。随着信息技术的发展&#xff0c;企业的数据安全变得越来越重要。透明加密技术作为一种有效的数据保护手段&#xff0c;被越来越多的企业所采用。然而&#xff0c;市场上的透明加密软…

delphi获取进程版本信息

结构体声明 typeTFileInfo packed recordCommpanyName: widestring;FileDescription: widestring;FileVersion: widestring;InternalName: widestring;LegalCopyright: widestring;LegalTrademarks: widestring;OriginalFileName: widestring;ProductName: widestring;Produc…

Django高级表单处理与验证实战

title: Django高级表单处理与验证实战 date: 2024/5/6 20:47:15 updated: 2024/5/6 20:47:15 categories: 后端开发 tags: Django表单验证逻辑模板渲染安全措施表单测试重定向管理最佳实践 引言&#xff1a; 在Web应用开发中&#xff0c;表单是用户与应用之间进行交互的重要…