CACL联赛第一轮参赛记录

2024-03-25 16:18

本文主要是介绍CACL联赛第一轮参赛记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我是重庆理工大学Icode社团成员,我们参加了CACL第一赛季的比赛,这是本赛季第一轮关于“波士顿房价预测”的比赛实验记录。

这个比赛看似简单,但我们费了不少心血,最终拿到了第六名的成绩,只能寄望于第二轮的比赛拿到更好的排名啦。下面我将分享本次比赛涉及到的知识点(如有不对之处,欢迎指正)。

一、标准化与归一化

归一化
对数据的数值范围进行特定缩放,但不改变其数据分布的一种线性特征变换。

标准化
对数据的分布的进行转换,使其符合某种分布(比如正态分布)的一种非线性特征变换。

mean = train_x.mean(axis=0)
std = train_x.std(axis=0)
train_x = (train_x - mean) / std
test_x = (test_x - mean) / std

对比
在涉及到计算点与点之间的距离时,使用归一化或标准化都会对最后的结果有所提升,甚至会有质的区别。那在归一化与标准化之间应该如何选择呢?根据上一节我们看到,如果把所有维度的变量一视同仁,在最后计算距离中发挥相同的作用应该选择标准化,如果想保留原始数据中由标准差所反映的潜在权重关系应该选择归一化。另外,标准化更适合现代嘈杂大数据场景。

总结
在本人实验中,使用标准化后精度有明显的提高!

激活函数的选择
“激活函数”能分成两类——“饱和激活函数” 和 “非饱和激活函数”
• sigmoid和tanh是“饱和激活函数”
• ReLU及其变体则是“非饱和激活函数”

使用“非饱和激活函数”的优势
首先,“非饱和激活函数”能解决所谓的“梯度消失”问题。
其次,它能加快收敛速度。

Sigmoid函数需要一个实值输入压缩至[0,1]的范围:
σ(x) = 1 / (1 + exp(−x))tanh
函数需要讲一个实值输入压缩至 [-1, 1]的范围:
tanh(x) = 2σ(2x) − 1

ReLU
函数的计算是在卷积之后进行的,因此它与tanh函数和sigmoid函数一样,同属于“非线性激活函数”。

缺点:训练的时候很“脆弱”,很容易die;如果学习率很大,很有可能导致网络中的40%瘫痪。

Elus
ELUs是“指数线性单元”,它试图将激活函数的平均值接近零,从而加快学习的速度。

经本人用于波士顿房价预测上的情况是 elus的精度要略大于relu的

leaky_relu
ReLU是将所有的负值都设为零,相反,Leaky ReLU是给所有负值赋予一个非零斜率。

参数化修正线性单元(PReLU)
PReLU可以看作是Leaky ReLU的一个变体;在PReLU中,负值部分的斜率是根据数据来定的,而非预先定义的。

随机纠正线性单元(RReLU)
“随机纠正线性单元”RReLU也是Leaky ReLU的一个变体。在RReLU中,负值的斜率在训练中是随机的,在之后的测试中就变成了固定的了。RReLU的亮点在于,在训练环节中,aji是从一个均匀的分布U(I,u)中随机抽取的数值。

二、神经网络的结构选择

DNN (全连接的神经网络)

