基于点击率预估的推荐
1.传统算法不能真正应用到生产系统
2.推荐场景数据是海量的,数据是稀疏的,要求是实时性是秒级****
3.推荐系统的核心是“数据召回”和“模型排序”
****4.GBDT和LR融合是点击率预估模型的核心算法,也被应用到推荐中 5.GBDT+LR的核心是将GBDT每棵树的决策路径直接作为LR的输入特征使用
推荐算法我们基本入门了,我们已经更新了传统的推荐算法 :
这些算法不能真正应用到生产系统中,因为实际中遇到的数据是海量的 ,随着衍生的是数据的稀疏性 ,这给构建相似度矩阵带来巨大的消耗同时,很难构建最近邻的用户集。而且推荐系统还有一个实时性 的要求,能够在秒级之内响应用户的行为。

推荐核心

推荐算法的核心是**“数据召回”** 和**“模型排序”** ,它可以细分为四个步骤:

传统算法可以在数据召回中起到关键作用,比如:
-
相似召回 :可以通过协同过滤算法召回部分商品
-
标签召回 :可以将标签作为媒介召回商品
-
关联规则 :通过Apriori算法等挖掘频繁集合
-
热门数据 :可以通过上下文分析(地域和热度分析等)召回部分商品
通常情况,召回的物品通过数据分析和算法处理,给用户推荐真正感兴趣的商品。点击率预估(CTR)首先被运用到广告推荐上,它计算用户点击广告的可能性;而在推荐系统中,推荐商品也被预测用户的兴趣度。而点击率预估最经典的算法是梯度提升树(GBDT) 和逻辑回归(LR) 的融合。这个算法的核心是将GBDT每棵树的路径直接作为LR的输入特征使用 。也就是GBDT的输出结果作为新数据集训练LR模型,最终得到预测的概率值。
关于GBDT和LR算法的具体细节,以及GBDT如何生成新特征的,小编在机器学习篇已经花费了很长的功夫介绍,这里不再赘述。本文我们就介绍这个算法案例运用。
传送门:
GBDT+LR

案例是Kaggle比赛的电信客户流失数据(Telco Customer Churn),首先,导入数据集,查看基本数据规模:
data = pd.read_csv(r'Telco_Customer_Churn.csv')
data.info()
data.shape

1.数据集一共21个维度,7043个样本,其中,customerID是客户id,最后一列Churn为标签:Yes表示流失,No表示非流失
2.其他19列是用户相关特征,其中,有4个是数值型特征,15个是离散型特征
接着,简单分析一下维度变量:


然后,做一些数据处理 ,主要有:
-
数值型不进行转换
-
TotalCharges有少许缺失,用0填充
-
离散型特征映射为0,1,2...
代码如下:
data['TotalCharges'] = data['TotalCharges'].fillna(0)
#标签编码
for f in discrete_feature.columns:
data[f] = pd.factorize(data[f])[0]
进行数据集划分:
from sklearn.model_selection import train_test_split
X = data.drop(['customerID','Churn'],axis=1)
y = data['Churn'].replace({'No':0,'Yes':1})
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0)
模型训练走起,先导入相关sklearn包:
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import os
import pydotplus
from sklearn import tree
from IPython.display import Image
#把graphviz安装包添加到环境变量中,GraphViz安装包下载地址https://graphviz.gitlab.io/_pages/Download/Download_windows.html
os.environ["PATH"] += os.pathsep + r'F:\决策树可视化\graphviz-2.38\release\bin'
这里只为了展示GBDT构造新特征以及与LR的融合,就不进行参数调节。为了方便展示,GBDT评估器设置为2,最大深度也为2.
f_name = [i for i in X.columns]
gbdt = GradientBoostingClassifier(n_estimators=2,max_depth=2)
gbdt.fit(X_train,y_train)
查看训练出的两颗评估器:
clf = gbdt.estimators_[0][0] #第一棵树,第二改索引即可
dot_data = tree.export_graphviz(clf, out_file=None,feature_names=f_name,filled=True, rounded=True,
special_characters=True,proportion=False,rotate=False,precision=2)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())


可见,两颗子树的叶子结点索引均是2,3,5,6.查看每个样本落入每棵树的叶子节点:
new_feature = pd.DataFrame(gbdt.apply(X_train).reshape(-1,2),columns=['tree1','tree2'])
new_feature.head()

开始构造新特征,进行独热编码转换:
new_feature = pd.get_dummies(new_feature,prefix='clf',columns=new_feature.columns) #独热编码
new_feature.head()

这个就是GBDT构造的新特征。
然后加入跟原数据集训练LR模型:
X_train = pd.concat([X_train.reset_index(drop=True),new_feature],axis=1)
model = LogisticRegression(solver='liblinear')
model.fit(X_train,y_train)
看看最后训练集和测试集的精准度:


