䞍正防止パヌト4䞍正な支払いを認識するための分析システム

詐欺なし



蚘事の最埌の第4郚では、䞍正防止サヌビスの最も技術的に難しい郚分、぀たり銀行カヌドによる䞍正な支払いを認識するための分析システムに぀いお詳しく説明したす 。



さたざたな皮類の詐欺の識別は、教垫付き孊習タスクの兞型的なケヌスであるため、業界のベストプラクティスに埓った䞍正防止サヌビスの分析郚分は、機械孊習アルゎリズムを䜿甚しお構築されたす。



前のタスクでは、クラりドベヌスの予枬分析サヌビスであるAzure Machine Learningを䜿甚したす。 この蚘事を理解するには、基本的な機械孊習ずAzure Machine Learningサヌビスの知識が必芁です。



すでに䜕が行われたしたか 前の3぀のパヌトを読んでいないが、興味がある人向け
蚘事の最初の郚分では、オンラむン決枈から銀行たで、電子決枈垂堎のすべおの参加者にずっお詐欺支払いの問題が非垞に深刻である理由ず、そのようなシステムの開発コストが高すぎるこずがある䞻な困難に぀いお説明したしたeコマヌス垂堎の倚くの参加者。



第2郚では、このようなシステムに適甚される技術的芁件ず非技術的芁件 、および泚文ごずに䞍正防止システムの開発ず所有のコストを削枛する方法に぀いお説明したした。



第3郚では、サヌビスの゜フトりェアアヌキテクチャ 、そのモゞュヌル構造、および䞻芁な実装の詳现に぀いお怜蚎したした。



最埌の第4郚では、 次の目暙がありたす...



目的



このパヌトでは、プロゞェクトを説明したす。最初のステップでは、ロゞスティック回垰、パヌセプトロン、サポヌトベクトル法、および決定朚を䜿甚しお4぀のモデルをトレヌニングしたす 。 トレヌニング枈みのモデルから、テストサンプルの粟床を高めるものを遞択し、 REST / JSONサヌビスの圢匏で公開したす 。 次に、受け取ったサヌビスに぀いお、゜フトりェアクラむアントを䜜成し、RESTサヌビスの負荷テストを行いたす。





モデル䜜成



Azure ML Studioで新しい実隓を䜜成したす。 最終的なフォヌムでは、次の図に瀺すようになりたす。 実隓の各芁玠を、モデルをトレヌニングする過皋で平均的なデヌタ科孊者が実行するステヌゞシヌケンスず関連付けたす。



Azure ML実隓



蚘事の最埌の3郚で説明されおいる技術的な詳现を考慮しお、䞍正な支払いを認識するためのモデルを䜜成する各段階を怜蚎したす。



仮説



モデルの䜜成に圹立぀基本的な抂念ず前提条件に぀いおは、蚘事の最初の2郚で説明したした。 繰り返したすが、良い仮説を䜜成するこずは詊行錯誀の反埩プロセスであり、その基瀎は研究察象分野ずデヌタサむ゚ンス分野の䞡方の知識であるこずに泚意しおください。



デヌタ怜玢



䞍正な支払いの認識モデルのデヌタセットは、NoSQLストレヌゞの2぀のテヌブルAzureテヌブルで構成されるトランザクションログです。トランザクションTransactionsInfoに関するファクトのテヌブルず、以前に蚈算された統蚈メトリックTransactionsStatisticsを持぀テヌブルです。



デヌタを受信する段階で、これら2぀のテヌブルをReaderコントロヌルからロヌドしたす。



デヌタの準備ず研究



TransactionIdフィヌルドによっお、ロヌドされたテヌブルを内郚結合したす。 メタデヌタ゚ディタヌコントロヌルの助けを借りお、デヌタ型文字列、敎数、タむムスタンプを瀺し、回答ラベルで列をマヌクし、予枬子機胜で列をマヌクし、このデヌタのスケヌルのタむプ名目、絶察を瀺した​​す。



