Más contenido relacionado
La actualidad más candente (20)
Similar a 広告配信現場で使うSpark機械学習 (20)
広告配信現場で使うSpark機械学習
- 6. 使うもの
★ Apache Spark
• SparkSQL & DataFrame ・・・データ操作/加工
• Spark MLlib
• Pipeline ・・・ワークフロー
• HashingTrick ・・・特徴のベクトル化、次元削減
• LogisticRegression ・・・ロジスティック回帰
• CrossValidator ・・・最適モデルの選択
★ databricks/spark-csv ・・・CSVパーサ
6
- 8. データ構造
8
• id: ad identifier
• click: 0/1 for non-click/click
• hour: YYMMDDHH
• C1 -- anonymized categorical variable
• banner_pos
• site_id
• site_domain
• site_category
• app_id
• app_domain
• app_category
• device_id
• device_ip
• device_model
• device_type
• device_conn_type
• C14-C21 -- anonymized categorical variables
- 11. 11
val rawCsv = sqlContext.read
.format( "com.databricks.spark.csv" )
.option( "header", "true" )
.load( "/var/kaggle-data/train*.gz" )
ソースコードはこんなかんじです。
※scalaを使っています
CSVの読み込み&パース
- 18. 18
val data = rawCsv.select(
$"id",
$"click".cast( DoubleType ).as( "label" ),
array(
f( hour( $"hour" ), lit( "hour" ),
f( $"C1", lit( "C1" ),
f( $"banner_pos", lit( "banner_pos" ),
f( $"site_id", lit( "site_id" ),
f( $"site_domain", lit( "site_domain" ),
f( $"site_category", lit( "site_category" ),
:
f( $"C21", lit( "C21" ) )
).as( "text" )
)
!
先ほどのUDFを使ってDataFrameを加工し、訓練データ
を準備します。
特徴ベクトルに変換
- 21. !
今回使う
• Hashing Trick
• LogisticRegression
をPipelineStageとしてPipelineに渡します。
21
val hashingTF = new HashingTF()
.setNumFeatures( 1000 )
.setInputCol( "text" )
.setOutputCol( "features" )
!
val lr = new LogisticRegression()
.setMaxIter( 10 )
.setRegParam( 0.1 )
!
val pipeline = new Pipeline().setStages( Array( hashingTF, lr ) )
学習
- 23. !
学習済みのモデルにテストデータを渡すと
probability(確率)がベクトルで出てきます。
probabilityベクトルのインデックス1番目が
clickされる確率を表します。
23
model.transform( test ).select(
$"label",
$"prediction",
v0( $"probability" ).as( "probability0" ),
v1( $"probability" ).as( "probability1" )
).take(10).foreach ( predictPrint )
label:0.0, predict:0.0, v(0):0.8720480148381256, v(1):0.1279519851618744
label:1.0, predict:0.0, v(0):0.7926627870942957, v(1):0.2073372129057043
label:1.0, predict:1.0, v(0):0.4711335790138061, v(1):0.5288664209861939
label:1.0, predict:1.0, v(0):0.4756467107691264, v(1):0.5243532892308737
:
↑probability(1)>0.5の場合に1.0と推定されているのがわかります。
学習
CTR
- 27. 検証したいパラメータ・グリッドを作成します。
27
val paramGrid = new ParamGridBuilder()
.addGrid( hashingTF.numFeatures, Array(10, 1000) )
.addGrid( lr.regParam, Array(0.1, 0.001) )
.addGrid( lr.maxIter, Array(10, 100) ).build()
↑この例では2×2×2=8回の試行が行われて
最適パラメータが決定します。
※つまり結構な時間がかかります。
検証
- 29. 訓練が完了したら最適モデルを取り出して
最適パラメータを確認することができます。
29
val parent = cvModel.bestModel.parent.asInstanceOf[Pipeline]
val bestHT = parent.getStages(0).asInstanceOf[HashingTF]
val bestLR = parent.getStages(1).asInstanceOf[LogisticRegression]
!
println(s"numFeatures: ${bestHT.getNumFeatures}")
println(s"regParam: ${bestLR.getRegParam}")
println(s"maxIter: ${bestLR.getMaxIter}")
numFeatures: 1000
regParam: 0.001
maxIter: 100
このモデルを使って推定もできます。
→動的なパラメータ・チューニングが可能!
検証