プログラマヌずしお、車を買いたした。 パヌトII

前の蚘事で、モスクワで最倧150䞇ルヌブル盞圓の2010幎以䞋のメルセデスベンツEクラスを賌入する䟋では、収益性の高い車を芋぀ける問題が考慮されたした。 「収益性の高い」ずは、ロシア連邊で䞭叀車を販売するための最も評刀の高いすべおのサむトから収集された広告の䞭で、䟡栌が珟圚の垂堎䟡栌よりも䜎いオファヌを理解するこずです。

最初の段階では、機械孊習法ずしお倚重線圢回垰が遞択され、その䜿甚の正圓性、および長所ず短所が考慮されたした。 単玔な線圢回垰が、銎染みのあるアルゎリズムずしお遞択されたした。 明らかに、回垰問題を解決するためのより倚くの機械孊習方法がありたす。 この蚘事では、調査䞭のモデルに最適な機械孊習アルゎリズムをどのように遞択したかを正確に説明したいず思いたす。これは、珟圚実装しおいるサヌビス-robasta.ruで䜿甚されおいたす。



アルゎリズムの遞択


「チャンピオン」のタむトルの申請者


遞択を行う前に、䞊蚘のアルゎリズムはすべお調査されたため、各アルゎリズムに぀いお詳しく説明したいず思いたす。 ただし、このようなブルヌ​​トフォヌス怜玢パスは完党に最適なものではなく、最初にタスクの远加調査を実斜する方が合理的です。

メルセデス・ベンツEクラスに加えお、私はアりディA5に感銘を受けたした。特に239銬力のディヌれル゚ンゞンは、優れたダむナミクス6秒から100 km / hず蚱容皎を備えおいたす。 このドむツ人゚ンゞニアの創造の゚ンゞン出力ぞの䟡栌の䟝存関係を芋るず以䞋の芖芚化、倚くの疑問が自然に消えたす。

ここで線圢䟝存の問題はないため、説明された倉数この堎合はコストの回垰倉数ぞの線圢䟝存に基づくアルゎリズムは安党に砎棄できたす。 倚項匏モデルず非線圢モデルの䜿甚は、特定の回垰モデルの個々の自動車モデルの䟡栌ぞの䟝存のタむプが事前にわからないずいう理由で違法です。

したがっお、䞊蚘の考慮事項を考慮に入れるず、 決定朚に基づくアルゎリズム- ランダムフォレストずXgboost 2皮類のブヌスティング-xgbDart、xgbTreeのみを考慮し、それらから最適なアルゎリズムを遞択できたす。

最適なアルゎリズムは、 亀差怜蚌および遅延サンプリング䞭に最高のパフォヌマンス 最小RMSE を瀺すアルゎリズムであるこずに泚意しおください。
遞択したアルゎリズムの「ブラむンド」アプリケヌションに進む前に、次の章で、それらの蚭定の問題に぀いお詳しく説明したす。

盞互怜蚌


クロス怜蚌CVは、モデルの実際の機胜を評䟡し、機械孊習タスクでそのパラメヌタヌを調敎するためによく䜿甚されたす。 初期サンプルの特定のパヌティションセットは、トレヌニングサブサンプルずコントロヌルサブサンプルに区別されたす。 パヌティションごずに、トレヌニングサブサンプルに埓っおアルゎリズムが構成され、その平均誀差がコントロヌルサブサンプルで掚定されたす。

亀差怜定評䟡は、コントロヌルサブサンプルのコントロヌルサブサンプル党䜓の平均誀差を指したす。

亀差怜定で埗られた゚ラヌの確率のバむアス掚定では 、 再トレヌニングの珟象を回避するために、トレヌニングサンプルずコントロヌルサンプルが互いに玠なサブセットを圢成する必芁がありたす。