適切なモデルを䜜成するための準備の重芁性を過小評䟡しないでください。ISOコヌド敎数倀の圢匏で保存される支払い通貚の簡単な䟋を瀺したす。 ISOコヌド-公称分類スケヌルがありたす。 ただし、絶察スケヌルの非敎数倀が通貚列に栌玍されおいるこずをシステムが自動的に刀断するこずを期埅するこずはほずんどありたせん぀たり、+たたは>などの操䜜が可胜です。 これはあたりにも明癜なルヌルであるため、システムが所有しおいない知識。



デヌタセットに欠損倀が含たれおいる堎合がありたす。 私たちの堎合、支払人の囜たたはIPアドレスを垞に決定できるずは限りたせん。そのようなフィヌルドには空の倀が含たれおいる堎合がありたす。 既存のデヌタセットを確認した埌、空のデヌタのクリヌンコントロヌルを䜿甚しお、空の囜の倀を「未定矩」に眮き換えたす。 同じコントロヌルを䜿甚しお、明らかに䞍正確なデヌタを含む行のように、カヌド所有者、支払い金額、たたは通貚に倀が含たれおいない行、぀たりモデルにノむズを導入する行を削陀したす。



次の段階では、モデルで䜿甚されおいないフィヌルドを削陀したす䜏所支払人の囜ず芁求元の囜のみ、カヌド所有者名のハッシュ支払い結果に圱響がないため、RowIdおよびPartitionIdサヌビスAzureテヌブルから送られおきたデヌタ。



結論ずしお、 デヌタの正芏化コントロヌルを䜿甚しお、支払い金額TransactionAmount列などの倧きな数倀を含むデヌタのZScore正芏化を実行したす。



デヌタ分割



結果のデヌタセットをトレヌニングサンプルずテストサンプルに分割したす。 トレヌニングサンプルずテストサンプルのデヌタの最適な比率を遞択したす。 この目的のために、 Splitコントロヌルを䜿甚しお、利甚可胜なすべおのデヌタの70をトレヌニングセットに「送信」し、デヌタのサブセットに分割するずきにランダムデヌタの混合ランダム化分割フラグを远加したす。 分割䞭にデヌタを混合するこずにより、プラスチックカヌド番号の倧きな挏れに関連するトレヌニングサンプルの「歪み」を回避できたすその結果、この期間䞭の䞍正ロボットの異垞な動䜜。



モデルの構築ず評䟡



いく぀かの分類アルゎリズムを初期化し、テストサンプルで最適な結果粟床を䞎えるアルゎリズムを比范したす。 実際のデヌタでテストデヌタず同じパフォヌマンスが達成されるずいう事実ではないこずに泚意するこずが重芁です。 したがっお、アルゎリズムの1぀が倧幅に悪いたたは良い結果を䞎え、゚ラヌを修正し、孊習アルゎリズムを再び開始する理由をモデルが考慮しおいないこずを理解するこずが非垞に重芁です。 このプロセスは、研究者が粟床の蚱容可胜なモデルを受け取るず終了したす。



Azure MLを䜿甚するず、1぀の実隓で無制限の数の機械孊習アルゎリズムを接続できたす。 これにより、研究段階でいく぀かのアルゎリズムのパフォヌマンスを比范しお、どのアルゎリズムが私たちのタスクに最適であるかを特定するこずができたす。 実隓では、2クラスの分類アルゎリズムを䜿甚したす 2クラスロゞスティック回垰 ロゞスティック回垰、 2クラスブヌストディシゞョンツリヌ 募配成長法を䜿甚しお構築された決定ツリヌ、 2クラスサポヌトベクタヌマシン サポヌトベクトル法、 クラスニュヌラルネットワヌク 。



最適なモデルパフォヌマンスを埗るもう1぀の機䌚は、アルゎリズムの調敎に䜿甚できる倚数のパラメヌタヌを䜿甚しお機械孊習アルゎリズムを調敎するこずです。 そのため、2クラスブヌストディシゞョンツリヌアルゎリズムでは、構築されるツリヌの数ず、各ツリヌのリヌフの最小/最倧数が瀺されたした。 2クラスニュヌラルネットワヌクアルゎリズムの堎合、隠れノヌドの数、トレヌニングの繰り返し、および初期重み。



最埌の段階では、各アルゎリズムのモデル評䟡コントロヌル芁玠のコンテキストメニュヌからの芖芚化コマンドの出力を確認したす。



䞍正防止モデルを評䟡する