# 模型构建
model = keras.Sequential([layers.Dense(32,  activation=tf.nn.elu, input_shape=(13,)),layers.Dense(32,  activation=tf.nn.elu),layers.Dense(1
])训练100轮
Epoch 100/900
390/390 [==============================] - 0s 96us/sample - loss: 4.1212 - mse: 4.0964 - val_loss: 14.1351 - val_mse: 14.1103
训练200轮
Epoch 200/900
390/390 [==============================] - 0s 92us/sample - loss: 3.0193 - mse: 2.9927 - val_loss: 12.8362 - val_mse: 12.8096
训练400轮
采用全连接神经网络,标准化后的最优值MSE在10左右
# 一次测试结果
MSE:[12.884271948945289, 12.884273]

总结
由于数据集过小,神经节点可能过多,出现过拟合的现象。
使用Dropout

# 模型构建
model = keras.Sequential([#     layers.Dense(32,kernel_regularizer=keras.regularizers.l2(0.001),  activation=tf.nn.relu, input_shape=(13,)),layers.Dense(32,  activation=tf.nn.elu, input_shape=(13,)),# 使用dropoutlayers.Dropout(0.5),layers.Dense(32,  activation=tf.nn.elu),# 使用dropoutlayers.Dropout(0.5),layers.Dense(1)
])
训练200轮
Epoch 200/900
390/390 [==============================] - 0s 49us/sample - loss: 21.8577 - mse: 21.8329 - val_loss: 14.9834 - val_mse: 14.9586
结果并不理想,原因数据集太少,训练次数太少,dropout作用并不是很大
训练400轮
Epoch 400/900
390/390 [==============================] - 0s 43us/sample - loss: 16.0063 - mse: 15.9799 - val_loss: 14.5802 - val_mse: 14.5540
训练600轮
Epoch 600/900
390/390 [==============================] - 0s 46us/sample - loss: 12.7083 - mse: 12.6801 - val_loss: 14.6778 - val_mse: 14.6496
训练800轮
Epoch 900/900
390/390 [==============================] - 0s 54us/sample - loss: 9.2937 - mse: 9.2632 - val_loss: 13.2544 - val_mse: 13.2239总结
结果并不理想,原因数据集太少,训练次数太少,dropout作用并不是很大。
训练400轮
Epoch 400/900390/390 [==============================] - 0s 43us/sample - loss: 16.0063 - mse: 15.9799 - val_loss: 14.5802 - val_mse: 14.5540训练600轮
Epoch 600/900390/390 [==============================] - 0s 46us/sample - loss: 12.7083 - mse: 12.6801 - val_loss: 14.6778 - val_mse: 14.6496训练800轮
Epoch 900/900390/390 [==============================] - 0s 54us/sample - loss: 9.2937 - mse: 9.2632 - val_loss: 13.2544 - val_mse: 13.2239

总结
使用dropout后结果也不理想,由于数据集太少。

三、使用卷积神经网络

# 模型构建
model = keras.Sequential([layers.BatchNormalization(input_shape=(13,)),layers.Reshape((13,1)),layers.Conv1D(filters=13,strides=1,padding='same',kernel_size=2, activation=tf.nn.elu,),layers.Conv1D(filters=26, strides=1, padding='same', kernel_size=2, activation=tf.nn.elu,),layers.MaxPooling1D(pool_size=2,strides=1,padding='same'),layers.Conv1D(filters=52, strides=1, padding='same', kernel_size=2, activation='sigmoid'),layers.Conv1D(filters=104, strides=1, padding='same', kernel_size=2, activation='sigmoid'),layers.MaxPooling1D(pool_size=2, strides=1, padding='same'),layers.Dense(32, activation=tf.nn.elu,),layers.Dense(32, activation=tf.nn.elu),layers.Flatten(),layers.Dropout(0.5),layers.Dense(1)
])
结果
Epoch 900/900
390/390 [==============================] - 0s 207us/sample - loss: 8.5953 - mse: 8.5953 - val_loss: 16.2062 - val_mse: 16.2062
102/102 [==============================] - 0s 2ms/sample - loss: 16.2062 - mse: 16.2062
[16.206212974062154, 16.206213]

总结
使用卷积神经网络时,效果并不理想。主要因为训练集过小,复杂的神经网络结构反而起到了相反的结果。

四、目前最优解决办法

我们还是采用DNN神经网络,通过对数据的预处理进一步优化,和最后通过循环的方式得到目前得到的最优解。

全部代码

import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers
import pandas as pd
import numpy as np
import datetimetrain_data = pd.read_csv("./data/波士顿房价训练集.csv")
test_data = pd.read_csv("./data/波士顿房价测试集.csv")# train_data = train_data[~train_data['MEDV'].isin([50])]train_data = np.array(train_data)
test_data = np.array(test_data)train_x = train_data[:, :13]
# train_y为最后1列标签数据
train_y = train_data[:, 13]
test_x = test_data[:, :13]
ids = test_data[:, 13]test_y = pd.read_csv("./data/result.csv")
test_y = np.array(test_y["MEDV"])boston = np.concatenate((train_x, test_x), axis=0)# n减去平均值/标准差
mean = boston.mean(axis=0)
train_x -= mean
std = boston.std(axis=0)
train_x /= std
test_x -= mean
test_x /= stddef build_model():# 模型构建model = keras.Sequential([layers.Dense(16, activation=tf.nn.elu, input_shape=(13,)),layers.Dense(32, activation=tf.nn.elu),layers.Dense(1)])model.compile(optimizer="rmsprop",# optimizer="adam",# optimizer=tf.keras.optimizers.RMSprop(lr=0.001),loss='mse',# 我们希望在训练的时候可以查看方差metrics=['mae'])# 模型结构model.summary()return model# 加载模型
# model = tf.keras.models.load_model("./model/my_model.h5")# log_dir = "logs\\fit\\" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
# print(log_dir)
# tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)model = build_model()model.fit(train_x, train_y, validation_data=(test_x, test_y), batch_size=10, epochs=1,verbose=1)bestMath = model.evaluate(test_x, test_y)[0]
best_model = modelfor j in range(1):model = build_model()# 模型训练for i in range(200):model.fit(train_x, train_y, validation_data=(test_x, test_y), batch_size=10, epochs=1,# callbacks=[tensorboard_callback],verbose=1)result = model.evaluate(test_x, test_y)print("第", j+1, "轮第", i, "次结果:", result)if (bestMath > result[0]):bestMath = result[0]# 保存模型model.save("./model/my_model.h5")best_model = tf.keras.models.load_model("/home/output/model/my_model.h5")predict = model.predict(test_x)
ids = ids.astype(int)
predict = pd.DataFrame(predict)
ids = pd.DataFrame(ids)predict.columns = ["MEDV"]
ids.columns = ["id"]
predict = pd.concat([predict, ids], axis=1)
predict.to_csv("/home/output/submission.csv", index=False)result = best_model.evaluate(test_x, test_y)
print(result)
print("bestMath:", bestMath)
结果
[7.8548625216764565, 2.1469982]
bestMath: 7.8548625216764565

总结
通过多次实验,我们目前得到的最优解为7.8左右。在处理小数据集出现过拟合时,首先应当考虑减小模型或增加数据集。由于无法使用迁移学习的前提下,实验也证明,当使用DNN神经网络时反而能得到更好的结果,我们在使用常规通过循环的方式得到目前得到的最优解的方法,尽量获得最优的模型。

最后希望能在第二轮能取得好成绩,第六名离我们的目标差得好远。这次比赛学习到很多,每一次经历都是一次成长吧!加油!

第一轮比赛已经结束。代码公布>>>
第二轮比赛正在火热进行中。立即参赛>>>

在这里插入图片描述

这篇关于CACL联赛第一轮参赛记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845550

相关文章

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

Linux常用工具与命令日常记录(长期更新)

Linux常用工具与命令日常记录(长期更新) 目录 1.本地复制到远程2.Linux压缩拆包与解压3.生成随机密码4.ubuntu默认Python版本设置5.计算当前文件夹中文件数量6.windows中编写shell脚本,在Linux运行出错7.history 历史命令显示时间用户8.Ubuntu18.04设置源、网卡9.Ubuntu18.04设置网卡10.Ubuntu:自定义开

Excel和Word日常使用记录:

Excel使用总结 表格颜色填充: 合并单元格: 选中你要合并的单元格区域。按下快捷键 Alt + H,然后松开这些键。再按下 M,接着按 C。这个组合键执行的操作是:Alt + H:打开“主页”选项卡。M:选择“合并单元格”选项。C:执行“合并并居中”操作。 插入行: 在Excel中,插入一行的快捷键是:Windows:选择整行(可以点击行号)。按下 Ctrl + Sh

野火霸天虎V2学习记录

文章目录 嵌入式开发常识汇总1、嵌入式Linux和stm32之间的区别和联系2、stm32程序下载方式3、Keil5安装芯片包4、芯片封装种类5、STM32命名6、数据手册和参考手册7、什么是寄存器、寄存器映射和内存映射8、芯片引脚顺序9、stm32芯片里有什么10、存储器空间的划分11、如何理解寄存器说明12、如何操作寄存器的某一位 STM32F407芯片学习1、stm32单片机启动流程s