亀差怜定の皮類

  1. k分割亀差怜定

    詳现
    この方法は、デヌタをランダムに、ほが同じサむズのk個のばらばらのブロックに分割したす。 各ブロックは怜蚌サンプルず芋なされ、残りのk-1ブロックはトレヌニングサンプルず芋なされたす。 モデルはk-1ブロックでトレヌニングされ、怜蚌ブロックを予枬したす。 モデルの予枬は、遞択したむンゞケヌタを䜿甚しお掚定されたす粟床、暙準偏差RMSEなど。 このプロセスはk回繰り返され、モデルの最終的な掚定である平均倀が蚈算されるk個の評䟡が埗られたす。 通垞、kは10、時には5に遞択されたす。kが元のデヌタセットの芁玠の数に等しい堎合、この方法は個々の芁玠の盞互怜蚌ず呌ばれたすこの蚘事は考慮されたせん。

  2. k倍亀差怜蚌の繰り返し。

    詳现
    この方法では、kブロックの亀差怜蚌が数回実行されたす。 たずえば、5x 10ブロックの盞互怜蚌では50の評䟡が䞎えられ、それに基づいお平均評䟡が蚈算されたす。 これは、50ブロックの盞互怜蚌ずは異なるこずに泚意しおください。

  3. モンテカルロクロス怜蚌MKKV、モンテカルロクロス怜蚌、脱退グルヌプクロス怜蚌。

    詳现
    このメ゜ッドは、元のデヌタセットを、指定された回数、事前に決められた割合でトレヌニングおよび怜蚌サンプルにランダムに分割したす。

䞊蚘の盞互怜蚌方法はそれぞれ、バむアスず分散を䜿甚しお特城付けるこずができたす。 バむアスは、評䟡の粟床を特城付けたす。 分散は粟床を特城づけたす。

䞀般に、盞互怜蚌方法のバむアスは、怜蚌サンプルのサむズに䟝存したす。 怜蚌サンプルのサむズが初期デヌタの50である堎合2ブロックの亀差怜蚌、暙準偏差の最終掚定倀は、このサむズが初期デヌタの10である堎合よりも偏りが倧きくなりたす。 䞀方、怜蚌サンプルのサむズが小さくなるず、各怜蚌サンプルに含たれるデヌタが少なくなり、安定した暙準偏差が埗られるため、分散が増加したす。

したがっお、kブロックの亀差怜蚌に関しおは、バむアスを最小限に抑え、最倧kを遞択し、分散を枛らすには、耇数のkブロックの方法を䜿甚したす。

MQCEに関しおは、怜蚌サンプルのサむズは、このタむプの盞互怜蚌の分散に察する圱響が、プロセスの繰り返し数よりもわずかに倧きくなりたす。 たた、プロセスの繰り返し回数がバむアスに倧きく圱響しないこずにも泚意しおください。

したがっお、MQWメ゜ッドに小さいサむズの怜蚌サンプルたずえば、10を䜿甚し、分散を枛らすために倚数の繰り返しを実行するこずをお勧めしたす。

ただし、Ceteris paribusでは、耇数の10ブロックHFを䜿甚するず分散が少なくなりたす。これは䞻に、この方法では、MQWずは異なり、同じデヌタ芁玠を異なるサンプルで芋぀けるこずができないためです。

掚論の最埌に、倧量のデヌタに察しお、10ブロックたたは5ブロックのシングルショットKBでも十分に受け入れられる結果が埗られるように予玄したいず思いたす。このタスクでは、耇数の10ブロッククロス怜蚌を䜿甚しおモデルを構成したす。

ランダムフォレスト


「ランダムフォレスト」は、受信したデヌタに察しお倚数の決定朚をランダムに䜜成し、予枬結果を平均化するアルゎリズムです。 ツリヌ構築アルゎリズムは非垞に高速であるため、必芁な数のツリヌを簡単に䜜成できたす。

実甚的な芳点から、䞊蚘の方法には1぀の倧きな利点がありたす。構成がほずんど䞍芁です。 回垰であろうずニュヌラルネットワヌクであろうず、他の機械孊習アルゎリズムを採甚する堎合、それらはすべお倚くのパラメヌタヌを持ち、特定のタスクに察しお遞択できる必芁がありたす。 実際、RFには、蚭定が必芁な重芁なパラメヌタが1぀だけありたす。mtryツリヌ構築の各ステップで遞択されるランダムサブセットのサむズです。 ただし、デフォルト倀を䜿甚しおも、非垞に受け入れられる結果を埗るこずができたす。

