自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何用機(jī)器學(xué)習(xí)模型,為十幾億數(shù)據(jù)預(yù)測(cè)性別

人工智能 機(jī)器學(xué)習(xí) 大數(shù)據(jù)
基于用戶畫像進(jìn)行廣告投放,是優(yōu)化投放效果、實(shí)現(xiàn)精準(zhǔn)營(yíng)銷的基礎(chǔ);而人口屬性中的性別、年齡等標(biāo)簽,又是用戶畫像中的基礎(chǔ)信息。那該如何盡量準(zhǔn)確的為數(shù)據(jù)打上這些標(biāo)簽?

[[327734]]

基于用戶畫像進(jìn)行廣告投放,是優(yōu)化投放效果、實(shí)現(xiàn)精準(zhǔn)營(yíng)銷的基礎(chǔ);而人口屬性中的性別、年齡等標(biāo)簽,又是用戶畫像中的基礎(chǔ)信息。那該如何盡量準(zhǔn)確的為數(shù)據(jù)打上這些標(biāo)簽?

這時(shí)候機(jī)器學(xué)習(xí)就派上用場(chǎng)了。本文將以性別標(biāo)簽為例,介紹人口屬性標(biāo)簽預(yù)測(cè)的機(jī)器學(xué)習(xí)模型構(gòu)建與優(yōu)化。

性別標(biāo)簽預(yù)測(cè)流程

通常情況下,無監(jiān)督學(xué)習(xí)不僅很難學(xué)習(xí)到有用信息,而且對(duì)于學(xué)習(xí)到的效果較難評(píng)估。所以,如果可以,我們會(huì)盡可能地把問題轉(zhuǎn)化成有監(jiān)督學(xué)習(xí)。

對(duì)于性別標(biāo)簽也是如此,我們可以使用可信的性別樣本數(shù)據(jù),加上從TalkingData收集的原始數(shù)據(jù)中提取出來的有用信息,將性別標(biāo)簽的生產(chǎn)任務(wù)轉(zhuǎn)化成有監(jiān)督機(jī)器學(xué)習(xí)任務(wù)。更具體來說,男/女分別作為1/0標(biāo)簽(Label,也就是常說的Y值,為了方便表達(dá),我們標(biāo)記男/女分別為1/0標(biāo)簽),這樣性別標(biāo)簽的任務(wù)就轉(zhuǎn)化成了二分類任務(wù)。

性別標(biāo)簽的生產(chǎn)流程圖如下:

 

如何用機(jī)器學(xué)習(xí)模型,為十幾億數(shù)據(jù)預(yù)測(cè)性別
  • 簡(jiǎn)單來說,輸入為具有可信性別信息的樣本數(shù)據(jù),以及從近期活躍的原始數(shù)據(jù)中提取出有用特征;
  • 將兩者join之后,得到可以直接用于建模的數(shù)據(jù)集;
  • 基于該數(shù)據(jù)集進(jìn)行建模,學(xué)習(xí)出性別預(yù)測(cè)模型;
  • 再用該模型對(duì)全部樣本進(jìn)行預(yù)測(cè),從而得到所有樣本的性別打分。至此,模型部分的工作基本完成;
  • 最后一步是確定閾值,輸出男/女標(biāo)簽。這里我們不依賴模型確定閾值,而是借助比較可信的第三方工具,保證在期望準(zhǔn)確度(precision)下,召回盡可能多的樣本。

另外,面對(duì)TalkingData十幾億的數(shù)據(jù)體量,在標(biāo)簽生產(chǎn)的過程中,為了加速運(yùn)算,除了必須用單機(jī)的情況下,我們都會(huì)優(yōu)先采用Spark分布式來加速運(yùn)算。

特征與模型方法的版本迭代

為了優(yōu)化模型的效果,我們又對(duì)該性別標(biāo)簽預(yù)測(cè)模型進(jìn)行了多次迭代。

01性別預(yù)測(cè)模型V1

模型最初使用的特征包括4個(gè)維度:設(shè)備應(yīng)用信息、嵌入SDK的應(yīng)用包名、嵌入SDK的應(yīng)用內(nèi)自定義事件日志以及設(shè)備機(jī)型信息。

模型采用Xgboost(版本為0.5),基于每個(gè)維度的特征分別訓(xùn)練模型,得到4個(gè)子模型。每個(gè)子模型會(huì)輸出基于該特征維度的設(shè)備男/女傾向的打分,分值區(qū)間從0到1,分值高代表設(shè)備為男性傾向,反之則為女性傾向。模型代碼示例如下:

