基于用户画像进行广告投放,是优化投放效果、实现精准营销的基础;而人口属性中的性别、年龄等标签,又是用户画像中的基础信息。那该如何尽量准确的为数据打上这些标签?

如何用机器学习模型,为十几亿数据猜测性别  机器学习 数据预测 标签 第1张

根据用户画像进行广告投进,是优化投进作用、完结精准营销的根底;而人口特点中的性别、年纪等标签,又是用户画像中的根底信息。那该怎么尽量精确的为数据打上这些标签?

这时分机器学习就派上用场了。本文将以性别标签为例,介绍人口特点标签猜测的机器学习模型构建与优化。

性别标签猜测流程

一般状况下,无监督学习不只很难学习到有用信息,并且关于学习到的作用较难评价。所以,假如能够,咱们会尽或许地把问题转化成有监督学习。

关于性别标签也是如此,咱们能够运用可信的性别样本数据,加上从TalkingData搜集的原始数据中提取出来的有用信息,将性别标签的出产使命转化成有监督机器学习使命。更具体来说,男/女别离作为1/0标签(Label,也便是常说的Y值,为了便利表达,咱们符号男/女别离为1/0标签),这样性别标签的使命就转化成了二分类使命。

性别标签的出产流程图如下:

如何用机器学习模型,为十几亿数据猜测性别  机器学习 数据预测 标签 第2张
  • 简略来说,输入为具有可信性别信息的样本数据,以及从近期活泼的原始数据中提取出有用特征;
  • 将两者join之后,得到能够直接用于建模的数据集;
  • 根据该数据集进行建模,学习出性别猜测模型;
  • 再用该模型对悉数样本进行猜测,然后得到一切样本的性别打分。至此,模型部分的作业基本完结;
  • 终究一步是确认阈值,输出男/女标签。这儿咱们不依赖模型确认阈值,而是凭借比较可信的第三方东西,确保在期望精确度(precision)下,召回尽或许多的样本。

别的,面临TalkingData十几亿的数据体量,在标签出产的过程中,为了加快运算,除了必须用单机的状况下,咱们都会优先选用Spark分布式来加快运算。

特征与模型办法的版别迭代

为了优化模型的作用,咱们又对该性别标签猜测模型进行了屡次迭代。

01性别猜测模型V1

模型开始运用的特征包含4个维度:设备运用信息、嵌入SDK的运用包名、嵌入SDK的运用内自定义事情日志以及设备机型信息。

模型选用Xgboost(版别为0.5),根据每个维度的特征别离练习模型,得到4个子模型。每个子模型会输出根据该特征维度的设备男/女倾向的打分,分值区间从0到1,分值高代表设备为男性倾向,反之则为女人倾向。模型代码示例如下:

<左右滑动检查完好代码>

  1. importcom.talkingdata.utils.LibSVM
  2. importml.dmlc.xgboost4j.scala.DMatrix
  3. importml.dmlc.xgboost4j.scala.spark.XGBoost//version0.5
  4. //trainstage
  5. valtrainRDD=LibSVM.loadLibSVMFile(sc,trainPath)//sc为SparkContext
  6. valmodel=XGBoost.train(trainRDD,paramMap,numRound,nWorkers=workers)
  7. //predictstage
  8. valtestSet=LibSVM.loadLibSVMFilePred(sc,testPath,-1,sc.defaultMinPartitions)
  9. valpred=testSet.map(_._2).mapPartitions{iter=>
  10. model.value.predict(newDMatrix(iter)).map(_.head).toIterator
  11. }.zip(testSet).map{case(pred,(tdid,feauture))=>
  12. s"$tdid\t$pred"
  13. }

缺陷及优化方向:

  • 模型为四个子模型的交融,结构较杂乱,运转功率较低,考虑改为运用单一模型;
  • 嵌入SDK的运用内自定义事情日志特征覆盖率低,且ETL处理资源耗费大,需从头评价该字段对模型的奉献程度;
  • 发现设备称号字段看上去有男/女区分度——部分用户群领会以姓名或许昵称命名设备名(例如带有“哥”“军”等字段的倾向为男性,带有“妹”“兰” 等字段的倾向为女人),验证作用并考虑是否参加该字段。

02性别猜测模型V2

对模型运用特征的4个维度进行了调整,改为:嵌入SDK的运用包名、嵌入SDK的运用AppKey、设备机型信息以及设备称号。

其间,对嵌入SDK的运用包名和设备称号做分词处理。再运用CountVectorizer将以上4类特征处理成稀少向量(Vector),一起用ChiSqSelector进行特征挑选。

模型选用LR(Logistic Regression),代码示例如下:

<左右滑动检查完好代码>

  1. importorg.apache.spark.ml.feature.VectorAssembler
  2. importorg.apache.spark.ml.PipelineModel
  3. importorg.apache.spark.ml.classification.LogisticRegression
  4. valtransformedDF=spark.read.parquet("/traindata/path")//分词、CountVectorizer、ChiSqSelector操作之后的特征,为vector列
  5. valfeatureCols=Array("packageName","appKey","model","deviceName")
  6. valvectorizer=newVectorAssembler().
  7. setInputCols(featureCols).
  8. setOutputCol("features")
  9. vallr=newLogisticRegression()
  10. valpipeline=newPipeline().setStages(Array(vectorizer,lr))
  11. valmodel=pipeline.fit(transformedDF)
  12. //predictstage
  13. valtransformedPredictionDF=spark.read.parquet("/predictData/path")//同train共同,为分词、CountVectorizer、ChiSqSelector处理之后的特征,为vector列
  14. valpredictions=model.transform(transformedPredictionDF)

