查看原文
其他

如何使用Adaboost预测下一次营销活动的效果

沐紫de学习日志 大邓和他的Python 2022-07-09

内容编辑:  沐紫 公众号:  沐紫de学习日志

西安交通大学工商管理硕士在读,我会分享自己读研期间的习得及资料,包括Python、SPSS、Stata、雅思、论文基础理论与写作技巧,管理学案例··· 出处:  https://github.com/weizhuang1113/MarketingCampaignResponse_Prediction

首先Adaboost的基本原理是采用迭代的思想,每次迭代只训练一个弱分类器,训练好的弱分类器将参与下一次迭代的使用。也就是说,在第N次迭代中,一共就有N个弱分类器,其中N-1个是以前训练好的,其各种参数都不再改变,本次训练第N个分类器。其中弱分类器的关系是第N个弱分类器更可能分对前N-1个弱分类器没分对的数据,最终分类输出要看这N个分类器的综合效果。具体流程见下图:


我们都知道,企业往往会参考以往营销活动的经验对现有客户进行针对性地营销活动。我们可以利用Adaboost,在之前营销活动数据的基础上,得到此次营销活动将参与的会员客户名单及其参与意愿,制定针对性的营销策略,实现以有限的成本提高营销活动的效果。

数据内容

训练数据:3999条;测试数据:8843条

数据加载

  1. import numpy as np

  2. import pandas as pd

  3. from sklearn.preprocessing importOneHotEncoder

  4. from sklearn.model_selection importStratifiedKFold, cross_val_score

  5. from sklearn.feature_selection importSelectPercentile, f_classif

  6. from sklearn.ensemble importAdaBoostClassifier

  7. from sklearn.pipeline importPipeline

  8. from sklearn.metrics import accuracy_score

  9. import warnings

  10. warnings.filterwarnings("ignore")

  1. train = pd.read_excel('order.xlsx', sheetname=0)

  2. test = pd.read_excel('order.xlsx', sheetname=1)

  1. train.head()

开头部分

train.tail()

结尾部分

  1. train.describe()

对数据进行描述统计


数据预处理

去重


  1. train.drop_duplicates(inplace=True)


缺失值处理

找出缺失值,用平均数、中位数填补。
  1. train.isnull().sum().sort_values(ascending=False)

  2. test.isnull().sum().sort_values(ascending=False)

  1. def na_replace(df):

  2. na_rules = {'age': df['age'].mean(),

  3. 'total_pageviews': df['total_pageviews'].mean(),

  4. 'edu': df['edu'].median(),

  5. 'edu_ages': df['edu_ages'].median(),

  6. 'user_level': df['user_level'].median(),

  7. 'industry': df['user_level'].median(),

  8. 'act_level': df['act_level'].median(),

  9. 'sex': df['sex'].median(),

  10. 'red_money': df['red_money'].mean(),

  11. 'region': df['region'].median()

  12. }

  13. df = df.fillna(na_rules)

  14. return df

  1. train = na_replace(train)

  2. test = na_replace(test)

独热编码

  1. def symbol_con(df, enc_object=None, train=True):

  2. convert_cols = ['edu', 'user_level', 'industry', 'value_level', 'act_level', 'sex', 'region']

  3. df_con = df[convert_cols]

  4. df_org = df[['age', 'total_pageviews', 'edu_ages', 'blue_money', 'red_money', 'work_hours']].values

  5. if train == True:

  6. enc = OneHotEncoder()

  7. enc.fit(df_con)

  8. df_con_new = enc.transform(df_con).toarray()

  9. new_matrix = np.hstack((df_con_new, df_org))

  10. return new_matrix, enc

  11. else:

  12. df_con_new = enc_object.transform(df_con).toarray()

  13. new_matrix = np.hstack((df_con_new, df_org))

  14. return new_matrix

  1. X_train, enc = symbol_con(train, enc_object=None, train=True)

  2. y_train = train['response']

  1. X_test = symbol_con(test, enc_object=enc, train=False)

  2. y_test = test['final_response']

建模

参数优化选择

  1. transform = SelectPercentile(f_classif, percentile=50)

  1. model_adaboost = AdaBoostClassifier()

  1. from sklearn.model_selection importGridSearchCV, cross_val_score, StratifiedKFold, learning_curve

  2. pipe=Pipeline([('select',transform),

  3. ('model_adaboost', model_adaboost)])


  4. param_test = {'model_adaboost__n_estimators':[20,50,100],

  5. 'model_adaboost__learning_rate':[0.5,1]

  6. }

  7. gsearch = GridSearchCV(estimator = pipe, param_grid = param_test, scoring='accuracy', cv=5)

  8. gsearch.fit(X_train,y_train)


  9. print(gsearch.grid_scores_)

  10. print('-'*30)

  11. print(gsearch.best_params_, gsearch.best_score_)

  1. transform.fit(X_train, y_train)

  2. reduce_X_train = transform.transform(X_train)

  3. final_model = AdaBoostClassifier(n_estimators=100)

  4. final_model.fit(reduce_X_train, y_train)

预测

  1. reduce_X_test = transform.transform(X_test)

  1. data = test.drop('final_response', axis=1)

  2. predict_labels = pd.DataFrame(final_model.predict(reduce_X_test), columns=['labels'])

  3. predict_proba = pd.DataFrame(final_model.predict_proba(reduce_X_test), columns=['noproba', 'yesproba'])

  4. predict_pd = pd.concat((data, predict_labels, predict_proba), axis=1)

  1. accuracy_score(y_test, predict_labels)


  1. predict_pd.to_excel('order_predict_result.xlsx', 'Sheet1')

总结与思考

  • 制定了营销响应率不低于80%的KPI作为本次营销活动的绩效考核目标。

  • 结合历史销售订单数据计算本次活动的预期收益,制定ROI目标。

  • 基于预期的订单金额和订单数量,以及关联的用券数量和金额,申请对应的营销资源用于促销用户购买转化。


近期文章

代码不到40行的超燃动态排序图

Python网络爬虫与文本数据分析

日期数据操作第1期 datetime库

日期数据操作第2期 pandas库

Python语法快速入门

Python爬虫快速入门

文本数据分析文章汇总(2016-至今)

当文本分析遇到乱码(ง'⌣')ง怎么办?

Loughran&McDonald金融文本情感分析库

使用分析师报告中含有的情感信息预测上市公司股价变动

当pandas遇上数据类型问题

如何理解pandas中的transform函数

计算社会经济学

一行pandas代码生成哑变量

Python最被低估的库,用好了效率提升10倍!


公众号后台回复关键词“20191126”,即可获得课件资源,请在如果觉得有用,欢迎转发支持~


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存