B题论文共90页,一些修改说明7页,正文72页,附录11页。

这次泰迪杯我做得有点晚了,一方面是之前有点事耽搁了两天,所以我是从6天前才开始做。另一方面泰迪杯不愧是时间这么长的比赛,数据量极大,第一问方便你们挑选,题目给出的8个角度我全都分析了,重点是后面需要自己标注数据的四个角度例如节假日等,需要谨慎查询并标注,这四个数据预处理花了我不少时间。不过求解也就是麻烦点,做起来其实也就是相关性+差异性分析+分类统计绘图挑着用。
重点是第二问,机器学习预测是肯定的,但是预测精度我调参了很久都比较低,后来只能结合神经网络自动寻优,但是这题数据量太大,月周日三个模型各跑了一天一共三天,最后精度确实都可以,最高的模型精度是80%以上,对于这个题目数据来说是非常高了,最后直接应用就完事了。
之所以篇幅这么长,是因为:
第一问8个角度都分析了。此外我论文很多的篇幅需要用来解释我为什么要这么做,基本就是手把手教你怎么做,并且我还要照顾每个人的水平,所有会有些地方需要写得很繁琐,一些中间过程展现得事无巨细,并且表格很多,你们自己放到附录即可。

在这里,我给大家讲一下具体是怎么做吧,精力有限可能讲得不够详细,如果看着觉得累,可以看的视频讲解:

2023泰迪杯数据挖掘赛B题保姆级教学(预告:华中杯、东北三省、五一数学建模)_哔哩哔哩_bilibili

OK,这里是我的目录:

目录

第一问:

第一类:定量数据之间影响

价格因素

第二类:定类数据之间影响

所在区域

节假日

促销

季节因素:

第三类:特性分析


摘要:

第一问:

请对附件中的训练数据(order_train1.csv)进行深入地分析,可参照但不限于下述主题。

对于这一问而言,我把8个主题全部分析了.

(1) 产品的不同价格对需求量的影响;
(2) 产品所在区域对需求量的影响,以及不同区域的产品需求量有何特性;
(3) 不同销售方式(线上和线下)的产品需求量的特性;
(4) 不同品类之间的产品需求量有何不同点和共同点;
(5) 不同时间段(例如月头、月中、月末等)产品需求量有何特性;
(6) 节假日对产品需求量的影响;
(7) 促销(如618、双十一等)对产品需求量的影响;
(8) 季节因素对产品需求量的影响。

首先我要说一下,影响和特性的求解方式是不一样的。

影响是看到底有没有影响,影响的程度到底有多大,主要是相关性分析+差异性分析。

而特性,则本质上只需要分类统计汇总分析。

具体可以分为以下三类。

第一类:定量数据之间影响

价格因素

1.产品的不同价格对需求量的影响;

两个定量数据之间的影响分析:

那就直接相关性分析:

之后做分位数回归,看一下究竟价格是怎么影响需求量的,在哪个点影响最大以及这种影响是怎么随着价格的变化而变化的:

第二类:定类数据之间影响

(2) 产品所在区域对需求量的影响,以及不同区域的产品需求量有何特性;
(6) 节假日对产品需求量的影响;
(7) 促销(如618、双十一等)对产品需求量的影响;
(8) 季节因素对产品需求量的影响。

有这样一张总表:

这道题的需求量数据很明显并不是正态分布的:

所在区域

对于所在区域,一共是五个独立变量,因此,要做多独立样本非参数检验:

确定完差异程度之后,也就是有没有影响以及影响大小之后,做特性统计:

对于其余的,则首先要标注数据,但标注的时候大家一定要谨慎,例如节假日是不包括周六周日的,这个大家一定要清楚!:

节假日

同时,大家要分清楚农历和阳历,对于除夕、端午节这些节日,都是按照农历计算的,我们要查询到每一年这些节日对应的公历日期才可以:

比如中秋节:

全部标注完之后,开始做差异性分析,只有是否,所以这里就是双独立样本检验了:

之后是促销因素,

促销

促销我选用了618 双十一和双十二:

方法一样我就不赘述了。

季节因素:

大家也要注意,小学常识:季节不是1-3月就是春天,那是农历,对于公历来说:

标注之后,采用和所在区域一样的多独立样本检验即可。

第三类:特性分析

对于特性分析来说,只需要做统计分析即可:

OK,第一问结束。

第二问:

基于上述分析,建立数学模型,对附件预测数据(predict_sku1.csv)中给出的产品,预测未来3月(即2019年1月、2月、3月)的月需求量,将预测结果按照表3的格式保存为文件result1.xlsx,与论文一起提交。请分别按天、周、月的时间粒度进行预测,试分析不同的预测粒度对预测精度会产生什么样的影响。

第二问花了我整整三天的时间。

这道题肯定是不可以用时间序列的,又不是一个产品,需求量当然不是只跟时间有关。

因为这很明显是一个多输入的非线性回归问题,也就是说,有多个因素影响需求量,每个因素都可以作为自变量,需求量是因变量。题目也说了:

