dd3['qtyMeanLag1']=dd3.groupby('spu_ps')['qtyMeanLag1'].ffill() #分组操作最好都通过刷新一个分组元素来查看情况 看到这里 问题 为什么会出现空值
dd3['priceMeanLag1']=dd3.groupby('spu_ps')['priceMeanLag1'].ffill() # 通过锚定活动第一天的销量和价格滞后值,通过对其的比较 而总结出规律 来判定活动结束的日期
至于阈值的决定也是通过 调试和直观观察决定的(不需要优化算法) 最终的效果评判 对典型活动 比如99,双十一等直接对比查看
是否正确来判定效果 后面再通过每次活动的款式不少于某个阈值来筛选判定不正确的打标活动
对于其他电商行业来说 这些阈值相当于是参数 直接调节就好了 同时这里解决了一个for循环问题, 直接生产新的一列
直接一减就出结果 而不用再for循环
思想:如何把图像转换为代码(也就是具体的实现步骤)
建模经验,测试
要查看的结果 用aa命令排在最前面
要取那个值,设为变量 随时更改 查看
预测: 序列的平滑 不同级别的情况的平滑情况是不同的
比如 销量按天汇总看,按月汇总看,按城市汇总,按省汇总 不同级别来看
级别往下钻的时候 引入了什么误差,那些方面的误差
看那个级别有规律
建模经验:
预测
预测多了还是少了 考察对实际业务的损失情况
对高于一定阈值的销量进行预测
动态定价 反应 需求 不看库存
销量预测 要看库存
建模经验
海明动态定价
按不同范围 比如从时间 日 周 月 季度 来看是否有规律
从管理范围结合地理区域来汇总 比如 店铺 县区 城市 省 来查看是否有规律
用之前多长的时间来滚动预测 要结合产品的生命周期来查看
如何衡量两条曲线的相似性
备注:
只写数据 代码上的功能 逻辑意义不写
建模经验
重要 根据初设参数得到的结果 再返回去修正
建模经验 拿一个数据量大的spu,一步一步的拿出来的看 对比
每运行一步 用一个中间变量 打印出来看对比
Date_range 生产对象 直接通过 pd.Dataframe(转换成dataframe 对象)
https://blog.csdn.net/csdnsevenn/article/details/82731538
带你十分钟快速入门画图神器 Matplotlib
经验
如果预测的误差很大,回到特征数据和原始数据去查看具体是什么原因,同时可以咨询
业务,找到导致误差大的原因之后,把这个原因变成变量加入到模型当中
建模经验: 可以考虑先用时间序列预测一遍 再结合机器学习预测
训练数据各种剔除离群值来拟合,拟合的再完美对测试数据的预测帮助也不是很大
建模经验:历史同期数据,即是只有部分数据能匹配上也是可以的,能有助于对已有部分数据进行区分预测,对未匹配上的数据 全部填充均值好了
值得探讨一下?这想法不一定对
建模经验
什么因素会对未来发生的事情起作用,产生影响呢?可以揭示未来的发展情况呢?
问题?
差分放进去会有用吗?
编程经验:精度不高
查看预测误差大的是不是因为数据少
编程经验 时间序列的差分直接可以用到机器学习的方法里面,相当于预示着 增长率变化的情况 时间序列和机器学习的完美结合
除了4个月的季节差分,看看还有没有其他趋势
建模经验
滚动实盘多预测几次 以现有数据和预测单位长度为滚动周期
建模经验
你知道某个地方误差大,如果只是把其标出来,准确率会有点提升 但是不如直接与目标字段值相近或者差值相近的列来的直接可靠
时间序列:
移动平均消除周期性影响
差分消除长期趋势
结果检查评估:
通过可视化来查看
时间序列
改进1:
在模型中 引入周期因素
改进2:
残差滞后一阶的预测
如何引入周期 数据经验:用模型来处理时间序列的时候 是把各种 趋势 季节趋势 引入模型 而不是先剔除模型
用残差的时候 是先把线性趋势,季节趋势剔除先
建模经验
引入季节趋势的时候,如果不确定周期数,可以多个周期数都加入
建模经验
数据量少的分开预测
建模经验
指标多了也不行,尤其是存在共线性的加入之后反而会影响效果 为什么和普通的线性回归模型存在矛盾
不能用周,得用周ID 表示时间从前往后
建模经验
对所有自变量进行共线性检查,共线性中只保留一个
建模经验 精度提升
数值不代表大小的一定要搞成哑变量
问题:
做残差的自回归为什么不成功,是因为中间隔了几个星期吗?
建模
训练好的模型,把训练数据放进去 就可以得到训练集的预测结果 怀疑是不是相隔期数太高而不起作用
建模经验
把spu加入,先换成概率值
建模经验 模型保存和导入
https://blog.csdn.net/roger_royer/article/details/79446997
建模经验
支持向量机这种本身用于分类的模型 用于回归效果不好
建模经验
XGBOOST 比 GBDT 快 比SVM 快 效果 GBDT 比XGBOOST 好 比SVM 好
建模检验:
百草味销量预测,最小价格是否可以把活动的最小价格加入
20190319
今日工作
1.python本地环境部署
2.服务器数据库数据梳理
3 销量预测算法梳理和方案构思
明日工作
1.数据整理和特征构造
问题:目前的销量预测有dnn版本和rnn版本,dnn版本到店铺spu,没有融入价格,无法做动态定价,rnn版本有价格做特征但预测的粒度到省份的spu,粒度较粗。
改进和初步方案设计:在到店铺spu的粒度下用lgbm算法先进行建模尝试,该算法对属性数据能较好的处理,训练速度快,同时能较快的定位到有效特征同时便于后期深度学习进行迭代优化。
20190325 米佳奇 海明线下预测通用版
今日工作
1 模型编写
明日工作
1 特征粒度放粗到周以及模型调参。
问题:线下销量数据在日粒度下分布严重离散,会经常出现大半个月没销量的情况,同时销量数据为0的补充完整后数据量很大,很多0值销量带来很多冗余信息,数据整理运行慢同时训练慢。
改进思路:在店铺粒度和周粒度下进行特征构建,同时预测跨度从2周提高到1个月,使得数据连续性增强同时降低心细冗余。
建模步骤
剔除离群值
建模经验
生意参谋已下架状态可以当做已知条件来用,实际环境中可以设置当库存小于某个值的时候 就设置为下架状态
20190320
今日工作
1.线下动态定价特征整理
明日工作
1.线下动态定价特征整理
问题:
线下服装销售数据很不连续,同一个spu下销量数据有很多的日期空缺,之前的办法是在省份下对spu的销售数据进行汇总提高数据的连续性,但降低了样本量。现在在店铺下对spu销售数据汇总,需要进行空缺占位填充,数据量会变大四倍左右,导致rolling特征提取很慢。
20190326 米佳奇 海明线下预测通用版
今日工作
1. 线下通用模型训练
明日工作
1.线下通用模型优化
问题:准确率未达标
改进:检查数据质量,增加对比模型
20190322 米佳奇 海明线下预测通用版
今日工作
1.数据异常处理
2.模型初步编码
明日工作
1.模型编码
问题:折扣有小于0.1的和大于1的情况,特征数据量比原始数据大四五倍。
改进:核对数据剔除错误的spu同时根据折扣进行数据过滤,树模型尝试批次训练解决大数据的训练问题。
20190326 刘金钰
今日工作
1.模型选择建立,训练
明日工作
1.建立模型,训练测试
问题:构建模型数据集过程中产生大量的占位数据(啥意思),可能会影响最后预测效果,还在观测
改进:针对数据集进行分类分段集中训练测试
建模经验
如果数据少的话,就按固定时间长度 滚动预测
销量预测数据划分方式
1. 数据量少的话,就按固定时间长度 滚动预测 周,多周,月
建模经验
在预测结果上面加个调节系数,改进输出结果(比如预测结果销量大于多少 再调节一下) 在知道结果的情况下是可以这么查看的,加了调节系数之后 还要用新的数据去验证?!!!
建模经验
百草味加上农历的节假日
建模经验
按类别来统计结果 建模问题:
百草味这种食品 礼盒的准确度很差
建模经验
销量预测 如果是固定时间段的预测的话,那前面就可以取字段的几个滞后值
如果是非固定长度的预测的话,就取前面固定时间长度的特征 这个时候就没有滞后期的 当然可以有滞后期 但是没有必要
20190327 陶雨雨
今日工作
1.李宁卫衣类数据检查并尝试结合传统算法进行活动销量预测
明日工作
1李宁卫衣活动销量预测
问题:只有卫衣品类构建模型,整合成活动后数据量很少,活动前后在销量上没有发现明显趋势,模型效果较差
改进:下一步尝试按照品类进行活动销量预测,根据历史销售占比划分到每一款,进行预测效果验证
建模问题 未实践的方法
1. 给记录加权重
2. 插值
梦河 业务准确率
爆款按最大值和真实值是没什么区别的
旺款比最大值少报3个点
平滞款基本不看
建模经验
别人说的任何意见建议都可以去尝试
20190328
今日工作
1.李宁卫衣类活动销量预测及结果输出
明日工作
1.李宁大活动销量预测
问题:活动预测准确率不高
改进:根据预测结果,进行分段系数调整,准确率得到一定提高
20190328
今日工作
1.线下预测精度提升
明日工作
1.线下预测精度提示
问题:神经网络准确率精度在0.6左右,需要提升,由于服务器gpu资源紧张,目前用台式机的cpu训练,速度相对较慢。
改进:数据质量核查,数据清洗,增加属性特征,排查误差原因。另外需要gpu的支持,@曾挺 可否配置一块gpu,台式机训练耗时间。
建模问题
哑变量和标准化是在训练和测试集划分之前全部一次进行,还是划分之后分开进行 看那个准确率更高
建模笔记
精度提升步骤
1. 模型筛选
2. 参数调节
Presort(预分类):auto
Criterion:’friedman_mse’: mse 和mae 选最好的
3. 哑变量
4. 共线性(决策树模型 不需要考虑共线性) 和目标变量相关系数小于0.03(这里的指标是在没进入算法之前的处理,算法给出的
相关系数对应的值是0.003)的踢掉 (0.03以下剔除 容易过拟合 踢掉之后 总体的准确率会下降 但是头部的可能会提高 0.003以上的都不能踢掉 )
只要相关性是正的都可以考虑加入 负相关性的 要逐个增加查看效果相对于均值目标变量,百分比变量也可能是有用的
2. GBDT类库boosting框架参数 :主要用于回归
首先,我们来看boosting框架相关的重要参数。由于GradientBoostingClassifier和GradientBoostingRegressor的参数绝大部分相同,我们下面会一起来讲,不同点会单独指出。
1) n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。 (重点,只有有没有负的提升可以一直增加)
2) learning_rate: 即每个弱学习器的权重缩减系数νν,也称作步长,在原理篇的正则化章节我们也讲到了,加上了正则化项,我们的强学习器的迭代公式为fk(x)=fk−1(x)+νhk(x)fk(x)=fk−1(x)+νhk(x)。νν的取值范围为0<ν≤10<ν≤1。对于同样的训练集拟合效果,较小的νν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的νν开始调参,默认是1。(重点,通常0.01 就好 太大容易局部最优 太小速度慢)
3) subsample: 即我们在原理篇的正则化章节讲到的子采样,取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间,默认是1.0,即不使用子采样。(重点)
4) init: 即我们的初始化的时候的弱学习器,拟合对应原理篇里面的f0(x)f0(x),如果不输入,则用训练集样本来做样本集的初始化分类回归预测。否则用init参数提供的学习器做初始化分类回归预测。一般用在我们对数据有先验知识,或者之前做过一些拟合的时候,如果没有的话就不用管这个参数了。init=None, ###基模型,默认为CART 默认就好
5) loss: 即我们GBDT算法中的损失函数。分类模型和回归模型的损失函数是不一样的。 一般选huber
对于分类模型,有对数似然损失函数"deviance"和指数损失函数"exponential"两者输入选择。默认是对数似然损失函数"deviance"。在原理篇中对这些分类损失函数有详细的介绍。一般来说,推荐使用默认的"deviance"。它对二元分离和多元分类各自都有比较好的优化。而指数损失函数等于把我们带到了Adaboost算法。
对于回归模型,有均方差"ls", 绝对损失"lad", Huber损失"huber"和分位数损失“quantile”。默认是均方差"ls"。一般来说,如果数据的噪音点不多,用默认的均方差"ls"比较好。如果是噪音点较多,则推荐用抗噪音的损失函数"huber"。而如果我们需要对训练集进行分段预测的时候,则采用“quantile”。
6) alpha:这个参数只有GradientBoostingRegressor有,当我们使用Huber损失"huber"和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值。
自己调节[0,1]之间
7)criterion='friedman_mse', #####特别注意:mae出奇的慢,'mse','friedman_mse','mse','mae' 默认 friedman_mse 就好
3. GBDT类库弱学习器参数
这里我们再对GBDT的类库弱学习器的重要参数做一个总结。由于GBDT使用了CART回归决策树,因此它的参数基本来源于决策树类,也就是说,和DecisionTreeClassifier和DecisionTreeRegressor的参数基本类似。如果你已经很熟悉决策树算法的调参,那么这一节基本可以跳过。不熟悉的朋友可以继续看下去。
1) 划分时考虑的最大特征数max_features: 可以使用很多种类型的值,默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑log2Nlog2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。(先使默认的如果不好,再用百分比)
2) 决策树最大深度max_depth: 默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。(重点)如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。(一般先尝试5到10)
3) 内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。(推荐5以上,避免过拟合)
4) 叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。(回归一般选2)
5)叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。 0.001 ;理解的不是很到位 占比小的类别所占的比重???
6) 最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
8) 7) 节点划分最小不纯度min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。 min_impurity_decrease=0.0001, 默认
9) random_state=0 为了比较每次参数改变的效果
10) Verbose=1 打印详细迭代过程
11)subsample=0.8 参与拟合的样本数比例
样本权重
在feed data的过程中,我们总是会用到samle_weight,样本权重的直观理解为:样本权重给出了各个样本的重要性。
具体是怎么体现的了,首先样本权重不是把样本乘以一个系数,这样的话feature值不就改变了,他改变的是该样本的数量,本来一个样本是1个,现在变成了0.8个,或者1.5个,样本数量现在可以取小数个了,对应的这个样本在总体样本中的占比也会变化。
如下代码就能体现,样本权重的作用,它改变的是样本的计数,从而改变了整个样本的信息量。
损失函数的理解:
先来个通俗理解:假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
https://blog.csdn.net/beauty0522/article/details/82726866
CART 回归 分裂属性选择的理解
建模经验
对于树模型来说的预测来说,你找的特征越多,越能包含其区分不同个体差异的特征数量,越能最终预测准确
20190401 林
今日工作
1.生命周期通用版算法编写
明日工作
1.生命周期通用版算法编写
问题:不同公司生命周期的细分颗粒度可能不同,类目层级也不一样
改进:为增强通用性,将多层循环改成一层循环+条件组合.
20190401 米
今日工作
1.线下通用预测算法头部精度提升
明日工作
1.头部精度提升和总体精度的权衡
问题:一个算法很难同时兼顾头部为腰部
思路:用不同的模型分别提升头部和腰部精度
20190401 陶
今日工作
1.李宁各个活动订单销量分析
2.与业务探讨如何划分大活动及预测
明日工作
1.结合业务的建议,尝试精度提升
问题:预测精度不高
改进:按照业务建议,尝试加入各个活动的目标销售信息
头部腰部的解决
1. 尝试先建一个分类模型
2. 再在分类模型的结果上做回归
电商二月份 提前10天快递停运,春节期间也不发货
LSTM 的数据格式
列
行 时间 spu
特征
问题:每个样本特征权重 单独配置?
预测品类,品种和单个spu汇总之后的结果的相互核对
平均和求和的差异: 用平均可以避免日期缺失的问题
自然周:受节气影响较大
滚动周:受节气影响较小
上架天数:反应生命周期
20190402
今日工作
1.线下通用预测算法优化提升
2.算法讨论会议
明日工作
1.线下通用预测算法精度提升
改进:
1,神经网络中引入多目标学习,同时输出预测销量和预测头部和腰部销量的标记,头部识别的效果较好,尾部识别的不太好,同时提高了预测的鲁棒性,通过auc停止准则防止算法提前stop导致回归训练不充分的情况。
2,采用原始销量特征,分别对销量,折扣,属性做embeding,提升了特征间交叉信息,对提升auc和预测效果明显。
讲清楚embedding到底在干什么
https://blog.csdn.net/k284213498/article/details/83474972
建模笔记
销量预测存在明显的 头部 腰部和尾部的问题
数据量多 最好是 全部划分开 分开处理
支持向量机参数调节 调参
C: float参数 默认值为1.0
错误项的惩罚系数。C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高(惩罚就理解为准确率,一般取值1到5000 重点),但是泛化能力降低,也就是对测试数据的分类准确率降低。相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。
kernel: str参数 默认为‘rbf’ 重点 rbf 最常用
算法中采用的核函数类型,可选参数有:
‘linear’:线性核函数
‘poly’:多项式核函数
‘rbf’:径像核函数/高斯核
‘sigmod’:sigmod核函数
‘precomputed’:核矩阵
还有一点需要说明,除了上面限定的核函数外,还可以给出自己定义的核函数,其实内部就是用你自己定义的核函数来计算核矩阵。
degree:int型参数 默认为3
这个参数只对多项式核函数有用,是指多项式核函数的阶数n
如果给的核函数参数是其他核函数,则会自动忽略该参数。
gamma:float参数 默认为auto #重要 (相反)
线性核只适合线性可分(通过画直线就可以分开,RBF 高斯核适合线性不可分)
核函数系数,只对‘rbf’,‘poly’,‘sigmod’有效。
如果gamma为auto,代表其值为样本特征数的倒数,即1/n_features. (其中有两个重要的参数,即 C(惩罚系数) 和 gamma,
gamma 越大,支持向量越少,gamma 越小,支持向量越多。
而支持向量的个数影响训练和预测的速度。
C 越高,容易过拟合。C 越小,容易欠拟合。) 一般取值(0.0001 到 0.1) 对结果影响大 感觉和 C的作用差不多
coef0:float参数 默认为0.0
核函数中的独立项,只有对‘poly’和‘sigmod’核函数有用,是指其中的参数c
probability:bool参数 默认为False 是否启用概率估计。 这必须在调用fit()之前启用,并且会fit()方法速度变慢。
shrinking:bool参数 默认为True
是否采用启发式收缩方式
tol: float参数 默认为1e^-3 (0.001 或者0.0001)
svm停止训练的误差精度
cache_size:float参数 默认为200
指定训练所需要的内存,以MB为单位,默认为200MB。
class_weight:字典类型或者‘balance’字符串。默认为None (重点,给样本的少的类别更大的权重)
Set the parameter C of class i to class_weight[i]*C for SVC. If not given, all classes are supposed to have weight one. The "balanced" mode uses the values of y to automatically adjust weights inversely proportional to class frequencies in the input data as n_samples / (n_classes * np.bincount(y))
给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C.
如果给定参数‘balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。
verbose :bool参数 默认为False
是否启用详细输出。 此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。一般情况都设为False,不用管它。
max_iter :int参数 默认为-1
最大迭代次数,如果为-1,表示不限制
random_state:int型参数 默认为None
案列
self.model = Pipeline([
('cls', SVC(kernel='rbf', ####f 'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'
C=500, ####惩罚因子(松弛变量),越大代表对误差大的点(极端点)的惩罚越大
gamma=0.001, ####'rbf', 'poly' and 'sigmoid'下才有效
coef0=0, ###'poly' and 'sigmoid'才有效,核函数的常数项
degree=2, ####多项式poly阶,仅在poly下有效
cache_size=1000,
class_weight={1:2,0:1},
# class_weight='balanced',
shrinking=True,
tol=0.0001, ###默认停止的误差大小,默认0.001
max_iter=-1, ###迭代次数
verbose=False,
random_state=0,
)) ])
建模经验
在模型源代码里面自定义损失函数 还是实践
样本权重:指的是每个样本对应误差的权重
建模经验
理解公式最好的办法是用小数据量模拟运算
建模经验
改进高销量不准的三种思路
1. 同一个模型 通过调节损失函数 分别拟合高低销量
2. 先一个模型预测分类,另一个模型预测回归 分别两种 一种通过模型先预测分类;另一种通过爆旺平滞系统来预测
建模经验
看模型源代码 GBDT 没有设置样本权重的地方 无法通过设置样本权重来 建立两个模型
建模经验
MSE 适合拟合高销量的数据
Friedman_mse 适合拟合腰部的数据
MSE 还没试过
建模经验
训练集的数据可以随便弄 随便增减
建模经验
先剔除(最小的)5%的训练数据看看,拟合大的值,还可以在自定义损失函数 是误差拟合更偏重于 大误差而
忽略小误差
建模笔记
没纳入的分一级 活动分级 13 以上分一级 6 分一级 4分一级 3分一级 2分一级 <1 分一级 一共分7级对于 一级的就要独立处理了 二级最好分开处理 当然也可以把剩下的 完全一起处理
大型的相比 最低的大于21(含自身)倍以上,就要单独分开处理了
建模笔记
属性特征的筛选 就算是GBDT 这种以决策树为基础的 也需要考虑共线性
也需要 像回归一样 逐渐的增减特征来测试最优的特征组合 可以写个循环
最好是用神经网络 其自己就能解决这个问题
目标值是均值 特征变量特别是与其高度相关的 最好也是对应的均值,最大,最小值也可以(而不是求和和百分比) 而不是特别的相关的可以采用求和和百分比
建模经验
预测训练集至少需要一年 当然还是需要看具体情况(具体的处理粒度)
最好有三年 这样可以有一年有完整的去年同期 第三年测试
建模经验
建模问题
活动日和非活动日: 这一天是否是活动日 和 某个spu 是否参加活动是独立的 可以做两个标记
建模经验
模型最近时间的数据很重要 其他spu的数据也很重要 往前推最附近的值 最好不要缺失
建模经验
变量的筛选,首先看按相关系数来查看 按相关系数的强度来排序来逐渐增加 在很少一部分的测试数据上效果好(少量特征足够区分少量数据),并不代表在大部分测试数据上的效果好(
测试数据多了,就包含了更多的影响因素,就需要更好的特征来区分了),最终要看大部分测试数据的效果
先一次性加入所有的特征,然后看其加入特征之后准确率的变化,只要是准确率上升的就保留
下降的就剔除
自身数据计算出来的其他指标都不好? qty 目标用的mean 对应Max 什么的也不行?
Max,min 也不管管用? 即是相关性强?(待验证)
建模经验 销量预测
1. 首先通过损失函数 MAE 或者 huber(huber 的参数可以调) 建个模型,相当于是预测分类高低销量
2. 然后再单独删除测试集中的低销量(剔除的比例可以调),并用huber 建模 预测高销量
3. 然后按第一步的预测值的销量排序 占销量80%的取 第二个模型的值,占销量20%的取第一个模型的值
建模经验
进入算法前,有缺失值的行都去掉
建模经验
剔除销量后 实际销量低的确预测为高销量 查看原因 看是否累计和是否都区分预测结果有帮助 从开始
到目前为止的 累计销量数据
建模问题
是在标准化之前 划分数据 还是划分数据之后 再标准化
建模经验
LSTM 的数据放置方式 图上显示是一个spu
纵轴是 日期
横轴是特征,包括滞后期的特征
建模经验
在最后预测值分段确定为真实的预测值的时候用预测值销量排序来分段
在最终确定预测值销量之后 看最后准确率的时候 还是的用真实值来排序查看
建模经验
根据根据数据记录长度和完整性来判断 高低销量 不对吧?
建模问题改进
在现有的基础上还可以再对低销量的数据单独建模,就按升序排序 取销量的20% 数据来建模
最终再结合MAE的结果 进行融合 效果肯定会更好 还可以分段分的更细 对于结果按销量排序之后 实际销量接近 但预测销量却相差非常多 仔细研究产生的原因
建模经验
在一个模块编写完成的时候 就整理保留一份无错的代码
问题
第一次反向传播结束之后 权重更新之后 再次输入的样本值是什么 一个? 全部? 一批?
米 经验
1)预测线下通用版目前采用神经网络算法,为保证对不同客户数据的通用性,用机器学习模型也做了一版(在目前海明数据上的表现,没有神经网络效果好,还在优化中)。这样到时候新客户数据来了可以都跑一下,看哪个好用哪个。
建模经验
这个是误差曲线 相当于是原函数了?
横坐标是参数的值
随机梯度下降 可能是原函数图像 反方向的上升或者下降 导致梯度不再是 下降 而是上升 比如上图的左边 就是梯度下降了 梯度符号反向了 导致上上下下震荡
梯度本身是使函数值变大的方向 加个符号 往变小的方向变化
梯度下降
学习率 表示每步走多远的距离
熵的理解
就是一个(事件)所有概率的期望值 https://blog.csdn.net/GoodShot/article/details/78302337
概率越小 信息越越模糊 需要知道更多的信息才能分辨他 所以通过log转换之后 概率越小的 log之后的值越大 代表要了解他 所需要的信息就更多 这个信息也可以理解为
如果底数为2的话 就直接表示为 计算机中的信息位数了 bit位数了
建模总结-----预测总结
1. 如果预测的时间段是固定的 比如说3周 那可以直接统计每周和3周总的情况 并利用其滞后阶的信息 相当于在周的粒度上面进行滚动
数据量较多
可否按天来滚动呢?
假设是是按天 那就统计过去30天的情况, 相当于按天来滞后了 过去三天总的情况 来预测未来30天的情况上下两种的区别是什么 第二种的数据条数会更多 提取出来的特征更多体现的是增量信息? 两种都可以测试一下
2. 现在的日常预测只需要稍微更改一下 就可以直接用 改成四周就好了
3. 如果预测的时间段(长度)是不固定的(活动) 就取 活动开始的第一天 往后推一段时间(3周)的数据 进行特征提取
就没有滞后多少阶的信息了 时间长度 可以变化着取 比如 一周,两周等减少特征的数量
建模经验
如何查看是否是数据处理错误了
1. 首先从误差分布来看 是否分布对称 如果不对称 则可能预示 数据处理错了
建模经验
从业务是否有意义 来判断技术是否可行
前面剔除了四周汇总销量都为零的,所有平均的时候 天数就少了 在实际中也要踢掉连续一周都为零 自然周
建模经验
1. 在筛选字段相关性的时候 是只用少量数据 还是用全量测试数据
答案是用少量数据 在少量数据的时候 字段的更改都导致 准确度的更改 那在全量测试的时候
同样会得到这样的效果
问题 数据记录条数 是否要去掉零值 日常活动天数加进去
减去其参加活动的天数就好了
1.先看看第一种的情况吧
2.如果不行 就把天数加进去好了
可以剔除的,销量好的一般都是会有大体上完整的整月记录数
好几个星期都为零这种 基本第二个月都不会怎么重点考虑了 所用 用实际非零的天数就好了
建模经验
数据处理部分用spark 来完成??
Pyspark
建模经验问题 再仔细考虑一下 为什么会用到未来数据?
要预测多少时间 就要间隔多长时间
1
2
3
4
数字表示周
间隔是指的 两个相邻的周不能进行预测
训练的最后一周 预测的目标字段是用到了未来三周的数据所以需要相隔预测长度的周数
建模经验
按天滚动预测 如果没有牵扯到未来字段 就可批量按天预测
如果牵扯到未来字段 比如库存 因为未来不知道库存是多少所以库存也是需要预测的 所以需要按天滚动
建模经验
特征的筛选
1.按相关系数 从大到小排序
2.最好是全量test数据测试
3.特征个数逐渐增加
4.只要某次的特征加入之后 准确率有提升 就保留这个特征 不管其对应准确率是否是
目前为止最小值百草味销量预测过程总结 为面试
一.分为活动和非活动
两个部分都有以下几个模块 1.数据预处理
2.活动标记
3. 特征提取
4.构建模型
5.模式训练,测试,评估,部署
比如非活动部分
1.数据预处理 把销售信息表,属性表,成本表,库存表, 组织结构表,活动表等与销售相关字段拼接合并到一起.
1.1错误数据的处理 比如一个淘宝id下面对应多种不同型号的产品,这种先不考虑,因为多种产品的成本,价格都不好统计.
比如 错误的类目的修正,错误值(比如销量负值,超大值等,退货不可能为正等)的修改等
1.2 缺失值的处理 直接删除,均值,插值填充或者根据其他相关字段而推导出来 最好的取舍办法就是这几种都分别建模看哪种效果最好
1.3极值的处理 通过相邻间值的变化幅度以及是否有连续变化波动较小的区间来判断是否属于极端值.
2.活动打标
2.1 活动第一天标记
因为第一天销量和价格变化最为剧烈,通过活动第一天真实销量与窗口为3滞后一阶的滑动平均销量变化率
以及活动第一天真实价格与窗口为3滞后一阶的滑动平均价格变化率
来判定是否属于活动第一天
2.2 通过对销售件数除第一天之外的剩余活动销售时间款数与第一天参加活动款数之比,
以及活动款数与总款数的比率,通过紧盯几个大活动的情况来设定阈值来决定
3 特征提取
预测未来三周非活动销量情况
分成3个部分3.1第一部分:最近的信息
类目信息(一级,二级类目信息等),时间序列信息(年,月,周,日,节假日等) 3周非活动平均销量,平均访客,平均收藏,平均销售金额滞后阶的情况
再分为活动和非活动
过去一周,过去两周,平均访客,平均收藏数,平均销量,最大销量,最小价格
及其滞后1,2,3阶等,
单个spu销量占小类目,大类目的销量比例等
销量访客转化等,
3.2第二部分:去年同期的情况
去年同期的平均销量情况,如果没有对应的用其小类对应的平均销量情况来替代
3.3第三部分:未来的情况
未来三周是否有活动,未来三周非活动天数等
4.构建模型
首先通过皮尔逊和斯皮尔曼相关系数对所有自变量按其余目标变量相关性强弱从高到低排序
然后逐步加入变量考察模型对训练集准确度提升的效果.只要有效果提升的变量变量就保留.
利用集成方法GBDT进行模型构造.
其主要的参数调节有4.1.迭代次数,刚开始可以选取大一些,然后再选取效果不会继续降低的最小的的迭代次数
4.2学习率 取小一些 防止错过最小值或者震荡
4.3.损失函数 根据目标来选择 比如MSE(偏向误差较大的值)和mae(倾向于保持原来的数据分布状态),huber(综合二者的有点)
4.4最大深度 太深 容易过拟合4.5特征数抽样 充分利用不同的特征信息
4.6其他参数
存在问题:不管如何提取特征,始终在65%到70%的准确率徘徊,因为你永远无法得知未来的真实情况,如果你都知道了
那也就不用预测了. 因为对于销量数据来说 始终存在着段氏的分布高销量,中低销量.如果能知道未来是高销量还是
低销量的话,那只用高销量数据去预测高销量的部分,中低销量去预测中低销量的数据,那效果至少能提高5%到10个点.
刚开始我尝试先做分类预测,然后再做销量预测.但这样处理始终存在着错分的情况.高销量的被误分类为低销量,反之亦然.
这样导致最终的准确率根本无法提高. 但是最后这个问题还是被我解决了.在预测方面我想这个问题全国应该也没有
多少人知道这个解决方案.
本质上就是一个通过模型融合(解决样本不均衡的问题)
日常预测思路
1. 对于高销量部分 取0.9 损失函数取 MSE
2. 对于中低销量部分 直接取MAE 的结果
3. 对于最终销量的融合取MAE的结果作为高低销量的划分
4. 高销量部分用MSE的结果来替换
活动预测思路
1. 对于中低部的数据就用MAE 拟合
2. 对于超高销量的部分 先去掉了0.95 然后再取的0.8 76%
3. 对于高销量的部分 用MSE 拟合 直接取的0.8
4. 对于最终销量的融合取MAE 的结果作为高低销量的划分
TFIDF
https://www.cnblogs.com/ybjourney/p/4793370.html
经验风险最小 就是训练误差最小
警训 而不是正则部分
超参数都可以看成是权重
梯度下降本来就是贪婪算法 能跨多大的步子就跨多大 价格 学习率 让其跨的小一点
贪心算法 每次都走能够走的最大的步伐
中间没有逗号 表示二者不是并列关系 从右往左 范围越来越小
什么是logloss
经验 有监督就用 梯度下降和最大似然
无监督就用 EM 算法
贪心算法 取当前条件下最好的解
动态规划 大的问题 转换成小的问题 小的问题 结构和定义非常类似
小问题解决了 大问题就解决了
递归:每一步都必须从上一步得到
负样本 就是反样本
考察相关性必须每一行的值是对应考察分布不需要每一行的值对应? 问题
如果里面有缺失值 峰度的结果就会是nan
https://blog.csdn.net/ksearch/article/details/22820495
Pearson 相关复选项 积差相关 计算连续变量或是等间距测度的变量间的相关分析
Kendall 复选项 等级相关 计算分类变量间的秩相关,适用于合并等级资料
Spearman 复选项 等级相关 计算斯皮尔曼相关,适用于连续等级资料
对分布进行刻画抽取特征
是否有空的直条
频数的唯一值个数
https://blog.csdn.net/hfut_jf/article/details/71403741
求散度
##必须事先把所有值转化为概率 且总和为1
特征选择
就按相关性从高到低排序 然后取 结果最好的一次就行了 而不是通过 只有有效果增加就保留指标的方式
剪枝 就是去掉一些不好的选项
对数似然
镜像的意义
顺序完全相反
DAG
3:[3:4]
3 为 当前词所在的索引 第二个3 为其指向自己的箭头? 4 为3到4 的箭头 表示34组成的词存在语料库中
{0: [0], 1: [1], 2: [2], 3: [3, 4], 4: [4], 5: [5, 6], 6: [6], 7: [7, 8, 10], 8: [8], 9: [9, 10], 10: [10], 11: [11], 12: [12, 13, 15], 13: [13], 14: [14, 15], 15: [15]}
DAG 前面配对的索引有可能大于后面继续配对的字的索引
Yield 和 return
相同点:都是返回函数执行的结果
不同点:return 在返回结果后结束函数的运行,而yield 则是让函数变成一个生成器,生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值
yield 生成器相比 return一次返回所有结果的优势:
(1)反应更迅速
(2)更节省空间
(3)使用更灵活
可在不同地方 出现
route[idx] = max((log(self.FREQ.get(sentence[idx:x + 1]) or 1) -
logtotal + route[x + 1][0], x) for x in DAG[idx])
列表生成式 for 循环到处放
route[idx] = max((log(self.FREQ.get(sentence[idx:x + 1]) or 1) -logtotal + route[x + 1][0], x) for x in DAG[idx])
这里的max 里面 是 max((a,b),for x in DAG(idx)) 里面一坨会产生一个很多元组对 从里面选个最大的?