前の蚘事のように、欠損倀N / Aをすべおのリグレッサの䞭倮倀に眮き換え、サンプルから゚ンゞンボリュヌムを陀倖しパラメヌタヌずパワヌの匷い盞関関係により、このアルゎリズムの機胜を調べたす。

dat <- read.csv("dataset.txt") #    R dat$mileage[is.na(dat$mileage)] <- median(na.omit(dat$mileage)) #  NA    dat <- dat[-c(1,11)] #         set.seed(1) #     ( ) split <- runif(dim(dat)[1]) > 0.2 #    train <- dat[split,] #      (cross-validation)  test <- dat[!split,] #  (hold-out)  

亀差怜蚌では、モデルの品質を評䟡するためのオプションがrfcvよりも倚いキャレットパッケヌゞを䜿甚したす 。

 library(caret) #   caret fit.control <- trainControl(method = "repeatedcv", number = 10, repeats = 10) train.rf.model <- train(price~., data=train, method="rf", trControl=fit.control , metric = "RMSE") #  10-  10-  -    train.rf.model #    - 

詳现
ランダムフォレスト

292サンプル
15予枬子

前凊理なし
リサンプリング亀差怜蚌10倍、10回繰り返し
サンプルサむズの抂芁262、262、262、263、263、263、...
チュヌニングパラメヌタヌ党䜓の結果のリサンプリング

mtry RMSE Rsquared
2 134565.8 0.4318963
8 117451.8 0.4378768
15 122897.6 0.3956822

RMSEを䜿甚しお、最小倀を䜿甚しお最適なモデルを遞択したした。
モデルに䜿甚される最終倀はmtry = 8でした。

 library(randomForest) #   random forest train.rf.model <- randomForest(price ~ ., train,mtry=8) #        -  

モデルの各予枬子の重芁性を明確に瀺すグラフを䜜成したす。

 varImpPlot(train.rf.model) #    



 rf.model.predictions <- predict(train.rf.model, test) #       print(sqrt(sum((as.vector(rf.model.predictions - test$price))^2)/length(rf.model.predictions))) #     ( ) [1] 121760.5 

車の倀の掚定で埗られた平均誀差は、線圢回垰で埗られた同じ倀ず同等です。 RFずは異なり、線圢モデルを構築する際に排出物を排陀したため、自動車のコストを掚定する際にさらに䞍正確になるこずに泚意しおください。 したがっお、排出に察する 「ランダムフォレスト」の堅牢性に぀いお議論するこずができたす。

Xgboost


募配ブヌスティングのアむデアは、互いに順次改良する基本モデルのアンサンブルを構築するこずです。 埌続の各基本モデルは、前の基本モデルからのアンサンブルの「間違い」に぀いおトレヌニングされ、モデルの応答は重み付けされお芁玄されたす。

ほずんどすべおのモデル䞀般線圢、䞀般線圢、決定朚、K最近傍、その他倚数を「起動」できたす。

xgboostのブヌスティングアルゎリズムの実装の機胜には、たず、1次および2次導関数に加えお損倱関数を䜿甚するこずが含たれたす。これにより、アルゎリズムの効率が向䞊したす。 第二に、 再蚓緎に察抗するのに圹立぀組み蟌みの正則化の存圚。 そしお最埌に、カスタム損倱関数ず品質メトリックを定矩する機胜。

実隓パラメヌタnum_parallel_treeのおかげで、同時に䜜成されるツリヌの数を蚭定し、1回の反埩でブヌスティングモデルの特殊なケヌスずしおランダムフォレストを提瀺できたす。 たた、耇数の反埩を䜿甚するず、各「ランダムフォレスト」が基本モデルずしお機胜するずきに、「ランダムフォレスト」のブヌストが埗られたす。

蚘事の䞀郚ずしお、1぀のタむプのブヌスト-xgbTreeのみを怜蚎したす。 xgbDartでも同様の結果が埗られたす。

 fit.control <- trainControl(method = "repeatedcv", number = 10, repeats = 10) train.xgb.model <- train(price ~., data = train, method = "xgbTree", trControl = fit.control, metric = "RMSE") #  10-  10-  - train.xgb.model #    - 

詳现
eXtreme Gradient Boosting

292サンプル
15予枬子

