Advertisement

基于点击率预估的推荐

阅读量:

1.传统算法不能真正应用到生产系统

2.推荐场景数据是海量的,数据是稀疏的,要求是实时性是秒级****

3.推荐系统的核心是“数据召回”和“模型排序”

****4.GBDT和LR融合是点击率预估模型的核心算法,也被应用到推荐中 5.GBDT+LR的核心是将GBDT每棵树的决策路径直接作为LR的输入特征使用

推荐算法我们基本入门了,我们已经更新了传统的推荐算法

推荐算法起步:协同过滤

用python实现【UserCF】算法

用python实现【ItemCF】算法

推荐算法之隐语义模型

基于标签的推荐

基于上下文的推荐

推荐系统的冷启动与效果评估

这些算法不能真正应用到生产系统中,因为实际中遇到的数据是海量的 ,随着衍生的是数据的稀疏性 ,这给构建相似度矩阵带来巨大的消耗同时,很难构建最近邻的用户集。而且推荐系统还有一个实时性 的要求,能够在秒级之内响应用户的行为。

推荐核心

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

传统算法可以在数据召回中起到关键作用,比如:

  • 相似召回 :可以通过协同过滤算法召回部分商品

  • 标签召回 :可以将标签作为媒介召回商品

  • 关联规则 :通过Apriori算法等挖掘频繁集合

  • 热门数据 :可以通过上下文分析(地域和热度分析等)召回部分商品

通常情况,召回的物品通过数据分析和算法处理,给用户推荐真正感兴趣的商品。点击率预估(CTR)首先被运用到广告推荐上,它计算用户点击广告的可能性;而在推荐系统中,推荐商品也被预测用户的兴趣度。而点击率预估最经典的算法是梯度提升树(GBDT)逻辑回归(LR) 的融合。这个算法的核心是将GBDT每棵树的路径直接作为LR的输入特征使用 。也就是GBDT的输出结果作为新数据集训练LR模型,最终得到预测的概率值。

关于GBDT和LR算法的具体细节,以及GBDT如何生成新特征的,小编在机器学习篇已经花费了很长的功夫介绍,这里不再赘述。本文我们就介绍这个算法案例运用。

传送门:

决策树之原理与调参

决策树sklearn包细节讲解

集成学习(三)

集成学习(四)

集成学习(五)

集成学习(六)

从【为什么要用sigmoid函数】到真的懂【逻辑回归】

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)

看看最后训练集和测试集的精准度:

全部评论 (0)

还没有任何评论哟~