天猫复购预测训练赛技术报告
天貓復購預測賽技術報告
小組成員:李xx、姚xx、黃xx、劉xxgithub地址:https://github.com/2017403603/Data_mining
一、問題描述
1.1 問題背景
? 商家有時會在特定日期,例如Boxing-day,黑色星期五或是雙十一(11月11日)開展大型促銷活動或者發放優惠券以吸引消費者,然而很多被吸引來的買家都是一次性消費者,這些促銷活動可能對銷售業績的增長并沒有長遠幫助,因此為解決這個問題,商家需要識別出哪類消費者可以轉化為重復購買者。通過對這些潛在的忠誠客戶進行定位,商家可以大大降低促銷成本,提高投資回報率。
1.2 數據描述
? 現在給定四個數據文件,分別為訓練數據,測試數據,用戶畫像以及用戶歷史記錄。訓練數據提供緯度為用戶、商家,以及該用戶是否為該商家的重復購買者(即label)。用戶畫像數據集提供對應用戶id的年齡和性別信息;用戶歷史記錄提供用戶過去六個月在不同店鋪的多種活躍狀態以及點擊時間等;測試數據集為用戶和商家的組合,用以預測該用戶是否為該商家的重復購買者。
1.3 問題描述
? 根據給定的四個數據形式,在測試數據中給定了用戶id和商家id的組合,需要預測該名用戶在對應商家的重復購買概率值。
二、數據探索
2.1 加載數據集
train_data = pd.read_csv("../DataMining/data_format1/train_format1.csv") test_data = pd.read_csv("../DataMining/data_format1/test_format1.csv") user_info = pd.read_csv("../DataMining/data_format1/user_info_format1.csv") user_log = pd.read_csv("../DataMining/data_format1/user_log_format1.csv")2.2 查看用戶畫像中年齡和性別缺失率
(user_info.shape[0] - user_info["age_range"].count())/user_info.shape[0] (user_info.shape[0] - user_info["gender"].count()) / user_info.shape[0]? 其中年齡缺失率為0.52%,性別缺失率為1.5%。缺失比率較小,因此其對最終的分類結果影響較小。后面將直接將NaN(由-1代替)當作特征輸入進模型進行訓練和學習
2.3 查看用戶信息數據的缺失—用戶行為日志數據缺失
user_log.isna().sum()? 用戶行為日志主要缺失特征為購買品牌的缺失,其他特征均無缺失。
2.4 查看用戶畫像和歷史記錄基本數據描述
user_info.describe()? 用戶畫像的基本數據分析顯示用戶的平均年齡在30歲左右,且方差較大。且購買者的性別主要為女性。
user_log.describe()2.5 查看樣本label比例
? 樣本不均衡,非重復購買者比例遠遠大于重復購買者,因此需要采取一定措施解決此類樣本不平衡問題
2.6 對top 5店鋪進行畫圖分析
train_data.merchant_id.value_counts().head(5) train_data_merchant["TOP5"]=train_data_merchant["merchant_id"].map(lambda x: 1 if x in[4044,3828,4173,1102,4976] else 0) train_data_merchant=train_data_merchant[train_data_merchant["TOP5"]==1] plt.figure(figsize=(8,6)) plt.title("Merchant VS Label")sax=sns.countplot("merchant_id",hue="label",data=train_data_merchant)? 采用分布直方圖對前五名店鋪進行比例分析,可得前五名店鋪占據了接近一半的數據量,且重復購買的比例都遠遠小于非重復購買
2.7 對商家的重復購買比例進行繪圖分析
train_data.groupby(["merchant_id"])["label"].mean() merchant_repeat_buy=[rate for rate in train_data.groupby(["merchant_id"])["label"].mean() if rate<=1 and rate > 0] plt.figure(figsize=(8,4)) ax=plt.subplot(1,2,1) sns.distplot(merchant_repeat_buy,fit=stats.norm) ax=plt.subplot(1,2,2) res=stats.probplot(merchant_repeat_buy,plot=plt)? 由于數據的特征維度并不具有連續性,無法使用插值法進行填補,并且空缺比率較小,因此我們直接將空缺數據視為一個特征,用-1填補并代表此類特征
三、特征工程
3.1 數據集合并
將訓練集df_train和用戶基本信息user_info_format.csv合并得到df_train,合并依據是用戶user_id。
df_train = pd.merge(df_train,user_info,on="user_id",how="left")將df_train和用戶行為日志user_log_format1.csv合并得到新的df_train,合并依據是用戶user_id和商家merchant_id。
df_train = pd.merge(df_train,total_logs_temp,on=["user_id","merchant_id"],how="left")3.2 特征生成
通過簡單合并生成特征
- 每個用戶在每個商家交互過的商品總和(不分種類)。total_item_id
- 每個用戶在每個商家交互過的商品種類總和。unique_item_id
- 每個用戶在每個商家交互過的商品所屬品類總和total_cat_id
- 每個用戶在每個商家交互過的天數總和。total_time_temp
- 每個用戶在每個商家點擊次數總和。clicks
- 每個用戶在每個商家加入購物車次數總和。shopping_cart
- 每個用戶在每個商家購買商品次數總和。purchases
- 每個用戶在每個商家收藏商品次數總和。favourites
通過分析生成特征
-
用戶每月使用次數
month_temp=user_log.groupby(['user_id','month']).size().reset_index().rename(columns={0:'cnt'}) month_temp=pd.get_dummies(month_temp, columns=['month'],prefix='user_mcnt') for i in range(5,12):month_temp['user_mcnt_'+str(i)]=month_temp['cnt']*month_temp['user_mcnt_'+str(i)]month_temp=month_temp.groupby(['user_id']).sum().drop(['cnt'],axis=1).reset_index()? 意義:用戶每月使用天貓的次數可以反映用戶行為在時間上的特征,用戶在一年中不同的月份的消費表現可能不同,例如在年尾,春節,“雙十一”等期間可能消費水平高一些,在夏冬兩季的消費水平可能會低一些,通過統計每月使用次數可以有效反映出這些特征。
-
商家的特征
temp = groups.size().reset_index().rename(columns={0:'merchantf1'}) matrix = matrix.merge(temp, on='merchant_id', how='left') temp = groups['user_id', 'item_id', 'cat_id', 'brand_id'].nunique().reset_index().rename(columns={'user_id':'merchantf2', 'item_id':'merchantf3', 'cat_id':'merchantf4', 'brand_id':'merchantf5'}) matrix = matrix.merge(temp, on='merchant_id', how='left') temp = groups['action_type'].value_counts().unstack().reset_index().rename(columns={0:'merchantf6', 1:'merchantf7', 2:'merchantf8', 3:'merchantf9'}) matrix = matrix.merge(temp, on='merchant_id', how='left')? 商家售出的某個商品、品牌的數量,能夠反映某些商品或者品牌的受歡迎程度,一定程度上也可以導致顧客回購率。
-
商家與用戶的綜合特征
matrix['ratiof1'] = matrix['userf9']/matrix['userf7'] # 用戶購買點擊比matrix['ratiof2'] = matrix['merchantf8']/matrix['merchantf6'] # 商家購買點擊比? 用戶點擊或者該商家被點擊最終轉化為顧客購買的比率能夠很好的反映物品的受歡迎程度
四、候選模型簡介
五、候選模型預測對比
5.1 加載訓練數據和測試數據
#讀取數據 df_train = pd.read_csv(r'df_train.csv') #加載最終測試數據 test_data= pd.read_csv(r'test_data.csv') test_data5.2 建模前預處理數據集
#建模前預處理 y = df_train["label"] X = df_train.drop(["user_id", "merchant_id", "label"], axis=1) X.head(10) #分割數據 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=8)5.3 候選模型預測:邏輯回歸
#logistic回歸 Logit = LogisticRegression(solver='liblinear') Logit.fit(X_train, y_train) Predict = Logit.predict(X_test) Predict_proba = Logit.predict_proba(X_test) print(Predict.shape) print(Predict[0:20]) print(Predict_proba[:]) Score = accuracy_score(y_test, Predict) Score #邏輯回歸最終結果獲取 Logit_Ans_Predict_proba = Logit.predict_proba(test_data) df_test['prob']=Logit_Ans_Predict_proba[:,1] #最終答案保存 df_test.to_csv("Logit_Ans.csv",index=None)? 提交得到評分為:0.4564939
5.4 候選模型預測:決策樹
#決策樹 from sklearn.tree import DecisionTreeClassifier tree = DecisionTreeClassifier(max_depth=4,random_state=0) tree.fit(X_train, y_train) Predict_proba = tree.predict_proba(X_test) print(Predict_proba[:]) print("Accuracy on training set: {:.3f}".format(tree.score(X_train, y_train))) print("Accuracy on test set: {:.3f}".format(tree.score(X_test, y_test))) #決策樹最終結果獲取 Tree_Ans_Predict_proba = tree.predict_proba(test_data) df_test['prob']=Tree_Ans_Predict_proba[:,1] #最終答案保存 df_test.to_csv("Tree_Ans.csv",index=None)? 提交得到評分為:0.5833852
5.5 候選模型預測:隨機森林
#隨機森林 from sklearn.ensemble import RandomForestClassifier rfc = RandomForestClassifier(n_estimators=50,random_state=90,max_depth=5) rfc = rfc.fit(X_train, y_train) Predict_proba = rfc.predict_proba(X_test) print(Predict_proba[:]) print("Accuracy on training set: {:.3f}".format(rfc.score(X_train, y_train))) print("Accuracy on test set: {:.3f}".format(rfc.score(X_test, y_test))) #隨機森林最終結果獲取 RFC_Ans_Predict_proba = rfc.predict_proba(test_data) df_test['prob']=RFC_Ans_Predict_proba[:,1] #最終答案保存 df_test.to_csv("RFC_Ans.csv",index=None)? 提交得到評分為:0.6252815
5.6 候選模型預測:隨機森林調參
# 調參,繪制學習曲線來調參n_estimators(對隨機森林影響最大) score_lt = [] # 每隔10步建立一個隨機森林,獲得不同n_estimators的得分 for i in range(0,200,10):print("進度:",i)rfc = RandomForestClassifier(n_estimators=i+1,random_state=90,max_depth=8)rfc = rfc.fit(X_train, y_train)score = rfc.score(X_test, y_test)score_lt.append(score) score_max = max(score_lt) print('最大得分:{}'.format(score_max),'子樹數量為:{}'.format(score_lt.index(score_max)*10+1)) # 繪制學習曲線 x = np.arange(1,201,10) plt.subplot(111) plt.plot(x, score_lt, 'r-') plt.show()? 上圖中橫坐標為參數n_estimators的值,縱坐標為模型在測試集上的準確率,每迭代一次n_estimators增加10,畫出每次迭代準確率的折線圖,由圖可知當n_estimators=100時隨機森林模型的效果最好,經調參后提交得到評分為:0.6256826。
5.7 候選模型預測:XGboost
import xgboost as xgb def xgb_train(X_train, y_train, X_valid, y_valid, verbose=True):model_xgb = xgb.XGBClassifier(max_depth=10, # raw8n_estimators=1000,min_child_weight=300, colsample_bytree=0.8, subsample=0.8, eta=0.3, seed=42 )model_xgb.fit(X_train, y_train,eval_metric='auc',eval_set=[(X_train, y_train), (X_valid, y_valid)],verbose=verbose,early_stopping_rounds=10 # 早停法,如果auc在10epoch沒有進步就stop)print(model_xgb.best_score)print("Accuracy on training set: {:.3f}".format(model.score(X_train, y_train))) print("Accuracy on test set: {:.3f}".format(model.score(X_test, y_test)))return model_xgb #XGboost最終結果獲取 model_xgb = xgb_train(X_train, y_train, X_valid, y_valid, verbose=False) prob = model_xgb.predict_proba(test_data) submission['prob'] = pd.Series(prob[:,1]) submission.drop(['origin'], axis=1, inplace=True) submission.to_csv('submission_xgb.csv', index=False)? 提交得到評分為:0.6562986
六、最終成績及排名
小組成員:李xx、姚xx、黃xx、劉xx七、天貓復購預測總結
? 本次比賽最終成績和排名并不是很高,思考其原因主要還是在數據預處理和特征工程階段沒有做好,在數據集中,年齡和性別的缺失值差不多有九萬個,巨大的特征值數據缺失是預測準確率不高的主要原因之一,其次是特征工程,我們抽取特征的方法還是使用傳統的方法,相對比較簡單,這也是導致模型預測準確率不高的原因之一;在選用模型上我們使用了邏輯回歸、決策樹、隨機森林、Xgboost等熱門模型,訓練后這些模型在訓練集上的表現區別并不明顯,經比較Xgboost模型在測試集的效果最好,后期工作準備再重新做一下特征工程,在模型選取方面,計劃使用bagging集成多種分類算法的思想對模型進行改進,進一步提高預測準確率。
八、參考
[1] https://www.cnblogs.com/phyger/p/14188712.html
[2] https://blog.csdn.net/qq_34807908/article/details/81539536
[3] https://blog.csdn.net/lovenankai/article/details/99966142
[4] https://www.jianshu.com/p/d1f696266814
[5] http://cran.fhcrc.org/web/packages/xgboost/vignettes/xgboost.pdf
總結
以上是生活随笔為你收集整理的天猫复购预测训练赛技术报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用户账号管理、NTFS权限管理、磁盘及文
- 下一篇: 用WinHex查看SD卡FAT32文件系