> # **Udacity--毕业项目开题报告**
> ### 报告作者:MingJun-Li
# 一、定义
# 1.1项目概览
* ### 历史信息
Rossmann是欧洲的一家连锁药店,在7个欧洲国家拥有3,000家药店。 目前,罗斯曼店经理的任务是提前六周预测其日销量。 商店销售受到诸多因素的影响,包括促销,竞争,学校和国家假日,季节性和地点。 成千上万的个人经理根据其独特的情况预测销售量,结果的准确性可能会有很大的变化。
Rossmann希望你能通过给出的数据来预测德国各地1,115家店铺的6周销量。
在此次项目中,我将模拟自己参加kaggle比赛,用train.csv来建模,之后用test.csv来预测,通过提交到Kaggle来评估模型表现。
* ### 项目意义
可靠的销售预测使商店经理能够创建有效的员工时间表,从而提高生产力和动力,比如更好的调整供应链和合理的促销策略与竞争策略。 通过帮助Rossmann创建一个强大的预测模型,您将帮助仓库管理人员专注于对他们最重要的内容:客户和团队!
* ### 实现可能性
Rossmann给出的数据足够丰富,并且各个特征都和销售有关系。这是一个明显的监督学习的项目,有有标签的数据集。
* ### 引用说明
最后会用到xgboost这个现成的混合模型,不仅运算速度快,而且集成了一系列算法。因为源码涉及大量C语音因此没有太看懂,主要参见了几个大神的博客,了解了xgboost的运行原理以及此模型的参数设置与调整方案。
* ### 主要用到了3个数据集,并有1个数据集作为提交数据集得参考样本:
* train.csv - 历史数据包括sales的数据
* test.csv - 历史数据不包括sales的数据
* store.csv - 提供各个店铺的具体信息的数据
* sample_submission.csv - 一个最后提交数据集的参考样本
以上数据都由kaggle提供,没有引入其他的数据集,因为这个问题比较特定并且已经足够充分了,不像自然语言处理类需要额外的数据
### - 数据集中大多数数据字段是不言自明的,符合我们的常识,以下是不是这些的字段具体描述:
* Id - 表示测试集中(存储,日期)副本的Id
* Store - 每个商店的独特Id
* Sales - 任何一天的营业额(这是你预测的)
* Customers - 某一天的客户数量
* Open - 商店是否打开的指示器:0 =关闭,1 =打开
* StateHoliday - 表示一个国家假期。通常所有商店,除了少数例外,在国营假期关闭。请注意,所有学校在公众假期和周末关闭。 a =公众假期,b =复活节假期,c =圣诞节,0 =无
* SchoolHoliday - 表示(商店,日期)是否受到公立学校关闭的影响
* StoreType - 区分4种不同的商店模式:a,b,c,d
* Assortment - 描述分类级别:a = basic,b = extra,c = extended
* CompetitionDistance - 距离最接近的竞争对手商店的距离
* CompetitionOpenSince[Month/Year] ] - 给出最近的竞争对手开放时间的大约年和月
* Promo - 指示商店是否在当天运行促销
* Promo2 - Promo2是一些持续和连续推广的一些商店:0 =商店不参与,1 =商店正在参与
* Promo2自[年/周] - 描述商店开始参与Promo2的年份和日历周
* PromoInterval - 描述了Promo2的连续间隔开始,命名新的促销活动的月份。例如。 “二月,五月,八月,十一月”是指每一轮在该店的任何一年的二月,五月,八月,十一月份开始
### -数据集的使用方式:
sample只用来参考自己得出的答案是否符合格式和是否存在过大的差距
主要使用train.csv - test.csv - store.csv,前期会分别分析,之后会将store数据与train和test进行合并,用合并后的数据训练模型和验证。
# 1.2问题说明
## 问题描述
总的来说,就是需要根据Rossmann药妆店的信息(比如促销,竞争对手,节假日)以及在过去的销售情况,来预测Rossmann未来的销售额。
下面是具体要完成好此任务需要解决的一些问题
* ### 数据缺省的问题
无论是在train还是test还是store等数据集中大部分特征都不是全都数据完整的需要去合理补上这些特征的值
* ### 数据存在异常值
数据在记录的时候难免有出现记错或者发生特殊情况的时候,因此有些特征的数据并不可靠,噪音很大,会极大的影响整个模型的准确性,因此要去除这些异常值
* ### 数据的分离问题:
train和test数据集都与store产生了分离。而store中的特征又与预测结果息息相关。因此要做好一个完整的训练和测试集,必须用合理的方式把store的数据与train和test的合并起来
* ### 特征的重编码问题:
比如 Categorical Variabl数值化,而类似销售额等特征可以常识用log等等
* ### 对各个特征的理解:
只有理解各个特征的现实意义才能做出更合理的特征工程,而这个理解需要通过一些统计上的知识与实际生活中的常识
* ### 特征选择
通过挑选出最重要的 Feature,可以将它们之间进行各种运算和操作的结果作为新的 Feature,可能带来意外的提高。但是怎么选呢?
* ### 众多模型的选择困难
能运用的模型有很多种,选择哪一个更适合,是选一个还是混合多个模型,如果用混合模型那该用哪几个模型?
* ### 降低 Overfitting 的风险的办法
在提高分数的同时又降低 Overfitting 的风险,这个需要用到不少技巧,尤其是大多数单个模型很难实现test error的持续下降。
* ### 如何进行有效的可视化
可视化对我来说不是太熟练,需要补充大量的知识。
## 问题的解决方案
* ### 数据的缺省:
根据不同的特征的情况,选择继承临近的数据或者取平均值来进行填充,具体方案要case by case。
* ### 数据的缺省:
根据不同的特征的情况,选择继承临近的数据或者取平均值来进行填充,具体方案要case by case。
* ### 数据的分离问题
找到一个用于作为合并数据集标杆的特征,比如店铺id然后将store的数据与train和test的合并起来
* ### 数据存在异常值:
用可视化的方法找出存在异常值的特征,然后进行dropout。
* ### 特征的重编码问题:
利用panda的一些小技巧将Categorical Variabl数值化,而类似销售额等特征可以用log再多构造一个特征等等
* ### 对各个特征的理解
利用好matplot和seaborn的绘图工具中的统计工具对数据可视化后,洞察出数据之间的相关性。然后辅以自己对于购物的一些常识而和逻辑推理进一步理解特征。从而为更好地进行特征工程作充分准备。
* ### 特征选择
经过足够的可视化分析和特征理解之后就能大致清楚了不同特征的重要性了。也就可以进行特征选择了,通过挑选出最重要的 Feature,可以将它们之间进行各种运算和操作的结果作为新的 Feature,可能带来意外的提高,比如两个特征合并等。当然还有去掉那些没意义的特征和数据点,比如商店关门的日子,销售额为零的日子等等
* ### 模型的选择
根据数据的具体情况(如:特征维度数量,任务类别:分类还是回归,泛化能力,过拟合的风险等)选择几个适合的模型进行尝试,根据评估指标决定最后的选择
* ### 降低 Overfitting 的风险的办法
特征工程是不可或缺的,好的特征对于模型的精确度至关重要,然后要在模型选择和Ensemble上下功夫了,可以试试bagging,boosting或者stacking
* ### 如何进行有效的可视化
看大神们的博客,并自己动手实践
# 1.3指标
最终的评估结果主要是Kaggle在此项目中的pravite_data与自己预测结果的“均根方差rmspe”
自己训练的时候评估主要是看自己进行充分的特征工程后 合并后的数据集在经过训练后在train和test上的“均根方差rmspe”数值
# 二、分析
## 2.1数据研究
### 方法:
Data Exploration,对数据进行探索性的分析,从而为之后的处理和建模提供必要的结论,用 pandas 来载入数据,并 matplotlib 和 seaborn 提供的绘图功能做一些简单的可视化来理解数据。对 Numerical Variable,可以用 Box Plot 来直观地查看它的分布。
```python
```
# 5.基准模型
从多项式的线性回归开始,加入L1正则化,看看效果
再试试knn和逻辑回归,看看效果
然后可能会尝试用Bagging和boosting来进行优化或者用Blending将不相交的数据训练不同的 Base Model,将它们的输出取(加权)平均。或者使用较为复杂的Stacking。最终如何还是要看自己选择的模型和数据的具体情况了。
最后用称霸kaggle和各类数据挖掘比赛的综合模型xgboost来进行训练
根据评估标准找出最佳的模型|
# 7.项目流程设计
* 第一步:
Data Exploration,对数据进行探索性的分析,从而为之后的处理和建模提供必要的结论,用 pandas 来载入数据,并 matplotlib 和 seaborn 提供的绘图功能做一些简单的可视化来理解数据。对 Numerical Variable,可以用 Box Plot 来直观地查看它的分布。
* 第二步:
Statistical Tests,以对数据进行一些统计上的测试来验证一些假设的显著性。虽然大部分情况下靠可视化就能得到比较明确的结论,但有一些定量结果总是更理想的。
* 第三步:
Data Preprocessing,大部分情况下,在构造 Feature 之前,我们需要对比赛提供的数据集进行一些处理。具体的步骤有:处理 Missing Data,处理 Outlier,转换某些 Categorical Variable 的表示方式。
* 第四步:
Feature Encoding,Raw Feature 可能需要经过一些转换才能起到比较好的效果。比如时间序列转化成数值还有类别变量转化成数值,以及类似于sales这样的特征加log等等。最后将store数据集合并到train和test数据集上
* 第五步:
Model Selection,开始选用一些常见的模型进行训练了。先选用一些常规和简单的模型进行训练尝试,如多项式的线性回归和逻辑回归,之后根据效果和数据特定决定使用更适合的模型。
* 第六步:
Model Training,确定好自己训练和测试集,已经分好了,所以此步骤就相当于 Cross Validation,知道自己model有没有overfit。
* 第七步:
Ensemble Generation,尝试使Bagging来用训练数据的不同随机子集来训练每个 Base Model,最后进行每个 Base Model 权重相同的 Vote。也可以尝试使用Boosting来根据上一个迭代中预测错误的情况修改训练样本的权重。或者用Blending将不相交的数据训练不同的 Base Model,将它们的输出取(加权)平均,或者使用较为复杂的Stacking。最终如何还是要看自己选择的模型和数据的具体情况了。
* 第八步:
生成预测数据,并提交到kaggle上,查看自己的成绩,然后根据得分,思考自己可能存在的问题,并重复和优化第二到第七步,直到自己提升困难为止
## ----------------------------------------End!Thanks for reading----------------------------------------------------------