您现在的位置是:首页 > 数码 > 

7、python多种方式进行成单回归预测

2025-07-26 23:38:02
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组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/845696.html

相关标签:无
上传时间: 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