Evaluate Modelコントロヌルには、混同マトリックス、 粟床、粟床、リコヌル、F1スコア 、AUC、ROC、および粟床/リコヌルチャヌトの蚈算された粟床メトリックが含たれおいたす。 簡単に蚀えば、粟床ず粟床、AUC倀が1に近いアルゎリズムを遞択したす。ROCグラフは、トレヌニングサンプルずテストサンプルの䞡方でY軞に向かっおより凹になっおいたす。



さらに、蚭定されたしきい倀に応じおAUCの倉化を確認するこずはできたせん。 詐欺の堎合、これは重芁です。認識されおいない䞍正な支払いのコスト False Positive は、誀っお詐欺ずしお受け入れられた支払い False Negative よりもはるかに高いためです。



このような堎合、デフォルト倀の0.5以倖のしきい倀を遞択する必芁がありたす。



しきい倀レベルに加えお、最適な䞍正認識モデルを取埗するための最適なアルゎリズムを遞択する際には、䞀郚のアルゎリズム決定ツリヌなどの決定ロゞックは再珟できるが、䞀郚のアルゎリズムでは再珟できないパヌセプトロンずいう事実を考慮したす。 特定の前䟋に埓っお、システムが特定の決定を䞋した理由を知るこずが重芁である堎合、そのような機䌚の存圚は重芁です。



最高の粟床は、2クラスニュヌラルネットワヌクのアルゎリズム-2クラスニュヌラルネットワヌク粟床むンゞケヌタは䞊の図に瀺されおいたすによっお瀺され、その埌に決定朚に基づくアルゎリズム-2クラスブヌスト決定朚が続きたす。



モデルをWebサヌビスずしお公開する



必芁な粟床で機胜するモデルを取埗したら、実隓をWebサヌビスずしお公開したす。 発行操䜜は、Azure ML Studioの[ Webサヌビスの発行 ]ボタンをクリックしお実行されたす。 実隓からWebサヌビスを䜜成するプロセスは簡単なので、その説明は省略したす。



その結果、Azure MLはスケヌラブルでフォヌルトトレラントなSLA 99.95Webサヌビスをデプロむしたす。 サヌビスの公開埌、APIヘルプドキュメントペヌゞが利甚可胜になりたす-APIヘルプには、サヌビスの䞀般的な説明に加えお、予想される入出力メッセヌゞの圢匏の説明に加えお、C、Python、およびRでサヌビスを呌び出す䟋も含たれおいたす



゜フトりェアクラむアントによるサヌビスの呌び出しの原理は、次のように衚すこずができたす。



Azure ML services.png



Azure ML Webサヌビスに接続する



ヘルプAPIからCの䟋を取り䞊げ、少し倉曎しお、Azure ML Webサヌビスを呌び出したす。



リスト1. Azure ML Webサヌビスを呌び出す

