7、python多种方式进行成单回归预测
7、python多种方式进行成单回归预测
多种方案成单预测比较
1 背景和挖掘目标
基于关键的业务指标进行成单预测,对影响成单的因子了解
2 分析步骤
01 基于关键特征数据底表的分组处理
02 关于机会、名片表的处理 基于业务逻辑或者数据表现进行分组,查看
0 处理成单跨期导致的名片-成单的数据对应问题
04 观察各关键指标对结果的影响大小&
7、python多种方式进行成单回归预测
多种方案成单预测比较
1 背景和挖掘目标
基于关键的业务指标进行成单预测,对影响成单的因子了解
2 分析步骤
01 基于关键特征数据底表的分组处理
02 关于机会、名片表的处理 基于业务逻辑或者数据表现进行分组,查看
0 处理成单跨期导致的名片-成单的数据对应问题
04 观察各关键指标对结果的影响大小,并选择有显著影响的特征
05 利用均值原理计算成单
06 Sequential 神经网络进行调参和预测
07 LinearRegression多项式线性回归预测和验证
08 Lasso套索回归预测
09 贝叶斯岭回归
010 核岭回归预测
011 画出结果
、代码案例
# 目的,基于业务预测成单import numpyimport pandas # 1 关于订单表的处理data = pandas.read_csv( D:\\DATA\\pycase\\number2\\project\\pretice\\ ,encoding= gbk
)# 提取关键字段Data=data[[ 周 , 日期 , 星期 , 军团 , 咨询师 , 学费金额 , 成单周期 , 报名人数 , 机会时间 ]]# 根据业务的而需求将成单周期分为以下几个阶段,研究对象为军团# 查看成单的分布情况aggResult=Data.groupby(by=[ 成单周期 ])[ 报名人数 ].agg({ 成单单数 :numpy.sum})
# 根据分组的情况对成单进行分组有查看# bins划分数据bins=[-1,0,1,2,,6,1,0,1000] # 范围,让标签小于bins# 分组的自定义标签labels=[ 当天成单 , 1天成单 , 2天成单 , 天成单 , 4-6天成单 , 7-1天成单 , 14-0天成单 , 0以上成单 ]
Data[ 成单周期分层 ]=(Data.成单周期,bins,labels=labels)# 根据成单分层进行分布分析AggResult=Data.groupby(by=[ 成单周期分层 ])[ 报名人数 ].agg({ 成单单数 :numpy.sum})# 使用百分比的形式进行数据的直观展现
pAggResult=round(AggResult/AggResult.sum(),2)*100# 百分数格式设置pAggResult[ 成单单数 ].map( {:,.2f}% .format)# 2、关于机会、名片表的处理 基于业务逻辑或者数据表现进行分组
data2 = pandas.read_csv( D:\\DATA\\pycase\\number2\\project\\pretice\\ )data2.dtypes# 对机会进行分组aggResult2=data2.groupby(by=[ 日期 ])[ 销售机会数 ].agg({ 机会数 : numpy.sum})
## 机会匹配Vlook
DataAgg=(Data,aggResult2,left_on= 机会时间 ,right_index=True,how= left )# 由于某些时间段没有对应的数据,所以删除缺失值啊对应的相关数据。DataAgg=DataAgg.dropna()# 再次进行分布分析DaggResult=DataAgg.groupby(by=[ 成单周期 ])[ 报名人数 ].agg({ 成单单数 :numpy.sum})
# 根据分组的情况对成单进行分组有查看# bins划分数据bins=[-1,0,1,2,,6,1,0,1000] # 范围,让标签小于bins# 分组的自定义标签labels=[ 当天成单 , 1天成单 , 2天成单 , 天成单 , 4-6天成单 , 7-1天成单 , 14-0天成单 , 0以上成单 ]
DataAgg[ 成单周期分层 ]=(DataAgg.成单周期,bins,labels=labels)# 根据成单分层进行分布分析DataAggResult=DataAgg.groupby(by=[ 成单周期分层 ])[ 报名人数 ].agg({ 成单单数 :numpy.sum})# 使用百分比的形式进行数据的直观展现
pDataAggResult=round(DataAggResult/DataAggResult.sum(),2)*100pDataAggResult[ 成单单数 ].map( {:,.2f}% .format)# 、两表alphaB匹配,机会匹配成单DataAggResult[ 销售机会数 ]=DataAggResult[ 成单单数 ]# 序列转化时间格式data2[ 日期 ]= _datetime(data2[ 日期 ],format= %Y/%m/%d )# 转化为字符窜格式data2[ 日期 ]=data2.日期.dt.strftime( %Y/%m/%d )DataAggResult.iloc[0,1]=data2.销售机会数.sum()
DataAggResult.iloc[1,1]=data2[data2.日期< 2018/12/10 ][ 销售机会数 ].sum()
DataAggResult.iloc[2,1]=data2[data2.日期< 2018/12/09 ][ 销售机会数 ].sum()
DataAggResult.iloc[,1]=data2[data2.日期< 2018/12/08 ][ 销售机会数 ].sum()
DataAggResult.iloc[4,1]=data2[data2.日期< 2018/12/07 ][ 销售机会数 ].sum()*159 # 162-=159
DataAggResult.iloc[5,1]=data2[data2.日期< 2018/12/04 ][ 销售机会数 ].sum()*156 # 162-6=156
DataAggResult.iloc[6,1]=data2[data2.日期< 2018/11/27 ][ 销售机会数 ].sum()*149 # 162-1=149
DataAggResult.iloc[7,1]=data2[data2.日期< 2018/11/09 ][ 销售机会数 ].sum()*12 # 162-0=12天的日军机会(因为报名就总数)DataAggResult[ 平均销转 ]=DataAggResult[ 成单单数 ]/DataAggResult[ 销售机会数 ]### .2 新增观察成单数量日期# 对成单数量进行分布分析DaggResult=DataAgg.groupby(by=[ 日期 ])[ 报名人数 ].agg({ 成单单数 :numpy.sum})
# 数据框排序# =DaggResult.sort_values( [ 成单单数 ],axis = 0,ascending =False)# 看分布# 根据分组的情况对成单进行分组有查看# bins划分数据bins=[-1,25,50,00] # 范围,让标签小于bins# 分组的自定义标签labels=[ 普通 , 小促 , 大促 ]DaggResult[ 成单分级查看 ]=(DaggResult.成单单数,bins,labels=labels)# 根据成单分层进行分布分析DaggAGGResult=DaggResult.groupby(by=[ 成单分级查看 ])[ 成单单数 ].agg({ 成单分层数 :numpy.sum})# 使用百分比的形式进行数据的直观展现
DaggAGGResult=round(DaggAGGResult/DaggAGGResult.sum(),2)*100DaggAGGResult[ 成单分层数 ].map( {:,.2f}% .format)### 4 观察不同司龄的咨询师的销转Data2=data2[[ 咨询师 , 司龄 ]]Data2=Data2.drop_duplicates()## 人员司龄匹配DataAgg=(DataAgg,Data2,left_on= 咨询师 ,right_on= 咨询师 ,how= left )ptresult=DataAgg.pivot_table(values=[ 咨询师 , 机会数 , 报名人数 ],index= 司龄 ,aggfunc=numpy.sum)ptresult[ 司龄销转 ]=ptresult[ 报名人数 ]/ptresult[ 机会数 ]*100 1-个月:1
-6个月:2
6-12个月:
一个月以内:4
一年以上:5
未知:6ActiveDict={ 1-个月 :1, -6个月 :2, 6-12个月 :, 一个月以内 :4, 一年以上 :5, 未知 :6} # 研究方向的以天为单位,所以在这里不需要字典处理ptresult2=data2.pivot_table(values= 咨询师 ,index= 日期 ,columns= 司龄 ,aggfunc=numpy.size)ptresult2=ptresult2.fillna(0)# 虚拟变量的转化# 星期时间段的虚拟化,在后边# 有比较的虚拟变量准话
普通:1
小促:2
大促:
activeDict={ 普通 :1, 小促 :2, 大促 :}
# 增加虚拟变量DaggResult[ Map ]=DaggResult[ 成单分级查看 ].map(activeDict)# 4、新建基于时间的机会数量
# 1 创建一维数组12.10号对应的周期名片from pandas import DataFramelabels2=[ 当天机会 , 1天机会 , 2天机会 , 天机会 , 4-6天机会 , 7-1天机会 , 14-0天机会 , 0以上机会 ]Mp=DataFrame({ 日期 :[], 当天机会 :[], 1天机会 :[], 2天机会 :[], 天机会 :[], 4-6天机会 :[], 7-1天机会 :[], 14-0天机会 :[], 0以上机会 :[]})# 定义测试的时间序列,并且删除重复数据from pandas import Seriesdate=Series(data.日期).drop_duplicates()# 将序列赋值给MpMp[ 日期 ]=dateMp.dtypes# 序列转化时间格式Mp[ 日期 ]= _datetime(Mp[ 日期 ],format= %Y/%m/%d )# 转化为字符窜格式Mp[ 日期 ]=Mp.日期.dt.strftime( %Y/%m/%d )# 日期格式的转换,此处不需要## Mp[ 日期 ]=_datetime(Mp.日期,format= %Y/%m/%d )# 查看数据列的格式dtypes# 类和函数定义:import datetimeclass date:# initialisation method with internal data 初始化def _init_(self,time):=time def status(self):t0=datetime.datetime.strptime(, %Y/%m/%d ) t1=datetime.datetime.strptime(, %Y/%m/%d )(days=1)t2=datetime.datetime.strptime(, %Y/%m/%d )(days=2)t=datetime.datetime.strptime(, %Y/%m/%d )(days=)t4=datetime.datetime.strptime(, %Y/%m/%d )(days=4)t5=datetime.datetime.strptime(, %Y/%m/%d )(days=6)t6=datetime.datetime.strptime(, %Y/%m/%d )(days=7)t7=datetime.datetime.strptime(, %Y/%m/%d )(days=1)t8=datetime.datetime.strptime(, %Y/%m/%d )(days=14)t9=datetime.datetime.strptime(, %Y/%m/%d )(days=0)# data[(data.date>=dt1)&(data.date<=dt2)]t1=t1.strftime( %Y/%m/%d ) # 将日期格式转化为需要的字符串格式t0=t0.strftime( %Y/%m/%d ) t2=t2.strftime( %Y/%m/%d ) t=t.strftime( %Y/%m/%d ) t4=t4.strftime( %Y/%m/%d ) t5=t5.strftime( %Y/%m/%d ) t6=t6.strftime( %Y/%m/%d )t7=t7.strftime( %Y/%m/%d ) t8=t8.strftime( %Y/%m/%d )t9=t9.strftime( %Y/%m/%d ) Mp.iloc[i,1]=data2[data2.日期==t0][ 销售机会数 ].sum()Mp.iloc[i,2]=data2[data2.日期==t1][ 销售机会数 ].sum()Mp.iloc[i,]=data2[data2.日期==t2][ 销售机会数 ].sum()Mp.iloc[i,4]=data2[data2.日期==t][ 销售机会数 ].sum()Mp.iloc[i,5]=data2[(data2.日期>=t5)&(data2.日期<=t4)][ 销售机会数 ].sum()Mp.iloc[i,6]=data2[(data2.日期>=t7)&(data2.日期<=t6)][ 销售机会数 ].sum()Mp.iloc[i,7]=data2[(data2.日期>=t9)&(data2.日期<=t8)][ 销售机会数 ].sum()Mp.iloc[i,8]=data2[data2.日期<t9][ 销售机会数 ].sum()passpassI=range(Mp.index.size)for i in I:dt=date()# 逐个数据取对数 dt._init_(Mp.iloc[i,0])dt.status() # 调用类的函数# 匹配虚拟变量
# 初始化:Mp=Mp[[ 日期 , 当天机会 , 1天机会 , 2天机会 , 天机会 , 4-6天机会 , 7-1天机会 , 14-0天机会 , 0以上机会 ]]
# 字段和索引列匹配
# 索引转化为字段DaggResult=DaggResult.reset_index()DaggResult[ 日期 ]= _datetime(DaggResult[ 日期 ],format= %Y/%m/%d )# 转化为字符窜格式DaggResult[ 日期 ]=DaggResult.日期.dt.strftime( %Y/%m/%d )Mp=(Mp,DaggResult,left_on= 日期 ,right_on= 日期 ,how= left )# 日期、星期去重dumies=data[[ 日期 , 星期 ]].drop_duplicates()dumies[ 日期 ]= _datetime(dumies[ 日期 ],format= %Y/%m/%d )# 转化为字符窜格式dumies[ 日期 ]=dumies.日期.dt.strftime( %Y/%m/%d )Mp=(Mp,dumies,left_on= 日期 ,right_on= 日期 ,how= left )Mp[ Map ].fillna( 1 ,inplace=True)# 拼接列司龄数据Mp=(Mp,ptresult2,left_on= 日期 ,right_on= 日期 ,how= left )# 无法进行大小比较的指标进行虚拟变量的转化和新增 Mp.dtypesMp=pandas.get_dummies(Mp,columns=[ 星期 ],prefix=[ 星期 ],prefix_sep=_,dummy_na=False,drop_first=False)Mp=Mp[[ 日期 , 当天机会 , 1天机会 , 2天机会 , 天机会 , 4-6天机会 , 7-1天机会 , 14-0天机会 , 0以上机会 , Map , 星期_周1 , 星期_周2 , 星期_周 , 星期_周4 , 星期_周5 , 星期_周6 , 星期_周7 , 1-个月 , -6个月 , 6-12个月 , 一个月以内 , 一年以上 , 未知 ]]Mp[[ 当天机会 , 1天机会 , 2天机会 , 天机会 , 4-6天机会 , 7-1天机会 , 14-0天机会 , 0以上机会 , Map , 星期_周1 , 星期_周2 , 星期_周 , 星期_周4 , 星期_周5 , 星期_周6 , 星期_周7 , 1-个月 , -6个月 , 6-12个月 , 一个月以内 , 一年以上 , 未知 ]]=Mp[[ 当天机会 , 1天机会 , 2天机会 , 天机会 , 4-6天机会 , 7-1天机会 , 14-0天机会 , 0以上机会 , Map , 星期_周1 , 星期_周2 , 星期_周 , 星期_周4 , 星期_周5 , 星期_周6 , 星期_周7 , 1-个月 , -6个月 , 6-12个月 , 一个月以内 , 一年以上 , 未知 ]].astype( float )# 5、真实成单拼接
# 序列转化时间格式DataAgg[ 日期 ]= _datetime(DataAgg[ 日期 ],format= %Y/%m/%d )# 转化为字符窜格式DataAgg[ 日期 ]=DataAgg.日期.dt.strftime( %Y/%m/%d )true=DataAgg.groupby(by=[ 日期 ])[ 报名人数 ].agg({ 报名数 : numpy.sum})CDAgg=(Mp,true,left_on= 日期 ,right_index=True,how= left )# 6、利用均值原理计算预估成单#### 按照均值计算得到的预测值CDAgg[ 成单预估 ]=numpy.dot(CDAgg[[ 当天机会 , 1天机会 , 2天机会 , 天机会 , 4-6天机会 , 7-1天机会 , 14-0天机会 , 0以上机会 ]],DataAggResult[ 平均销转 ])# 预测特征值feature=[ 当天机会 , 1天机会 , 2天机会 , 天机会 , 4-6天机会 , 7-1天机会 , 14-0天机会 , 0以上机会 , Map , 星期_周1 , 星期_周2 , 星期_周 , 星期_周4 , 星期_周5 , 星期_周6 , 星期_周7 , 1-个月 , -6个月 , 6-12个月 , 一个月以内 , 一年以上 , 未知 ]# 7、MLP简单神经网络计算()#替换空值为0,替换需要进行赋值CDAgg=CDAgg.fillna(0)CDAgg[ 报名数 ]=CDAgg[ 报名数 ].astype( int ) # 需要符合当前的数据类型# CDAgg.dropna() CDAgg.dtypes Eplore=CDAgg.describe()# 选择要训练的数据 _train=CDAgg[CDAgg.日期< 2018/11/0 ]inputData = CDAgg_train[feature]outputData=CDAgg_train[ 报名数 ]# 8、Sequential 神经网络
# 数据准备 data_train.dtypesfeature2=[ 当天机会 , 1天机会 , 2天机会 , 天机会 , 4-6天机会 , 7-1天机会 , 14-0天机会 , 0以上机会 , Map , 星期_周1 , 星期_周2 , 星期_周 , 星期_周4 , 星期_周5 , 星期_周6 , 星期_周7 , 1-个月 , -6个月 , 6-12个月 , 一个月以内 , 一年以上 , 未知 , 报名数 ]data_train=CDAgg[CDAgg.日期<= 2018/11/0 ]data__train=data_train[feature2]data_mean=data_()data_std=data_train.std()data_train=(data_train-data_mean)/data_std # 数据标准化x_train=data_train[feature].as_matrix() #特征数据y_train=data_train[ 报名数 ].as_matrix() # 标签数据# 导入keras方法和tensorflow方法from import Sequential
from keras. import Dense,Dropout, Activationmodel=Sequential() # 建立模型model.add(Dense(22,activation= relu ,input_dim=22)) # 维度为8,输入层8 ,特征输的维度### model.add(Activation( relu )) # 过拟合现象
model.add(Dense(22,activation= relu ))
# 用rule函数作为激活函数,能够大幅提供准确度
model.add(Dense(11,activation= relu ))
model.add(Dropout(0.5))
model.add(Dense(1)) # 维度为1 输出层1,标签值的维度modelpile(loss= mean_squared_error ,optimizer= adam ) # 编译模型model.fit(x_train,y_train,nb_epoch=100,batch_size=20) #训练模型,学习一万五千次 batch 指梯度下降model.save_weights( D:\\DATA\\pycase\\number2\\project\\pretice\\ ) # 保存模型参数# 预测,并还原结果x=((CDAgg[feature]-data_mean[feature])/data_std[feature]).as_matrix()# CDAgg[ y_pred2 ]=model.predict(x)*data_std.loc[ 报名数 ]data_mean.loc[ 报名数 ] # 和下边效果一致CDAgg[ y_pred1 ]=model.predict(x)*data_std[ 报名数 ]data_mean[ 报名数 ]CDAgg[ y_pred1 ]=CDAgg[ y_pred1 ].round()_csv( D:\\DATA\\pycase\\number2\\project\\ ,index=False,encoding= utf_8_sig )
Sequential 顺序模型,它由多个网络层线性堆叠,对于更复杂的结构,应该用Keras函数式API,允许构建任意的神经网络图简单的使用.add()来堆叠模型:
model.add(Dense(22,activation= relu ,input_dim=22)) 参数分别表示:22个隐藏层,激活函数为rule 22维度特征pile 配置学习过程 # 8、线性回归预估from sklearn.linear_model import LinearRegression
#建模
lrModel = LinearRegression()
#训练模型y=CDAgg[ 报名数 ]lrModel.fit(x_train, y_train)
#评分
lrModel.score(x_train, y_train)
#预测
CDAgg[ y_linear ]=lrModel.predict(x)*data_std[ 报名数 ]data_mean[ 报名数 ]#查看参数
a=_#查看截距
b=lrModel.intercept_#(2)套索回归Lassorfrom sklearn.linear_model import Lassoclf=Lasso(alpha=0.0001)clf.fit(x_train, y_train)
#评分
clf.score(x_train, y_train)
#预测
CDAgg[ y_Lassor ]=clf.predict(x)*data_std[ 报名数 ]data_mean[ 报名数 ]#查看参数
a1=_ .html#lars-lasso套索回归是最小角度回归。
是使用LARS算法实现的套索模型,与基于coordinate_descent的实现不同,这产生精确解,其是作为其系数范数的函数的分段线性。 #() 贝叶斯岭回归from sklearn import linear_modelclf2=linear_model.BayesianRidge()clf2.fit(x_train, y_train)
#评分
clf2.score(x_train, y_train) # 返回预测的确定系数R平方
#预测
CDAgg[ y_Bayes ]=clf2.predict(x)*data_std[ 报名数 ]data_mean[ 报名数 ]#查看参数
a2=_
.linear_model.BayesianRidge.html#sklearn.linear_model.BayesianRidge拟合贝叶斯脊模型并优化正则化参数lambda(权重的精度)和alpha(噪声的精度,默认)贝叶斯回归技术可用于在估计过程中包括正则化参数 # (4) 核岭回归 from sklearn.kernel_ridge import KernelRidgeclf=KernelRidge(alpha=0.01) #α的小正值可改善问题的条件并减少估计的方差clf.fit(x_train, y_train)
#评分
clf.score(x_train, y_train)#预测CDAgg[ y_Kern ]=clf.predict(x)*data_std[ 报名数 ]data_mean[ 报名数 ]
.kernel_ridge.KernelRidge.html#sklearn.kernel_ridge.KernelRidge.set_params核岭回归(KRR)[M2012]将岭回归 (线性最小二乘与l2范数正则化)与核技巧相结合。
因此,它学习由各个内核和数据引起的空间中的线性函数。对于非线性内核,这对应于原始空间中的非线性函数。 #9、 画出预测结果图import matplotlibimport matplotlib.pyplot as plt # 设置坐标格式maincolor=(255/255,1/255,1/255,1) # 红 原数据maincolor2=(20/255,1/255,255/255,1) # 蓝 神经网络预测maincolor=(1/255,255/255,1/255,1) # 绿 平均成单预估maincolor4=(1/255,1/255,1/255,1) # 黑 线性回归font={ size :15, family : SimHei }matplotlib.rc( font ,**font)# 设置坐标轴标签和样式plt.xlabel( 日期 ,color=maincolor)plt.ylabel( 报名数 ,color=maincolor)_params(axis= both ,color=maincolor)# - 顺滑曲线# %matplotlib qt 弹窗plt.plot(CDAgg[ 日期 ],CDAgg[ 报名数 ], - ,color=maincolor)( 报名数 )plt.showplt.plot(CDAgg[ 日期 ],CDAgg[ y_pred1 ], - ,color=maincolor2)( y_pred1 )plt.plot(CDAgg[ 日期 ],CDAgg[ 成单预估 ], - ,color=maincolor)( 成单预估 )plt.plot(CDAgg[ 日期 ],CDAgg[ 报名数 ], - ,color=maincolor)( 报名数 )plt.showplt.plot(CDAgg[ 日期 ],CDAgg[ y_linear ], - ,color=maincolor4)( y_linear )
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2024-02-05 13:16:01
推荐阅读
留言与评论(共有 10 条评论) |
本站网友 巴豆霜 | 4分钟前 发表 |
14-0天机会 | |
本站网友 博兴租房 | 21分钟前 发表 |
255/255 | |
本站网友 火麻仁怎么吃 | 15分钟前 发表 |
input_dim=22)) 参数分别表示:22个隐藏层,激活函数为rule 22维度特征pile 配置学习过程 # 8 | |
本站网友 王春云 | 7分钟前 发表 |
1 | |
本站网友 南蛮 | 22分钟前 发表 |
bins | |
本站网友 甘露消毒丹 | 7分钟前 发表 |
报名人数 ] | |
本站网友 乌市房价 | 27分钟前 发表 |
activation= relu | |
本站网友 圈梁钢筋 | 29分钟前 发表 |
1]=data2[data2.日期==t0][ 销售机会数 ].sum()Mp.iloc[i | |
本站网友 施大壮 | 11分钟前 发表 |
right_index=True |