<左右滑動(dòng)查看完整代碼>

  1. import com.talkingdata.utils.LibSVM 
  2.  import ml.dmlc.xgboost4j.scala.DMatrix 
  3.  import ml.dmlc.xgboost4j.scala.spark.XGBoost//version 0.5 
  4.  
  5.  //train stage 
  6.  val trainRDD = LibSVM.loadLibSVMFile(sc, trainPath)// sc為SparkContext 
  7.  val model = XGBoost.train(trainRDD, paramMap, numRound, nWorkers = workers) 
  8.  
  9.  
  10.  //predict stage 
  11.  val testSet = LibSVM.loadLibSVMFilePred(sc,testPath,-1,sc.defaultMinPartitions) 
  12.  val pred = testSet.map(_._2).mapPartitions{ iter => 
  13.          model.value.predict(new DMatrix(iter)).map(_.head).toIterator 
  14.      }.zip(testSet).map{case(pred, (tdid, feauture)) => 
  15.          s"$tdid\t$pred" 
  16.      } 

缺點(diǎn)及優(yōu)化方向:

  • 模型為四個(gè)子模型的融合,結(jié)構(gòu)較復(fù)雜,運(yùn)行效率較低,考慮改為使用單一模型;
  • 嵌入SDK的應(yīng)用內(nèi)自定義事件日志特征覆蓋率低,且ETL處理資源消耗大,需重新評(píng)估該字段對(duì)模型的貢獻(xiàn)程度;
  • 發(fā)現(xiàn)設(shè)備名稱字段看上去有男/女區(qū)分度——部分用戶群體會(huì)以名字或者昵稱命名設(shè)備名(例如帶有“哥”“軍”等字段的傾向?yàn)槟行?,帶?ldquo;妹”“蘭” 等字段的傾向?yàn)榕?,驗(yàn)證效果并考慮是否加入該字段。

02性別預(yù)測(cè)模型V2

對(duì)模型使用特征的4個(gè)維度進(jìn)行了調(diào)整,改為:嵌入SDK的應(yīng)用包名、嵌入SDK的應(yīng)用AppKey、設(shè)備機(jī)型信息以及設(shè)備名稱。

其中,對(duì)嵌入SDK的應(yīng)用包名和設(shè)備名稱做分詞處理。再使用CountVectorizer將以上4類特征處理成稀疏向量(Vector),同時(shí)用ChiSqSelector進(jìn)行特征篩選。

模型采用LR(Logistic Regression),代碼示例如下:

