營銷響應預測分析----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主要是將一系列固定的數據建模過程封裝在一起,減少代碼的重複運用,減少工作量;

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