毎日ますます多くの注文が寄せられており、それらは何らかの形でパフォーマーに分配される必要があります。 複雑なことは何もないように思えます。注文が来たので、それをクライアントに渡します。 しかし、すべてが見た目ほど単純ではありません。 私たちのクライアントには決まった勤務スケジュールがなく、いつでも好きなときに、ほぼすべての注文を拒否することができます(悲しいかな、クライアントが頻繁に行うことです)。 したがって、注文の配信は、私たちが取り組んでいる最も難しいタスクの1つです。
主な課題
最大の問題の1つは、手動配布です。 迅速に配信する必要がある注文が大量に蓄積されます。 これらの注文はどこから来ますか?
- クライアントは、今日の最後の瞬間にクリーニングを注文できます。
- クライアントは注文をいつでも転送できます。
- クリーナーは最後の瞬間に注文から飛び降りることができます。
このような注文を「直前」と呼びます。 それらは非常に多くあり、クライアントがアプリケーションでそれらを分解することを期待する価値はありません。 したがって、それらを手動で配布します。 コールセンターの従業員は顧客を呼び出して注文を提供します。 これは面倒なプロセスであり、時間とリソースがかかります。
1日から50件の注文が手動で配信されますが、一般的には、常に300程度の頻度でadishが発生します。
別の問題は未処理の注文です。 毎日、注文の約2%を処理することはできません。なぜなら、その上で診療所を見つける時間がないか、時間がないからです。 それらを満たさない場合は、クライアントに無料のクリーニングサービスを提供します。 毎日約20回の無料クリーニングを行いますが、シーズン中はこの数値が200〜300に達する可能性があります。
これらの問題をどのように解決しますか?1.臨床応用クライナーは、アプリケーションを使用して注文を個別に分解できます。このアプリケーションには、毎日注文が入ったテープがあります。
これらのテープは、クリーナーのセグメントごとに異なります。 たとえば、新規参入者には通常の顧客の注文は表示されません。 この可視性をマトリックスで調整します。 数字は、クライアントがアプリケーションで注文を見る時間を意味します。
他にも制限があり、それらに従います。それぞれの制限はメトリックに影響します。
2.自動割り当て注文の急増に伴い、「不良」注文の数が増えています。 「不良」とは、最終的に失敗またはキャンセルされるものです。 私たちはこれで何かをしなければならなかったので、そのような注文を予測するためにMLを誇大宣伝して遊ぶことにしました。
特に賢くはなりませんでした。 私たちは約30の異なる兆候を思いつきました:注文が作成された瞬間からの時間、最後の注文からの時間、以前に注文をキャンセルした顧客の数、彼が常に私たちにお金をもたらした金額などです。
準備ができたライブラリを取りました
import numpy as np import pandas as pd from sklearn.ensemble import GradientBoostingClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import roc_auc_score
アップロードされた機能
features = pd.read_csv('train/train.csv', header = 0) X = features.drop(['cancel'], axis=1) y = features.cancel
サンプルをトレーニングとテストに分けました
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, random_state=1234)
勾配ブースティングの訓練
gb_clf = GradientBoostingClassifier(learning_rate=0.2, n_estimators=70, max_depth=3, verbose=False, random_state=241) gb_clf.fit(X_train, y_train)
テストサンプルで確認
y_true = y_test y_pred = final_gb_clf.predict_proba(X_test)[:,1] roc_auc=roc_auc_score(y_true, y_pred)
roc-auc:0.881929812245
予測をしました
features = pd.read_csv('predict_features.csv', header = 0, index_col='order_id') y_predict = gb_clf.predict_proba(features)[:,1] print(y_pred)
良いroc-auc = 0.88が得られました。 そしてそれを生産に投入しました。
これで、毎朝、データベースで注文キャンセルの確率の推定値を受け取ります。
専門的には、確率を推定するためのしきい値として0.7を選択しました。
現在、ビジネスプロセスでモデルを積極的に使用しています。 たとえば、このような悪い注文は事前に電話され、クライアントアプリケーションで別のフローがあります。
さまざまなテストについて、それを削減することもありますが、これはビジネスメトリックに影響します。
たとえば、4月7日に彼らは大量の未処理の注文を受け取りました。その前にモデルがオフになったためです。
注文を自動的に配信することにしました。 しかし、その後、彼らはどのクライアントがいつ動作するかわからないという事実に直面しました。
私たちは彼らのスケジュールを打ち切りました。 しかし、その結果、原則として、クリナーはそれに従わなかったことが判明しました。 そして、それらを強制することは私たちの原則に反しています。
もう一度、ML。 彼らは同様のモデルを作成しましたが、臨床医が働く確率を予測しました。 現在、2つのモデルが回転しています。注文とクリーナーに関する最新情報を毎日入手して配布できます。
アルゴリズム配信される注文を探しています。キャンセルの確率の推定値を使用して、注文から「悪い」注文を削除します。 次に、クリーナーの注文ごとに選択します。 まず、クライアントが見たい人-選択したもの-とそれらを注文に割り当てます。 彼らがすべて忙しい場合は、クライアントがすでに持っている他のクリニックを選択しますが、どうしても評価されませんでした。 彼らが忙しい場合は、最寄りの無料のクリーナーを探してください。
結果手動配布の大幅な削減を期待し、それを半減することができました。 また、自動割り当てによって未処理の注文の割合が減少すると考えましたが、この問題を解決する主な貢献は注文をキャンセルする確率を評価するモデルによって行われたため、これは起こりませんでした。
結論タスクでMLを使用することを恐れないでください-単純なモデルを作成することは難しくありません。 1人のアナリストと協力してモデルを作成するのに数日しかかかりませんでした。 しかし、今ではビジネスプロセスで使用できます。
コメント欄で質問してください。喜んでお答えします。