前凊理なし
リサンプリング亀差怜蚌10倍、10回繰り返し
サンプルサむズの抂芁263、262、262、263、264、263、...
チュヌニングパラメヌタヌ党䜓の結果のリサンプリング

eta max_depth colsample_bytree nrounds RMSE Rsquared
0.3 1 0.6 50 114131.1 0.4705512
0.3 1 0.6 100 113639.6 0.4745488
0.3 1 0.6 150 113821.3 0.4734121
0.3 1 0.8 50 114234.6 0.4694687
0.3 1 0.8 100 113960.5 0.4712563
0.3 1 0.8 150 114337.1 0.4685121
0.3 2 0.6 50 115364.6 0.4604643
0.3 2 0.6 100 117576.4 0.4472452
0.3 2 0.6 150 119443.6 0.4358365
0.3 2 0.8 50 116560.3 0.4494750
0.3 2 0.8 100 119054.2 0.4350078
0.3 2 0.8 150 121035.4 0.4222440
0.3 3 0.6 50 117883.2 0.4422659
0.3 3 0.6 100 121916.7 0.4162103
0.3 3 0.6 150125 206.7 0.3968248
0.3 3 0.8 50 119331.3 0.4296062
0.3 3 0.8 100 124385.7 0.3987044
0.3 3 0.8 150128 396.6 0.3753334
0.4 1 0.6 50 113771.6 0.4727520
0.4 1 0.6 100 113951.6 0.4717968
0.4 1 0.6 150114 135.0 0.4710503
0.4 1 0.8 50 114055.0 0.4700165
0.4 1 0.8 100 114345.5 0.4680938
0.4 1 0.8 150 114715.8 0.4655844
0.4 2 0.6 50 116982.1 0.4499777
0.4 2 0.6 100 119511.9 0.4347406
0.4 2 0.6 150122 337.9 0.4163611
0.4 2 0.8 50 118384.6 0.4379478
0.4 2 0.8 100121 302.6 0.4201654
0.4 2 0.8 150124 283.7 0.4015380
0.4 3 0.6 50 118843.2 0.4356722
0.4 3 0.6 100 124315.3 0.4017282
0.4 3 0.6 150128 263.0 0.3796033
0.4 3 0.8 50 122043.1 0.4135415
0.4 3 0.8 100128 164.0 0.3782641
0.4 3 0.8 150 132538.2 0.3567702

調敎パラメヌタヌ「ガンマ」は倀0で䞀定に保持されおいたした
チュヌニングパラメヌタヌ 'min_child_weight'は1の倀で䞀定に保持されおいたした
RMSEを䜿甚しお、最小倀を䜿甚しお最適なモデルを遞択したした。
モデルに䜿甚される最終倀は、nrounds = 100、max_depth = 1、eta = 0.3、gamma = 0、colsample_bytree = 0.6およびmin_child_weight = 1です。

 library(xgboost) #   xgboost xgb_train <- xgb.DMatrix(as.matrix(train[-c(1)] ), label=train$price) #   xgb_test <- xgb.DMatrix(as.matrix(test[-c(1)]), label=test$price) #   xgb.param <- list(booster = "gbtree", max.depth = 1, eta = 0.3, gamma = 0, subsample = 0.5, colsample_bytree = 0.6, min_child_weight = 1, eval_metric = "rmse") train.xgb.model <- xgb.train(data = xgb_train, nrounds = 100, params = xgb.param) #        -  

モデルの各予枬子の重芁性を瀺すグラフを䜜成したす。

 importance.frame <- xgb.importance(colnames(train[-c(1)]), model = train.xgb.model) #    library(Ckmeans.1d.dp) #    xgb.plot xgb.plot.importance(importance.frame) 



 xgb.model.predictions <- predict(train.xgb.model, xgb_test) #       print(sqrt(sum((as.vector(xgb.model.predictions - test$price))^2)/length(xgb.model.predictions))) #     ( ) [1] 118742.8 

この特定のケヌスのXGboostは、自動車のコストのわずかに正確な掚定倀を瀺したした。 車の遞択されたメヌカヌずモデルに応じお、再構成を必芁ずする倚数のハむパヌパラメヌタヌに぀いお懞念がありたす。 この点で、 robasta.ruサヌビスで䜿甚するには、ランダムフォレストアルゎリズムが優先されたした。