<左右滑動(dòng)查看完整代碼>

  1. import org.apache.spark.ml.feature.VectorAssembler 
  2.    import org.apache.spark.ml.PipelineModel 
  3.    import org.apache.spark.ml.classification.LogisticRegression 
  4.  
  5.    val transformedDF = spark.read.parquet("/traindata/path")//分詞、CountVectorizer、ChiSqSelector操作之后的特征,為vector列 
  6.  
  7.    val featureCols = Array("packageName","appKey""model""deviceName")                   
  8.    val vectorizer = new VectorAssembler(). 
  9.                      setInputCols(featureCols). 
  10.                      setOutputCol("features"
  11.    val lr = new LogisticRegression() 
  12.    val pipeline = new Pipeline().setStages(Array(vectorizer, lr)) 
  13.    val model = pipeline.fit(transformedDF) 
  14.  
  15.    //predict stage 
  16.    val transformedPredictionDF = spark.read.parquet("/predictData/path")//同train一致,為分詞、CountVectorizer、ChiSqSelector處理之后的特征,為vector列 
  17.    val predictions = model.transform(transformedPredictionDF) 

優(yōu)點(diǎn)及提升效果:

采用單一的模型,能夠用常見的模型評(píng)估指標(biāo)(比如ROC-AUC, Precision-Recall 等)衡量模型,并在后續(xù)的版本迭代中作為baseline,方便從模型角度進(jìn)行版本提升的比較。

缺點(diǎn)及優(yōu)化方向:

LR模型較簡(jiǎn)單,學(xué)習(xí)能力有限,后續(xù)還是替換成更強(qiáng)大的模型,比如Xgboost模型。

03性別預(yù)測(cè)模型V3

模型所使用的特征,除了上個(gè)版本包括的4個(gè)維度:嵌入SDK的應(yīng)用包名、嵌入SDK的應(yīng)用AppKey、設(shè)備機(jī)型信息以及設(shè)備名稱,又增加了近期的聚合后的設(shè)備應(yīng)用信息,處理方式與上個(gè)版本類似,不再贅述。

模型從LR更換成Xgboost(版本為0.82),代碼示例如下:

<左右滑動(dòng)查看完整代碼>

  1. import org.apache.spark.ml.feature.VectorAssembler 
  2.  import ml.dmlc.xgboost4j.scala.spark.XGBoostClassifier//version 為0.82 
  3.  
  4.  val transformedDF = spark.read.parquet("/trainData/path")//分詞、CountVectorizer操作之后的特征,為vector列 
  5.  
  6.  val featureCols = Array("packageName","appKey""model""deviceName")                   
  7.  val vectorizer = new VectorAssembler(). 
  8.                    setInputCols(featureCols). 
  9.                    setOutputCol("features"
  10.  val assembledDF = vectorizer.transform(transformedDF) 
  11.  
  12.  //traiin stage 
  13.  //xgboost parameters setting 
  14.  val xgbParam = Map("eta" -> xxx, 
  15.     "max_depth" -> xxx, 
  16.     "objective" -> "binary:logistic"
  17.     "num_round" -> xxx, 
  18.     "num_workers" -> xxx) 
  19.  val xgbClassifier = new XGBoostClassifier(xgbParam). 
  20.      setFeaturesCol("features"). 
  21.      setLabelCol("labelColname"
  22.  
  23.  model = xgbClassifier.fit(assembledDF) 
  24.  
  25.  //predict stage 
  26.  val transformedPredictionDF = spark.read.parquet("/predictData/path")//同train一致,為分詞、CountVectorizer操作之后的特征,為vector列 
  27.  val assembledpredicDF = vectorizer.transform(transformedPredictionDF) 
  28.  val predictions = model.transform(assembledpredicDF) 

優(yōu)點(diǎn)及提升效果:

  • 相比上個(gè)版本,AUC提升了6.5%,在最終的性別標(biāo)簽生產(chǎn)中召回率提升了26%。考慮到TalkingData的十幾億的數(shù)據(jù)體量,這個(gè)數(shù)值還是很可觀的。

04性別預(yù)測(cè)模型V4

除了上個(gè)版本包括的5個(gè)特征維度,還添加了TalkingData自有的三個(gè)廣告類別維度的特征,雖然廣告類別特征覆蓋率僅占20%,但對(duì)最終標(biāo)簽的召回率的提升也有著很大的影響。

模型由Xgboost替換成DNN,設(shè)置最大訓(xùn)練輪數(shù)(Epoch)為40,同時(shí)設(shè)置了early stopping參數(shù)??紤]到神經(jīng)網(wǎng)絡(luò)能工作是基于大數(shù)據(jù)的,因此我們將用于訓(xùn)練的樣本量擴(kuò)充了一倍,保證神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)。

DNN的結(jié)構(gòu)如下:

<左右滑動(dòng)查看完整代碼>

  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.    ) 

優(yōu)點(diǎn)及提升效果:

  • 與上個(gè)版本對(duì)比,AUC僅提升了1.5%,但在最終性別標(biāo)簽生產(chǎn)中的召回率提升了13%,考慮數(shù)據(jù)體量以及現(xiàn)有的標(biāo)簽體量,這個(gè)提升還是不錯(cuò)的。由此可以看出,在驗(yàn)證版本迭代效果的時(shí)候,我們不應(yīng)該僅僅從模型的AUC這單一指標(biāo)來衡量,因?yàn)檫@對(duì)版本迭代的效果提升程度衡量不夠準(zhǔn)確。我們應(yīng)該驗(yàn)證最終的、真正的指標(biāo)提升情況——在性別標(biāo)簽預(yù)測(cè)中,是期望準(zhǔn)確度(precision)下召回的樣本數(shù)量。但我們?nèi)匀豢梢栽诎姹緝?yōu)化時(shí)使用AUC等模型相關(guān)指標(biāo),來快速驗(yàn)證控制變量的實(shí)驗(yàn)效果,畢竟這些指標(biāo)容易計(jì)算。

模型探索小建議

從原始日志當(dāng)中抽取字段聚合成信息,需要經(jīng)過很多步ETL,也會(huì)涉及很多優(yōu)化方式,這部分有專門的ETL團(tuán)隊(duì)負(fù)責(zé),在這里不做過多介紹。

