基于用户画像进行广告投放,是优化投放效果、实现精准营销的基础;而人口属性中的性别、年龄等标签,又是用户画像中的基础信息。那该如何尽量准确的为数据打上这些标签?
根据用户画像进行广告投进,是优化投进作用、完结精准营销的根底;而人口特点中的性别、年纪等标签,又是用户画像中的根底信息。那该怎么尽量精确的为数据打上这些标签?
这时分机器学习就派上用场了。本文将以性别标签为例,介绍人口特点标签猜测的机器学习模型构建与优化。
性别标签猜测流程
一般状况下,无监督学习不只很难学习到有用信息,并且关于学习到的作用较难评价。所以,假如能够,咱们会尽或许地把问题转化成有监督学习。
关于性别标签也是如此,咱们能够运用可信的性别样本数据,加上从TalkingData搜集的原始数据中提取出来的有用信息,将性别标签的出产使命转化成有监督机器学习使命。更具体来说,男/女别离作为1/0标签(Label,也便是常说的Y值,为了便利表达,咱们符号男/女别离为1/0标签),这样性别标签的使命就转化成了二分类使命。
性别标签的出产流程图如下:
- 简略来说,输入为具有可信性别信息的样本数据,以及从近期活泼的原始数据中提取出有用特征;
- 将两者join之后,得到能够直接用于建模的数据集;
- 根据该数据集进行建模,学习出性别猜测模型;
- 再用该模型对悉数样本进行猜测,然后得到一切样本的性别打分。至此,模型部分的作业基本完结;
- 终究一步是确认阈值,输出男/女标签。这儿咱们不依赖模型确认阈值,而是凭借比较可信的第三方东西,确保在期望精确度(precision)下,召回尽或许多的样本。
别的,面临TalkingData十几亿的数据体量,在标签出产的过程中,为了加快运算,除了必须用单机的状况下,咱们都会优先选用Spark分布式来加快运算。
特征与模型办法的版别迭代
为了优化模型的作用,咱们又对该性别标签猜测模型进行了屡次迭代。
01性别猜测模型V1
模型开始运用的特征包含4个维度:设备运用信息、嵌入SDK的运用包名、嵌入SDK的运用内自定义事情日志以及设备机型信息。
模型选用Xgboost(版别为0.5),根据每个维度的特征别离练习模型,得到4个子模型。每个子模型会输出根据该特征维度的设备男/女倾向的打分,分值区间从0到1,分值高代表设备为男性倾向,反之则为女人倾向。模型代码示例如下:
<左右滑动检查完好代码>
- importcom.talkingdata.utils.LibSVM
- importml.dmlc.xgboost4j.scala.DMatrix
- importml.dmlc.xgboost4j.scala.spark.XGBoost//version0.5
- //trainstage
- valtrainRDD=LibSVM.loadLibSVMFile(sc,trainPath)//sc为SparkContext
- valmodel=XGBoost.train(trainRDD,paramMap,numRound,nWorkers=workers)
- //predictstage
- valtestSet=LibSVM.loadLibSVMFilePred(sc,testPath,-1,sc.defaultMinPartitions)
- valpred=testSet.map(_._2).mapPartitions{iter=>
- model.value.predict(newDMatrix(iter)).map(_.head).toIterator
- }.zip(testSet).map{case(pred,(tdid,feauture))=>
- s"$tdid\t$pred"
- }
缺陷及优化方向:
- 模型为四个子模型的交融,结构较杂乱,运转功率较低,考虑改为运用单一模型;
- 嵌入SDK的运用内自定义事情日志特征覆盖率低,且ETL处理资源耗费大,需从头评价该字段对模型的奉献程度;
- 发现设备称号字段看上去有男/女区分度——部分用户群领会以姓名或许昵称命名设备名(例如带有“哥”“军”等字段的倾向为男性,带有“妹”“兰” 等字段的倾向为女人),验证作用并考虑是否参加该字段。
02性别猜测模型V2
对模型运用特征的4个维度进行了调整,改为:嵌入SDK的运用包名、嵌入SDK的运用AppKey、设备机型信息以及设备称号。
其间,对嵌入SDK的运用包名和设备称号做分词处理。再运用CountVectorizer将以上4类特征处理成稀少向量(Vector),一起用ChiSqSelector进行特征挑选。
模型选用LR(Logistic Regression),代码示例如下:
<左右滑动检查完好代码>
- importorg.apache.spark.ml.feature.VectorAssembler
- importorg.apache.spark.ml.PipelineModel
- importorg.apache.spark.ml.classification.LogisticRegression
- valtransformedDF=spark.read.parquet("/traindata/path")//分词、CountVectorizer、ChiSqSelector操作之后的特征,为vector列
- valfeatureCols=Array("packageName","appKey","model","deviceName")
- valvectorizer=newVectorAssembler().
- setInputCols(featureCols).
- setOutputCol("features")
- vallr=newLogisticRegression()
- valpipeline=newPipeline().setStages(Array(vectorizer,lr))
- valmodel=pipeline.fit(transformedDF)
- //predictstage
- valtransformedPredictionDF=spark.read.parquet("/predictData/path")//同train共同,为分词、CountVectorizer、ChiSqSelector处理之后的特征,为vector列
- valpredictions=model.transform(transformedPredictionDF)
长处及提高作用:
选用单一的模型,能够用常见的模型评价目标(比方ROC-AUC, Precision-Recall 等)衡量模型,并在后续的版别迭代中作为baseline,便利从模型视点进行版别提高的比较。
缺陷及优化方向:
LR模型较简略,学习才能有限,后续仍是替换成更强壮的模型,比方Xgboost模型。
03性别猜测模型V3
模型所运用的特征,除了上个版别包含的4个维度:嵌入SDK的运用包名、嵌入SDK的运用AppKey、设备机型信息以及设备称号,又增加了近期的聚合后的设备运用信息,处理方法与上个版别相似,不再赘述。
模型从LR更换成Xgboost(版别为0.82),代码示例如下:
<左右滑动检查完好代码>
- importorg.apache.spark.ml.feature.VectorAssembler
- importml.dmlc.xgboost4j.scala.spark.XGBoostClassifier//version为0.82
- valtransformedDF=spark.read.parquet("/trainData/path")//分词、CountVectorizer操作之后的特征,为vector列
- valfeatureCols=Array("packageName","appKey","model","deviceName")
- valvectorizer=newVectorAssembler().
- setInputCols(featureCols).
- setOutputCol("features")
- valassembledDF=vectorizer.transform(transformedDF)
- //traiinstage
- //xgboostparameterssetting
- valxgbParam=Map("eta"->xxx,
- "max_depth"->xxx,
- "objective"->"binary:logistic",
- "num_round"->xxx,
- "num_workers"->xxx)
- valxgbClassifier=newXGBoostClassifier(xgbParam).
- setFeaturesCol("features").
- setLabelCol("labelColname")
- model=xgbClassifier.fit(assembledDF)
- //predictstage
- valtransformedPredictionDF=spark.read.parquet("/predictData/path")//同train共同,为分词、CountVectorizer操作之后的特征,为vector列
- valassembledpredicDF=vectorizer.transform(transformedPredictionDF)
- valpredictions=model.transform(assembledpredicDF)
长处及提高作用:
- 比较上个版别,AUC提高了6.5%,在终究的性别标签出产中召回率提高了26%。考虑到TalkingData的十几亿的数据体量,这个数值仍是很可观的。
04性别猜测模型V4
除了上个版别包含的5个特征维度,还添加了TalkingData自有的三个广告类别维度的特征,尽管广告类别特征覆盖率仅占20%,但对终究标签的召回率的提高也有着很大的影响。
模型由Xgboost替换成DNN,设置最大练习轮数(Epoch)为40,一起设置了early stopping参数。考虑到神经网络能作业是根据大数据的,因而咱们将用于练习的样本量扩大了一倍,确保神经网络的学习。
DNN的结构如下:
<左右滑动检查完好代码>
- python
- GenderNet_VLen(
- (embeddings_appKey):Embedding(xxx,64,padding_idx=0)
- (embeddings_packageName):Embedding(xxx,32,padding_idx=0)
- (embeddings_model):Embedding(xxx,32,padding_idx=0)
- (embeddings_app):Embedding(xxx,512,padding_idx=0)
- (embeddings_deviceName):Embedding(xxx,32,padding_idx=0)
- (embeddings_adt1):Embedding(xxx,16,padding_idx=0)
- (embeddings_adt2):Embedding(xxx,16,padding_idx=0)
- (embeddings_adt3):Embedding(xxx,16,padding_idx=0)
- (fc):Sequential(
- (0):Linear(in_features=720,out_features=64,bias=True)
- (1):BatchNorm1d(64,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True)
- (2):ReLU()
- (3):Dropout(p=0.6)
- (4):Linear(in_features=64,out_features=32,bias=True)
- (5):BatchNorm1d(32,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True)
- (6):ReLU()
- (7):Dropout(p=0.6)
- (8):Linear(in_features=32,out_features=16,bias=True)
- (9):BatchNorm1d(16,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True)
- (10):ReLU()
- (11):Dropout(p=0.6)
- (12):Linear(in_features=16,out_features=2,bias=True)
- )
- )
长处及提高作用:
- 与上个版别比照,AUC仅提高了1.5%,但在终究性别标签出产中的召回率提高了13%,考虑数据体量以及现有的标签体量,这个提高仍是不错的。由此能够看出,在验证版别迭代作用的时分,咱们不应该仅仅从模型的AUC这单一目标来衡量,由于这对版别迭代的作用提高程度衡量不行精确。咱们应该验证终究的、实在的目标提高状况——在性别标签猜测中,是期望精确度(precision)下召回的样本数量。但咱们依然能够在版别优化时运用AUC等模型相关目标,来快速验证控制变量的试验作用,究竟这些目标简单核算。
模型探究小主张
从原始日志傍边抽取字段聚组成信息,需求通过许多步ETL,也会触及许多优化方法,这部分有专门的ETL团队担任,在这儿不做过多介绍。
模型团队能够直接运用按时刻聚合之后的字段进行建模使命,尽管如此,ETL和特征生成所花费的时刻,也占有了模型优化和迭代的大部分时刻。
下面总结两个优化方面的坑和处理经历,期望能给咱们一些参阅。
1.关于性别标签猜测,输入的特征大部分为Array类型,比方近期收集到的设备运用信息。关于这种类型的字段,在练习模型之前,咱们一般会调用CountVectorizer将Array转成Vector,然后再作为模型的输入,可是CountVectorizer这一步十分耗时,这导致咱们在版别迭代时不能快速试验。
针对该问题,咱们能够事前完结这一步转化,然后将生成的Vector列也存储下来,这样在每次试验时,就能够节约CountVectorizer耗费的时刻。
在实践出产中,由于有许多标签的出产都会用到相同的字段,事前将Array转成Vector存储下来,后续不同使命即可直接调用Vector列,节约了许多时刻。
2.尽管第一条能够节约不少时刻,但Spark仍是更多用于出产。其实在模型前期的探究傍边,咱们也能够先用Spark生成练习集——由于实在样本一般不会许多,生成的练习集往往不是很大,这时咱们就能够用单机来进行快速试验了。
在单机上,咱们能够运用Python更便利的画图来更直观的知道数据,更快的进行特征挑选,更快的验证主意。在对数据、对模型有了深化的了解之后,咱们就能够把试验所得的定论快速运用到出产傍边。
作者简介:张小艳,TalkingData数据科学家,现在担任企业级用户画像渠道的建立以及高效营销投进算法的研制,长时间重视互联网广告、用户画像、诈骗检测等范畴。
知优网 » 如何用机器学习模型,为十几亿数据猜测性别