长处及提高作用:

选用单一的模型,能够用常见的模型评价目标(比方ROC-AUC, Precision-Recall 等)衡量模型,并在后续的版别迭代中作为baseline,便利从模型视点进行版别提高的比较。

缺陷及优化方向:

LR模型较简略,学习才能有限,后续仍是替换成更强壮的模型,比方Xgboost模型。

03性别猜测模型V3

模型所运用的特征,除了上个版别包含的4个维度:嵌入SDK的运用包名、嵌入SDK的运用AppKey、设备机型信息以及设备称号,又增加了近期的聚合后的设备运用信息,处理方法与上个版别相似,不再赘述。

模型从LR更换成Xgboost(版别为0.82),代码示例如下:

<左右滑动检查完好代码>

  1. importorg.apache.spark.ml.feature.VectorAssembler
  2. importml.dmlc.xgboost4j.scala.spark.XGBoostClassifier//version为0.82
  3. valtransformedDF=spark.read.parquet("/trainData/path")//分词、CountVectorizer操作之后的特征,为vector列
  4. valfeatureCols=Array("packageName","appKey","model","deviceName")
  5. valvectorizer=newVectorAssembler().
  6. setInputCols(featureCols).
  7. setOutputCol("features")
  8. valassembledDF=vectorizer.transform(transformedDF)
  9. //traiinstage
  10. //xgboostparameterssetting
  11. valxgbParam=Map("eta"->xxx,
  12. "max_depth"->xxx,
  13. "objective"->"binary:logistic",
  14. "num_round"->xxx,
  15. "num_workers"->xxx)
  16. valxgbClassifier=newXGBoostClassifier(xgbParam).
  17. setFeaturesCol("features").
  18. setLabelCol("labelColname")
  19. model=xgbClassifier.fit(assembledDF)
  20. //predictstage
  21. valtransformedPredictionDF=spark.read.parquet("/predictData/path")//同train共同,为分词、CountVectorizer操作之后的特征,为vector列
  22. valassembledpredicDF=vectorizer.transform(transformedPredictionDF)
  23. valpredictions=model.transform(assembledpredicDF)

长处及提高作用:

  • 比较上个版别,AUC提高了6.5%,在终究的性别标签出产中召回率提高了26%。考虑到TalkingData的十几亿的数据体量,这个数值仍是很可观的。

04性别猜测模型V4

除了上个版别包含的5个特征维度,还添加了TalkingData自有的三个广告类别维度的特征,尽管广告类别特征覆盖率仅占20%,但对终究标签的召回率的提高也有着很大的影响。

模型由Xgboost替换成DNN,设置最大练习轮数(Epoch)为40,一起设置了early stopping参数。考虑到神经网络能作业是根据大数据的,因而咱们将用于练习的样本量扩大了一倍,确保神经网络的学习。

DNN的结构如下:

<左右滑动检查完好代码>

  1. python
  2. GenderNet_VLen(
  3. (embeddings_appKey):Embedding(xxx,64,padding_idx=0)
  4. (embeddings_packageName):Embedding(xxx,32,padding_idx=0)
  5. (embeddings_model):Embedding(xxx,32,padding_idx=0)
  6. (embeddings_app):Embedding(xxx,512,padding_idx=0)
  7. (embeddings_deviceName):Embedding(xxx,32,padding_idx=0)
  8. (embeddings_adt1):Embedding(xxx,16,padding_idx=0)
  9. (embeddings_adt2):Embedding(xxx,16,padding_idx=0)
  10. (embeddings_adt3):Embedding(xxx,16,padding_idx=0)
  11. (fc):Sequential(
  12. (0):Linear(in_features=720,out_features=64,bias=True)
  13. (1):BatchNorm1d(64,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True)
  14. (2):ReLU()
  15. (3):Dropout(p=0.6)
  16. (4):Linear(in_features=64,out_features=32,bias=True)
  17. (5):BatchNorm1d(32,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True)
  18. (6):ReLU()
  19. (7):Dropout(p=0.6)
  20. (8):Linear(in_features=32,out_features=16,bias=True)
  21. (9):BatchNorm1d(16,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True)
  22. (10):ReLU()
  23. (11):Dropout(p=0.6)
  24. (12):Linear(in_features=16,out_features=2,bias=True)
  25. )
  26. )

长处及提高作用:

  • 与上个版别比照,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数据科学家,现在担任企业级用户画像渠道的建立以及高效营销投进算法的研制,长时间重视互联网广告、用户画像、诈骗检测等范畴。

转载请说明出处
知优网 » 如何用机器学习模型,为十几亿数据猜测性别

发表评论

您需要后才能发表评论