营销响应预测分析----python数据分析与数据化运营

本文基于python数据分析与数据化运营-第五章学习笔记,数据与大部分代码均来源数据该书;

案例背景:会员部门在做会员营销时,希望能通过数据预测在下一次营销活动时,响应活动会员的具体名单和响应概率,以此制定针对性的营销策略

案例数据介绍:特征变量数113;变量包含:age,total_pageviews,edu_ages,edu,user_level,industry,value_level,act_level,sex,blue_money,red_money,work_hours,region,label_1到label_100;

#随机森林:1、样本随机,特征随机,参数随机,模型随机(ID3 ,C4.5)
#极度随机森林:特征随机,参数随机,模型随机(ID3 ,C4.5),分裂随机
#线性判别分析:LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的,这点和PCA不同。PCA是不考虑样本类别输出的无监督降维技术。LDA的思想可以用一句话概括,就是“投影后类内方差最小,类间方差最大”,

import time
import numpy as np
import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.ensemble import RandomForestClassifier,ExtraTreesClassifier
from sklearn.feature_selection import RFE
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.pipeline import Pipeline,FeatureUnion
from sklearn.metrics import f1_score,accuracy_score,precision_score
#from imblearn.over_sampling import SMOTE
#读取数据
raw_data = pd.read_excel(r"D:\data_analysis_and_data_operation_with_python\python_book_v2\chapter5\order.xlsx")
#查看缺失值总个数    
#raw_data.isnull()返回一个有True,False组成的dataFrame
#raw_data.isnull().any(axis=0)返回类似于字典的数据,当axis=0,是数据key为column_name,axis=1时,key为index
#返回每列有多少个缺失值得列表
def get_null_count(raw_data):
    columns_isnull = raw_data.isnull().any(axis=0)
    columns_isnull_count = []
    for name in list(raw_data.columns):
        if columns_isnull[name]==True:
            columns_isnull_count.append([name,sum(list(raw_data.isnull()[name]))])
    return columns_isnull_count
#共有10个缺失值,可直接删除
columns_isnull_count = get_null_count(raw_data)
data_dropna = raw_data.dropna()
#分割特征和目标
num = int(data_dropna.shape[0]*0.7)
X,y = data_dropna.drop("response", axis=1), data_dropna["response"]
X_train,X_test = X.iloc[:num,:],X.iloc[num:,:]
y_train,y_test = y.iloc[:num],y.iloc[num:]

#模型训练,建立pipeline中用到的模型对象
model_etc = ExtraTreesClassifier()  #ExtraTree,用于EFE的模型对象
model_rfe = RFE(model_etc)          #使用RFE方法提取重要特征
model_lda = LinearDiscriminantAnalysis()
model_rf = RandomForestClassifier() #分类对象
#建立Pipeline对象
#Pipeline(steps)
pipelines = Pipeline([
    ('feature_union', FeatureUnion(n_jobs=-1,  # 组合特征pipeline
        transformer_list=[
            ('model_rfe', model_rfe),  # 通过RFE中提取特征
            ('model_lda', model_lda),  # 通过LDA提取特征
        ],
        transformer_weights={  # 建立不同特征模型的权重
            'model_rfe': 1,  # RFE模型权重
            'model_lda': 0.8,  # LDA模型权重
        },
    )),
    ('model_rf', model_rf),  # rf模型对象
])
#设置pipe参数,部分确定的参数可以在建立模型的时候就进行创建
pipelines.set_params(feature_union__model_rfe__estimator__n_estimators=20)
pipelines.set_params(feature_union__model_rfe__estimator__n_jobs=-1)
pipelines.set_params(feature_union__model_rfe__n_features_to_select=20)
pipelines.set_params(feature_union__model_lda__n_components=1)
pipelines.set_params(feature_union__n_jobs=-1)
#pipeline 交叉检验
cv = StratifiedKFold(3)
score_list = []
time_list = []
n_estimators=[10,50,100]
for parameter in n_estimators:
    t1 = time.time()
    print("set parameters: %s" % parameter)
    pipelines.set_params(model_rf__n_estimators=parameter)
    score_tmp = cross_val_score(pipelines,X_train,y_train,scoring="accuracy",cv=cv,n_jobs=-1)
    time_list.append(time.time()-t1)
    score_list.append(score_tmp)
#将模型花费时间,评分汇总成dataframe    
time_pd = pd.DataFrame.from_dict({"n_estimators":n_estimators,"time":time_list})
score_pd = pd.DataFrame(score_list,columns=["".join(["score",str(i+1)]) for i in range(len(score_list))])
pd_merge = pd.concat((time_pd,score_pd),axis=1)
pd_merge["score_mean"] = pd_merge.iloc[:,2:-1].mean(axis=1)
pd_merge["score_std"] = pd_merge.iloc[:,2:-2].std(axis=1)
pd_merge.to_excel(r"D:\data_analysis_and_data_operation_with_python\python_book_v2\chapter5\get_score.xlsx")
#score_mean得分越高,说明模型的预测越准,socre_std越小,说明模型结果越稳定,time越小,意味着耗时越短;
#实际上,n_estimators变化时,各指标变化不大,说明该参数对模型效果影响较小(在该案例下)
#使用最优参数进行训练
pipelines.set_params(model_rf__n_estimators=50)
pipelines.fit(X_train,y_train)
#测试模型
pre_test = pipelines.predict(X_test)
scores = [i(y_test,pre_test) for i in [f1_score,accuracy_score,precision_score]]
#预测新数据集
new_data = pd.read_excel(r"D:\data_analysis_and_data_operation_with_python\python_book_v2\chapter5\order.xlsx",sheet_name=1)
get_null_count(new_data)
new_data_dropna = new_data.dropna()
pre_labels = pd.DataFrame(pipelines.predict(new_data_dropna),columns=['labels'])
pre_pro = pd.DataFrame(pipelines.predict_proba(new_data_dropna),columns=["pro1","pro2"])
predict_pd = pd.concat((pre_labels,pre_pro),axis=1)

 实际应用:

1,可以制定了营销响应不低于80%的KPI作为本次活动的绩效考核目标

2,可以针对80%的基准线,结合历史数据算出相应订单金额,订单数量等数据,作为活动的预期收益,可以制定相应的ROI目标(不作为绩效考核目标)。

3,基于数据,向公司申请相应的优惠券;

其次可以讲模型部署到服务器上,供业务部门自行调用

总结:通过该案例了解pipeline应用,个人认为pipeline主要是将一系列固定的数据建模过程封装在一起,减少代码的重复运用,减少工作量;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章