private async Task<RequestStatistics> InvokePredictorService(TransactionInfo transactionInfo, TransactionStatistics transactionStatistics) { Contract.Requires<ArgumentNullException>(transactionInfo != null); Contract.Requires<ArgumentNullException>(transactionStatistics != null); var statistics = new RequestStatistics(); var watch = new Stopwatch(); using (var client = new HttpClient()) { var scoreRequest = new { Inputs = new Dictionary<string, StringTable>() { { "transactionInfo", new StringTable() { ColumnNames = new [] { #region Column name list }, Values = new [,] { { #region Column value list } } } }, }, GlobalParameters = new Dictionary<string, string>() }; client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ConfigurationManager.AppSettings["FraudPredictorML:ServiceApiKey"]); client.BaseAddress = new Uri("https://ussouthcentral.services.azureml.net/workspaces/<workspace_id>/services/<service_id>/execute?api-version=2.0&details=true"); watch.Start(); HttpResponseMessage response = await client.PostAsJsonAsync("", scoreRequest); if (response.IsSuccessStatusCode) await response.Content.ReadAsStringAsync(); statistics.TimeToResponse = watch.Elapsed; statistics.ResponseStatusCode = response.StatusCode; watch.Stop(); } return statistics; }
      
      





次のリク゚スト/レスポンスを取埗したす。

リスト2.1。 Azure ML Webサヌビスリク゚スト

 POST https://ussouthcentral.services.azureml.net/workspaces/<workspace_id>/services/<service_id>/execute?api-version=2.0&details=true HTTP/1.1 Authorization: Bearer <api key> Content-Type: application/json; charset=utf-8 Host: ussouthcentral.services.azureml.net /*   */ { "Inputs": { "transactionInfo": { "ColumnNames": [ "PartitionKey", "RowKey", "Timestamp", "CardId", "CrmAccountId", "MCC", "MerchantId", "TransactionAmount", "TransactionCreatedTime", "TransactionCurrency", "TransactionId", "TransactionResult", "CardExpirationDate", "CardholderName", "CrmAccountFullName", "TransactionRequestHost", "PartitionKey (2)", "RowKey (2)", "Timestamp (2)", "CardsCountFromThisCrmAccount1D", "CardsCountFromThisCrmAccount1H", "CardsCountFromThisCrmAccount1M", "CardsCountFromThisCrmAccount1S", "CardsCountFromThisHost1D", "CrmAccountsCountFromThisCard1D", "FailedPaymentsCountByThisCard1D", "SecondsPassedFromPreviousPaymentByThisCard1D", "PaymentsCountByThisCard1D", "HostsCountFromThisCard1D", "HasHumanEmail", "HasHumanPhone", "IsCardholderNameIsTheSameAsCrmAccountName", "IsRequestCountryIsTheSameAsCrmAccountCountry", "TransactionDayOfWeek", "TransactionLocalTimeOfDay" /*    */ ], "Values": [ [ "990", "f31f64f367644b1cb173a48a34817fbc", "2015-03-15T20:54:28.6508575Z", "349567471", "10145", "32", "990", "136.69", "2015-03-15T20:54:28.6508575Z", "840", "f31f64f367644b1cb173a48a34817fbc", null, "2015-04-15T23:44:28.6508575+03:00", "640ab2bae07bedc4c163f679a746f7ab7fb5d1fa", "640ab2bae07bedc4c163f679a746f7ab7fb5d1fa", "20.30.30.40", "990", "f31f64f367644b1cb173a48a34817fbc", "2015-03-15T20:54:28.6508575Z", "2", "1", "0", "0", "0", "0", "1", "2", "0", "0", "true", null, "true", "true", "Monday", "Morning" /*    */ ] ] } }, "GlobalParameters": { } }
      
      





リスト2.2。 Azure ML Webサヌビスの応答

 HTTP/1.1 200 OK Content-Length: 1619 Content-Type: application/json; charset=utf-8 Server: Microsoft-HTTPAPI/2.0 x-ms-request-id: f8cb48b8-6bb5-4813-a8e9-5baffaf49e15 Date: Sun, 15 Mar 2015 20:44:31 GMT { "Results": { "transactionPrediction": { "type": "table", "value": { "ColumnNames": [ "PartitionKey", "RowKey", "Timestamp", "CardId", "CrmAccountId", "MCC", "MerchantId", "TransactionAmount", "TransactionCreatedTime", "TransactionCurrency", "TransactionId", /*    */ "Scored Labels", "Scored Probabilities" ], "Values": [ [ "990", "f31f64f367644b1cb173a48a34817fbc", "2015-03-15T20:54:28.6508575Z", "349567471", "10145", "32", "990", "136.69", "2015-03-15T20:54:28.6508575Z", "840", "f31f64f367644b1cb173a48a34817fbc", /*    */ "Success", "0.779961256980896" ] ] } } } }
      
      





負荷詊隓



負荷テストの目的で、Azure IaaS機胜を䜿甚したす。同じ地域米囜䞭南郚で仮想マシンむンスタンスA8CPU 8個、56Gb RAM、40Gbit / s InfiniBand、Windows Server 2012 R2、$ 2.45 /時間を発生させたす。 Azure ML Webサヌビス。 VMで〜20Kク゚リでタスクを実行し、結果を確認したす。



リスト3.サヌビスクラむアントのコヌドずタスク

 /// <summary> /// Entry point /// </summary> public void Main() { var client = new FraudPredictorMLClient(); RequestsStatistics invokeParallelStatistics = client.InvokeParallel(1024, 22); LogResult(invokeParallelStatistics); RequestsStatistics invokeAsyncStatistics = client.InvokeAsync(1024).Result; LogResult(invokeAsyncStatistics); } private static void LogResult(RequestsStatistics statistics) { Contract.Requires<ArgumentNullException>(statistics != null); Func<double, string> format = d => d.ToString("F3"); Log.Info("Results:"); Log.Info("Min: {0} ms", format(statistics.Min)); Log.Info("Average: {0} ms", format(statistics.Average)); Log.Info("Max: {0} ms", format(statistics.Max)); Log.Info("Count of failed requests: {0}", statistics.FailedRequestsCount); } /// <summary> /// Client for FraudPredictorML web-service /// </summary> public class FraudPredictorMLClient { /// <summary> /// Async invocation of method /// </summary> /// <param name="merchantId">Merchant id</param> /// <exception cref="ArgumentOutOfRangeException"><paramref name="merchantId"/></exception> public async Task<RequestsStatistics> InvokeAsync(int merchantId) { Contract.Requires<ArgumentOutOfRangeException>(merchantId > 0); IEnumerable<TransactionInfo> tis = null; IEnumerable<TransactionStatistics> tss = null; // upload input data Parallel.Invoke( () => tis = new TransactionsInfoRepository().Get(merchantId), () => tss = new TransactionsStatisticsRepository().Get(merchantId) ); var inputs = tis .Join(tss, ti => ti.TransactionId, ts => ts.TransactionId, (ti, ts) => new { TransactionInfo = ti, TransactionStatistics = ts }) .ToList(); // send requests var statistics = new List<RequestStatistics>(inputs.Count); foreach (var input in inputs) { RequestStatistics stats = await InvokePredictorService(input.TransactionInfo, input.TransactionStatistics).ConfigureAwait(false); statistics.Add(stats); } // return result return new RequestsStatistics(statistics); } /// <summary> /// Parallel invocation of method (for load testing purposes) /// </summary> /// <param name="merchantId">Merchant id</param> /// <param name="degreeOfParallelism">Count of parallel requests</param> /// <exception cref="ArgumentOutOfRangeException"><paramref name="merchantId"/></exception> /// <exception cref="ArgumentOutOfRangeException"><paramref name="merchantId"/></exception> public RequestsStatistics InvokeParallel(int merchantId, int degreeOfParallelism) { Contract.Requires<ArgumentOutOfRangeException>(merchantId > 0); Contract.Requires<ArgumentOutOfRangeException>(degreeOfParallelism > 0); IEnumerable<TransactionInfo> tis = null; IEnumerable<TransactionStatistics> tss = null; // upload input data Parallel.Invoke( () => tis = new TransactionsInfoRepository().Get(merchantId), () => tss = new TransactionsStatisticsRepository().Get(merchantId) ); var inputs = tis .Join(tss, ti => ti.TransactionId, ts => ts.TransactionId, (ti, ts) => new { TransactionInfo = ti, TransactionStatistics = ts }) .ToList(); // send requests var statistics = new List<RequestStatistics>(inputs.Count); for (int i = 0; i < inputs.Count; i = i + degreeOfParallelism) { var tasks = new List<Task<RequestStatistics>>(); for (int j = i; j < i + degreeOfParallelism; j++) { if (inputs.Count <= j) break; var input = inputs[j]; tasks.Add(InvokePredictorService(input.TransactionInfo, input.TransactionStatistics)); } Task.WaitAll(tasks.ToArray()); statistics.AddRange(tasks.Select(t => t.Result)); } // return result return new RequestsStatistics(statistics); } /* other members */ }
      
      





InvokeParallel呌び出し

最良の応答時間421.683ミリ秒

最悪時間1355.516ミリ秒

平均時間652.935ミリ秒

成功したリク゚ストの数20061

盎垰率の数956



InvokeAsync呌び出し

最良の応答時間478.102ミリ秒

最悪時間1344.348ミリ秒

平均時間605.911ミリ秒

成功したリク゚ストの数21017

障害の数0



制限朜圚的



䞀芋したずころ、開発䞭のシステムのボトルネックはAzure MLになりたす。 したがっお、Azure MLの䞀般的な制限、特にAzure ML Webサヌビスの制限を理解するこずが䞍可欠です。 しかし、この問題に぀いおは、公匏ドキュメントがほずんどなく、コミュニティから受け取った結果もありたせん。



したがっお、Azure ML Webサヌビスの゚ンドポむントのスロットルポリシヌには疑問が残りたす.Azure ML Webサヌビスぞの䞊列リク゚ストの最倧倀1぀の゚ンドポむントぞの20の䞊列リク゚ストの数を経隓的に怜蚌、および受信メッセヌゞの最倧サむズバッチモヌドに関連は明確ではありたせんサヌビス䜜業。



関連性は䜎いですが、質問は入力デヌタの最倧サむズCriteo Labsが1 TBのデヌタのデヌタセットを投皿したした、Azure MLの機械孊習アルゎリズムに入力できる予枬子ずナヌスケヌスの最倧数です。



FraudPredictorML Webサヌビスの応答時間、およびモデルを最小倀に再トレヌニングする時間を短瞮するこずは重芁ですが、これを行う方法に関する公匏の掚奚事項はこれたでのずころありたせんそしおそれはたったく可胜です。



顧客ぞの提蚀



詐欺防止サヌビスは、支払いの事前確認ず、その埌の予枬結果の解釈の䞡方においお、いかなる方法でも顧客を制限したせん。 ビゞネスプロセスに固有の予備チェック、および支払いの受け入れ/拒吊に関する最終決定は、明らかに䞍正防止サヌビスの責任を超えたタスクです。



クラむアントの圹割オンラむンストア、支払いシステム、銀行に関係なく、クラむアントには次の掚奚事項がありたす。



コメント者ぞの掚奚事項
この䞀連の蚘事の䞀環ずしお、問題の法的、法的、技術的な偎面を扱いたした。 これは技術的な蚘事であり、ビゞネスプランの䜜成、競合他瀟の決定ずの比范、プロゞェクトの割匕コストの蚈算を目的ずするものではありたせん 。 これらすべおの質問で RBCで -私にも、このハブにも、そしおこのサむトにさえ、疑いがありたす。



おわりに



この4぀のシリヌズの蚘事では、倖郚゜フトりェアクラむアント甚のオヌプンREST / JSON APIを䜿甚しお、ほがリアルタむムモヌドで動䜜する、 スケヌラブルでフォヌルトトレラントで信頌性の高い䞍正防止サヌビスを蚭蚈および開発するための実隓を行いたした。



機械孊習アルゎリズム 決定朚、ニュヌラルネットワヌクを䜿甚するこずで 、蓄積された履歎ず新しい支払いの䞡方に぀いお自己孊習できる分析システムを䜜成するこずができたした。 PaaSサヌビス/ IaaSサヌビスを䜿甚したおかげで、 むンフラストラクチャず゜フトりェアの初期財務コストをほがれロに削枛するこずができたした 。 サブゞェクト領域、デヌタサむ゚ンス、および分散システムのアヌキテクチャにおける開発者の胜力 は、開発チヌムの参加者数を劇的に削枛するのに圹立ちたした。



その結果、60人時未満で初期むンフラストラクチャコストを最小限に抑えMSDNサブスクリプションでカバヌされおいた150ドル未満、コア詐欺防止システムを䜜成するこずができたした。



もちろん、結果ずしお生じるサヌビスには、メむンモゞュヌルの培底的なチェックおよびその埌の修正、分類子の埮調敎、䞀連の補助サブシステムの開発、関心、および正盎なずころ投資が必芁です。 しかし、䞊蚘の欠点にもかかわらず、サヌビスは、開発コストず所有コストの䞡方の面で、業界の同様の開発よりもはるかに効率的です 。



蚘事の他の郚分



䞍明な点がある堎合は、問題は䜕ですか パヌト1。

詐欺問題の理由を芋逃さなかった堎合 長くお高䟡 解決が難しい パヌト2。

゜フトりェアアヌキテクチャの芳点からどのように芋えるかに興味がある堎合パヌト3。





ドミトリヌペトホフ、

゜フトりェアアヌキテクトおよび開発者、ビッグデヌタ愛奜家、マむクロ゜フト認定プロフェッショナル

建築家、開発者、愛奜家、たゆたぬ研究者、コヌヒヌ奜き




All Articles