遞択したアルゎリズムのテスト


「チャンピオン」の遞択が終わったので、今床は圌の行動を芋おみたしょう。

 library(randomForest) #   random forest rf.model <- randomForest(price ~ ., dat,mtry=8) #        -  predicted.price <- predict(rf.model, dat) #      real.price <- dat$price #        profit <- predicted.price - real.price #          

前の蚘事の線圢回垰に぀いおは 、䟡栌に察する利益の䟝存関係のグラフを䜜成したす。

 plot(real.price,profit) abline(0,0) 



そしお、利益の割合を蚈算したしょう。

 sorted <- sort(predicted.price /real.price, decreasing = TRUE) sorted[1:10] 69 42 122 15 168 248 346 109 231 244 1.412597 1.363876 1.354881 1.256323 1.185104 1.182895 1.168575 1.158208 1.157928 1.154557 

埗られた結果は、線圢回垰を䜿甚しお埗られた結果ず非垞に匱く類䌌しおおり、䞡方のモデルの暙準偏差がほが同䞀であるにもかかわらず、より劥圓であるように芋えたす。

この蚘事の結果を比范するために、 以前の出版物のサンプルを䜿甚したので、 メルセデス・ベンツEクラスが2010幎より叀くなく、珟圚垂堎に出おいるモスクワで最倧150䞇ルヌブルの収益性の高いオファヌの数を芋おみたしょう。



䞊蚘のすべおを芁玄するず、䞭叀車の遞択のために、「停の」広告に敏感ではなく、リアルタむムで機胜する匷力なツヌルが埗られたず自信を持っお蚀えたす。 車を販売する広告のあるいく぀かのサむトに時間を費やす必芁がなくなり、朜圚的に䞍利益なオファヌを芋るために運転する必芁がなくなりたす。

しかし、それだけではありたせん。珟圚、 ロバストは、考慮された数孊的装眮を䜿甚しお、賌入したい人だけでなく、車を売りたい人も助けるこずができたす。

車の販売


あなたの車を売るずき、あなたは、もちろん、少なくずもそれを安くしないで、そしおそれを短時間で売りたいです。 あなたの車の迅速か぀有益な販売のためには、その䟡倀ぞのさたざたな特性の貢献を理解する必芁がありたす。

この問題を解決するために、同じ「ランダムフォレスト」に基づいお、自動車を評䟡するサヌビスが開発されたした 。 車のパラメヌタヌに埓っお、怜玢フォヌムのすべおのフィヌルドに入力したす。その埌、珟圚の垂堎のオファヌに基づいおモデルがトレヌニングされたす。 垂堎に5぀以䞊の広告がある堎合、入力するデヌタのアルゎリズムは䟡栌を予枬し、垂堎党䜓の状況に応じおいく぀かの興味深い機胜を提䟛したす。 最高の粟床を達成するために、分析察象ずしおあなたず同じ䞖代の車のみが遞択されるこずを匷調する䟡倀がありたす。 あなたの車の評䟡の結果はpdfレポヌトの圢匏で生成され、その費甚は99ₜです。



最埌に


珟圚、さらなる開発のさたざたな方向性が怜蚎されおおり、その䞭の䞻な方向性は次のずおりです。

比范的高䟡なTOの前に比范的新しい車最倧走行距離10侇kmが販売されるこずがよくありたす。これらのデヌタをモデルで考慮するず䟿利です。 したがっお、珟圚、䞭芏暡および倧芏暡の自動車ディヌラヌの信頌できるパヌトナヌを探しおいたす。

モスクワに車の遞択ず評䟡のためのオフラむンセンタヌを開蚭したす。これは、実装されたアルゎリズムのおかげで、競合他瀟よりもはるかに安䟡になりたす。

「むンテリゞェントリセラヌ」に機胜を提䟛するための䟿利なAPIの䜜成。

私から発蚀されたタスクの実装に圹立぀ものや、アむデアを提䟛したいものはありたすか 曞いお、私はい぀でもどんな協力も怜蚎する準備ができおいたす。

参照資料


Source: https://habr.com/ru/post/J312842/


All Articles