机器学习中,常见问题包括分类问题、二分类问题和回归问题。而本题则是回归问题(即拟合数据并预测未知连续数值)。由于该问题涉及多个输入特征和维度,神经网络模型是一个不错的选择。
在数据挖掘与机器学习的竞赛中,通常我们先写一个baseline来作出初始的模型。
baseline一般包含以下几个部分:数据导入,数据预处理,模型选择,模型评估与训练,预测与提交,迭代与改进。
一、数据导入
首先导入所以需要的相关库,如pandas,numpy,torch,matplotlib等。(torch下载时注意版本兼容性,系统默认下载的好像是最新版的,但它不一定匹配你的python,cuda版本)
并打开所提供的测试集、训练集。(若所打开的文件不整齐,可能是分隔符不对,在代码中添加sep=' '让数据更整齐,若在excel中观察:发现所有数据都挤在一个单元格里,可以点击数据工具中的分列,重新制定分隔符)这里为了方便统一进行预处理,将两个数据集合并了。
二、数据预处理
1.数据清洗
打开数据表,观察数据是否有缺失值、异常值、重复数据等。
观察发现数据与题目,(1)存在列有缺失值。(有的缺失值是'-'有的是NaN所以后面还有替换)
(2)题目要求power在[0,600]。
(3)notRepaired列为字符串类型。为了后续更好处理,我们作出以下措施:
执行后,'-'的缺失值被替换,但仍然存在其他形式的缺失值,如nan,所以,我们使用fillna()函数,将离散变量的空值替换为-1,连续变量的空值替换为0。(为什么区分离散数据和连续数据呢?因为不同数据类型会影响模型的选择与预测)
2.特征转化
将特征转换为更适合模型训练的形式。这包括数据的无量纲化(如标准化和归一化)、二值化、多项式特征生成、独热编码等,这里我们进行了独热编码和归一化处理。
独热编码(One-Hot Encoding)是一种处理分类数据(离散数据)的方法,它将每个类别的值转换为一个新的二进制列。在独热编码中,每个类别都被表示为一个只有在该类别出现时才为1,其余情况都为0的向量。这种方法允许算法将类别数据当作数值数据来处理,同时保留了类别之间的独立性。
3.数据划分
(1)重新划分测试集和训练集
由于前面合并了数据集,所以在这里又重新划分开了测试集和训练集。
同时又进行了一些小操作:随机打乱数据:确保模型从数据中真的提取到了特征,提高模型泛化性,而非仅仅记住了某些顺序。
(2)分离特征值
在训练集中,将price列单独分离
(3)划分验证集
在分离出的特征列中再次划分出验证集,用于评估和调整模型参数。
三、建立神经网络
-
定义网络结构:选择合适的网络架构,包括层数、每层的节点数、激活函数等。
(Relu:f(x)=max(0,x))
-
初始化网络参数:随机初始化网络中的权重和偏置。
-
定义损失函数:选择一个损失函数来评估模型的预测性能。回归问题常用损失函数有MSE(均方误差),MAE(平均绝对误差),MSLE(均方对数误差)。
-
选择优化器:选择一个优化算法来调整网络参数,以最小化损失函数。广泛使用的是Adam和SGD。
-
训练网络:使用训练数据迭代地训练网络,通过前向传播计算损失,然后通过反向传播更新权重。(这个没懂,不说了,大概是采用了梯度下降的方式?梯度下降思想:对于极值点而言,x=x-dy/dx,设定参数lr为‘学习率’或者‘步长’,得到:x=x-lr*dy/dx)
-
验证和测试:使用验证集和测试集评估模型的性能。利用之前导入的matplotlib可以把模拟图像化,观察模型拟合情况。
最后price就是预测的价格了
(ps:本篇只是笔记,以题目为例介绍数据分析的简单流程及一些问题,之前没学过,很多地方都没详细说,还有点一段一段的。写错了请多多包容!)