模型團(tuán)隊(duì)可以直接使用按時(shí)間聚合之后的字段進(jìn)行建模任務(wù),盡管如此,ETL和特征生成所花費(fèi)的時(shí)間,也占據(jù)了模型優(yōu)化和迭代的大部分時(shí)間。

下面總結(jié)兩個(gè)優(yōu)化方面的坑和解決經(jīng)驗(yàn),希望能給大家一些參考。

1.對(duì)于性別標(biāo)簽預(yù)測(cè),輸入的特征大部分為Array類型,比如近期采集到的設(shè)備應(yīng)用信息。對(duì)于這種類型的字段,在訓(xùn)練模型之前,我們一般會(huì)調(diào)用CountVectorizer將Array轉(zhuǎn)成Vector,然后再作為模型的輸入,但是CountVectorizer這一步非常耗時(shí),這導(dǎo)致我們?cè)诎姹镜鷷r(shí)不能快速實(shí)驗(yàn)。

針對(duì)該問題,我們可以事先完成這一步轉(zhuǎn)換,然后將生成的Vector列也存儲(chǔ)下來,這樣在每次實(shí)驗(yàn)時(shí),就可以節(jié)省CountVectorizer消耗的時(shí)間。

在實(shí)際生產(chǎn)中,因?yàn)橛泻芏鄻?biāo)簽的生產(chǎn)都會(huì)用到同樣的字段,事先將Array轉(zhuǎn)成Vector存儲(chǔ)下來,后續(xù)不同任務(wù)即可直接調(diào)用Vector列,節(jié)省了很多時(shí)間。

2.雖然第一條能夠節(jié)省不少時(shí)間,但Spark還是更多用于生產(chǎn)。其實(shí)在模型前期的探索當(dāng)中,我們也可以先用Spark生成訓(xùn)練集——因?yàn)檎鎸?shí)樣本通常不會(huì)很多,生成的訓(xùn)練集往往不是很大,這時(shí)我們就可以用單機(jī)來進(jìn)行快速實(shí)驗(yàn)了。

在單機(jī)上,我們可以使用Python更方便的畫圖來更直觀的認(rèn)識(shí)數(shù)據(jù),更快的進(jìn)行特征篩選,更快的驗(yàn)證想法。在對(duì)數(shù)據(jù)、對(duì)模型有了深入的了解之后,我們就可以把實(shí)驗(yàn)所得的結(jié)論快速應(yīng)用到生產(chǎn)當(dāng)中。

作者簡(jiǎn)介:張小艷,TalkingData數(shù)據(jù)科學(xué)家,目前負(fù)責(zé)企業(yè)級(jí)用戶畫像平臺(tái)的搭建以及高效營(yíng)銷投放算法的研發(fā),長(zhǎng)期關(guān)注互聯(lián)網(wǎng)廣告、用戶畫像、欺詐檢測(cè)等領(lǐng)域。

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2015-07-27 15:06:05

2020-11-17 17:28:29

機(jī)器學(xué)習(xí)技術(shù)人工智能

2020-07-14 08:34:07

AI機(jī)器學(xué)習(xí)預(yù)測(cè)股價(jià)

2017-03-24 08:58:23

機(jī)器學(xué)習(xí)算法預(yù)測(cè)

2018-03-20 15:33:05

深度學(xué)習(xí)加密貨幣

2020-08-28 07:00:00

機(jī)器學(xué)習(xí)預(yù)測(cè)股市人工智能

2013-11-08 17:57:01

SAP

2018-02-01 16:25:55

2023-12-25 10:53:54

機(jī)器學(xué)習(xí)模型性能

2024-05-27 07:54:02

2021-10-08 18:33:05

微信后臺(tái)移動(dòng)應(yīng)用

2017-07-17 15:02:51

大數(shù)據(jù)銀行用戶流失

2023-07-21 12:48:37

2021-02-22 11:44:43

機(jī)器學(xué)習(xí)數(shù)據(jù)泄露學(xué)習(xí)

2020-12-21 15:39:59

大數(shù)據(jù)機(jī)器學(xué)習(xí)數(shù)據(jù)湖

2018-03-16 11:50:33

大數(shù)據(jù)數(shù)據(jù)科學(xué)安全

2020-02-04 11:06:42

大數(shù)據(jù)技術(shù)存儲(chǔ)

2017-03-24 15:58:46

互聯(lián)網(wǎng)

2017-07-13 10:12:58

機(jī)器學(xué)習(xí)

2020-09-22 14:59:52

機(jī)器學(xué)習(xí)人工智能計(jì)算機(jī)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)