机器学习训练是肯定的,但是这个数据量实在太大了,59w多条,训练起来很麻烦。

而且手动调参精度我一直提升不上去,最后只能是结合神经网络自动寻优。

按照题目要求,我们是需要训练出月、周、日三个模型的,跑这三个模型花了我整整三天时间。

贴一些我用到的代码吧:

function  [tree,discrete_dim] = train_C4_5(S, inc_node, Nu, discrete_dim)  
      
    % Classify using Quinlan's C4.5 algorithm  
    % Inputs:  
    %   training_patterns   - Train patterns 训练样本  每一列代表一个样本 每一行代表一个特征
    %   training_targets    - Train targets  1×训练样本个数 每个训练样本对应的判别值
    %   test_patterns       - Test  patterns 测试样本,每一列代表一个样本  
    %   inc_node            - Percentage of incorrectly assigned samples at a node  一个节点上未正确分配的样本的百分比
    %   inc_node为防止过拟合,表示样本数小于一定阈值结束递归,可设置为5-10
    %   注意inc_node设置太大的话会导致分类准确率下降,太小的话可能会导致过拟合  
    %  Nu is to determine whether the variable is discrete or continuous (the value is always set to 10)  
    %  Nu用于确定变量是离散还是连续(该值始终设置为10)
    %  这里用10作为一个阈值,如果某个特征的无重复的特征值的数目比这个阈值还小,就认为这个特征是离散的
    % Outputs  
    %   test_targets        - Predicted targets 1×测试样本个数 得到每个测试样本对应的判别值
    %   也就是输出所有测试样本最终的判别情况
      
    %NOTE: In this implementation it is assumed that a pattern vector with fewer than 10 unique values (the parameter Nu)  
    %is discrete, and will be treated as such. Other vectors will be treated as continuous  
    % 在该实现中,假设具有少于10个无重复值的特征向量(参数Nu)是离散的。 其他向量将被视为连续的
    train_patterns = S(:,1:end-1)';      
    train_targets = S(:,end)';   
    [Ni, M]     = size(train_patterns); %M是训练样本数,Ni是训练样本维数,即是特征数目
    inc_node    = inc_node*M/100;  % 5*训练样本数目/100
    if isempty(discrete_dim)  
        %Find which of the input patterns are discrete, and discretisize the corresponding dimension on the test patterns  
        %查找哪些输入模式(特征)是离散的,并离散测试模式上的相应维
        discrete_dim = zeros(1,Ni); %用于记录每一个特征是否是离散特征,初始化都记为0,代表都是连续特征,
        %如果后面更改,则意味着是离散特征,这个值会更改为这个离散特征的无重复特征值的数目 
        for i = 1:Ni  %遍历每个特征
            Ub = unique(train_patterns(i,:));  %取每个特征的不重复的特征值构成的向量 
            Nb = length(Ub);    %得到无重复的特征值的数目
            if (Nb <= Nu)  %如果这个特征的无重复的特征值的数目比这个阈值还小,就认为这个特征是离散的  
                %This is a discrete pattern  
                discrete_dim(i) = Nb; %得到训练样本中,这个特征的无重复的特征值的数目 存放在discrete_dim(i)中,i表示第i个特征
    %             dist            = abs(ones(Nb ,1)*test_patterns(i,:) - Ub'*ones(1, size(test_patterns,2))); 
    %             %前面是把测试样本中,这个特征的那一行复制成Nb行,Nb是训练样本的这个特征中,无重复的特征值的数目
    %             %后面是把这几个无重复的特征值构成的向量复制成测试样本个数列
    %             %求这两个矩阵相应位置差的绝对值
    %             [m, in]         = min(dist);  %找到每一列绝对差的最小值,构成m(1×样本数目)   并找到每一列绝对差最小值所在行的位置,构成in(1×样本数目)
    %             %其实,这个in的中每个值就是代表了每个测试样本的特征值等于无重复的特征值中的哪一个或者更接近于哪一个
    %             %如=3,就是指这个特征值等于无重复的特征值向量中的第3个或者更接近于无重复的特征值向量中的第3个
    %             test_patterns(i,:)  = Ub(in);  %得到这个离散特征
            end  
        end  
    end
        

给大家看一下精度最低的那个模型吧:

70多是最低的,最高的是哪个模型为了保证限量我就不说了,精度是80%多。

看一下最后的预测表格:

整理成题目要求的格式:

是这样的:

教大家一个判断自己结果到底对不对的方法,同一个产品,三个月的需求量虽然会有变化,但是绝对不会相差太多,如果相差非常大,那么模型肯定是存在问题的。

大家可以看一下上面的预测结果相差的程度,基本是合理的。

当然了,真正的精度是从训练集测试集表现来的,这个我在论文里会有精度的表格。

一共2619个,全部预测完毕:

OK,那么就讲到这里吧,实在太累了,讲解得可能不够详细,详细的讲解在我的讲解视频里,讲解视频及完整成品的说明大家可以点击下方我的个人卡片查看:

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