2023美赛春季赛Y题数据思路代码 Understanding Used Sailboat Prices数学建模加赛

首发!目前Y题思路已全部给出,代码已完成第一问

我们先来看Y题。这题的核心是求影响帆船价格的各种因素。
先来看第一问。首先我们要明确,这种数据分析类的题目,无非就是分类、回归、聚类、异常检测这几种,这题很明显属于回归。接下来我们就要确定回归模型的输入和输出,输入就是我们说的自变量,输出就是因变量。
我们来观察一下附件,注意附件有两个子表,对应两种类型的帆船,也就是说我们要建立至少两个模型。为什么说是至少两个,因为你也可以针对每个地区各建一个模型。当然这些模型的原理都是一样的。像品牌、型号、长度、年份、地区这些特征,就属于模型输入,价格就是模型输出。要是你觉得附件提供的特征不够,题干也说了,可以自己去找其他的特征。
接下来说说建模具体需要做哪些工作。我们已经确定了这一问是一个回归问题,回归问题的基本步骤是很明确的:
编码->降维->回归
无非就是这三步。可能有同学问怎么没说数据清理,这里我们不分那么细,像归一化、数据清理这些所谓的预处理过程,都算在编码里面,这些是你在编码的时候要考虑的事情。
编码具体怎么做呢?也很简单,对品牌型号这种离散特征我们就用one-hot编码,对长度、年份这些连续特征我们做个归一化就行。像地区这样的特征,既可以当作离散特征做one-hot编码,也可以将其转化为经纬度,转化为经纬度就相当于是连续特征,这题必须用多个连续特征来表示地区,不然后面第三问没法做。
下一步就是降维,这里没啥好说的,直接主成分分析。
最后是做回归。常见的回归模型,无非就是多项式模型和树模型,这里建议用多项式模型,因为树模型相当于一个黑盒,你没法知道每项特征的具体权重。第一问的题干要求我们explains the listing price,你用树模型就没法explain了。
下面看第二问。第二问分为两部分,首先是讨论地区是否对价格有影响,这一问直接用第一问的结果就行,我们根据地区这一特征的权重就知道是够对价格有影响,以及有怎样的影响。
接下来要讨论对于不同型号的帆船,地区的的影响是否相同。这里我们针对不同型号的帆船分别建回归模型,再观察在这些回归模型中,地区的权重是否相同。
当然,这里帆船型号太多了,我们不用对每种型号进行建模,只要对样本多的几种帆船建模就行。
再说下第三问。第三问首先要找数据,因为题目是没给香港地区的价格数据的,我们要自己找。找到价格后套用第一问得到的回归模型,地区特征带入香港,来看看用回归模型预测的价格与实际的价格是否一致,一致就说明我们给出用来表达地区的特征是useful的。
第三问后半段问的是香港对双体船和单体船价格的区域效应是否一致,这题本质上问的是地区对双体船和单体船价格的影响是否一致。我们观察针对双体船和单体船的回归模型中地区特征的权重是否相同就可以。
四五两问是开放性问题,我们针对一些特征的权重做些说明就可以了。
附要找的特征:
一、不同型号(Variant)帆船的特征,能找多少算多少:
Beam: The width of a boat at its widest point.
船宽:船最宽处的宽度。
Displacement: The weight of the volume of water displaced by a boat.
排水量:一艘船排出的水的重量。
Draft: The minimum depth of water required to float a boat without touching the bottom.
吃水深度:使船漂浮而不触底所需的最小水深。
Engine Hours: The number of hours the boat’s engine(s) have run since new.
发动机小时数:新船发动机运行的小时数。
Headroom: The height available to stand up in the cabin.
净空高度:机舱内可站立的高度。
Hull: The main body or shell of a ship or other vessel, including the bottom, sides, and deck.
船体:船或其它船只的主体或外壳,包括底部、侧面和甲板。
Hull Materials: The materials of which a boat’s hull is made. Materials used include fiberglass, steel, wood, and composites.
船体材料:制造船体的材料。使用的材料包括玻璃纤维、钢、木材和复合材料。
Sail Area: The total surface area of the sails of a boat when fully raised.
帆面积:船帆完全升起时的总表面积。
二、地区特征:
经纬度、GDP、人口量、人均收入等
三、香港不同型号帆船的价格

Y题模型代码如下:

-- coding: utf-8 --

TODO: Y题核心代码

import numpy as np
import warnings
warnings.filterwarnings(‘ignore’)

One-hot编码

def one_hot(n, k):
“”"
one_hot编码
:param n: 编码位数
:param k: 被编码的数字
:return: 编码结果
“”"
code = [0] * n
if k == 0:
return code
else:
code[k - 1] = 1
return code

PCA降维

from sklearn import decomposition

def get_pca_model(n_components, x_data):
“”"
主成分分析
:param n_components: 主成分数量
:param x_data: 输入数据(list)
:return: 归一化权重、权重和、特征系数
“”"
X = np.array(x_data)
pca = decomposition.PCA(n_components)
pca.fit(X) # 训练模型
w = pca.explained_variance_ratio_ # 获取权重
coe = np.array(pca.components_[0]).reshape(-1, 1) # 获取各特征系数
return w, sum(w), coe

def pca_transform(x_data, coe):
“”"
根据主成分分析的系数求降维后的输入
:param x_data: 输入数据(list)
:param coe: get_pca_model函数得到的pca系数
:return: 变换后的输入
“”"
return np.dot(x_data, coe)

多项式回归

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

def get_lr_rg_model(x_data, y_data, degree=1):
“”"
训练多项式回归模型
:param x_data: 输入数据(list)
:param y_data: 输入标签(list)
:param degree: 用几次函数拟合
:return: 多项式变换模型、回归模型
“”"
X = np.array(x_data)
y = np.array(y_data)
pf = PolynomialFeatures(degree=degree) # 多项式变换模型
lr = LinearRegression() # 回归模型
X_ = pf.fit_transform(X)
lr.fit(X_, y)
return pf, lr

def lr_rg_predict(x_data, pf, lr):
“”"
利用多项式回归模型进行预测
:param x_data: 输入数据(list)
:param pf: 多项式变换模型
:param lr: 回归模型
:return: 预测结果
“”"
return lr.predict(pf.fit_transform(x_data))

https://www.jdmm.cc/file/2708938/

你可能感兴趣的:(机器学习,人工智能,算法,数学建模)