कैसे करें हवाईजहाज का पूर्वानुमान?

सभी को नमस्कार!

यह तीसरा लेख है कि मैं कैसे एक छोटी और आरामदायक सेवा करता हूं, जो सिद्धांत रूप में यात्रा की योजना बनाने में मदद करनी चाहिए। इस लेख में, मैं Clickhouse, Catboost और 1TB * डेटा के साथ हाथ पर एयरफ़ेयर की भविष्यवाणी करने के बारे में बात करूँगा।

छवि

ये किसके लिये है?


Cheapster.travel की मुख्य विशेषताओं में से एक जटिल मार्गों का लचीला संयोजन है ( पिछले लेख में अधिक )। "सब-के-सब" के संयोजन के लिए, एक एग्रीगेटर कैश का उपयोग किया जाता है, जिसमें हमेशा ऐसे टिकट नहीं होते हैं जिन्हें शायद ही कभी खोजा जाता है, और वे जटिल मार्गों के निर्माण में कमी करते हैं। उन। गर्म टिकट जिस पर (सस्ते) जटिल मार्ग के आधार के लिए वहाँ है, लेकिन (, सबसे लोकप्रिय दिशा पर नहीं नियमित रूप से मूल्य पर) "सामान्य" टिकट के क्षेत्रों के लिए पर्याप्त नहीं 1-2। यह ऐसी समस्या थी जिसने मुझे एक ऐसे मॉडल का निर्माण करने की आवश्यकता पैदा की जो एयरफ़ेयर की भविष्यवाणी कर सके।

कार्य की औपचारिकता


  • आपको सीधी उड़ानों के लिए टिकट की भविष्यवाणी करने में सक्षम होना चाहिए (केवल गोल-यात्रा)
  • आपको डेटाबेस में (सामान्य परिदृश्य) नियमित रूप से भविष्यवाणी करने और संग्रहीत करने में सक्षम होना चाहिए
  • "फ्लाई पर" (जटिल परिदृश्य) की भविष्यवाणी करने में सक्षम होने की आवश्यकता है
  • यह सब बहुत सीमित हार्डवेयर पर होता है - इसलिए, बड़ी मात्रा में डेटा के साथ न्यूनतम हेरफेर

यह कैसे करना है?


शुरू करने के लिए, हम मॉडल को प्रशिक्षित करेंगे: डेटासेट तैयार करें, कॉलम में सुविधाओं की अधिकतम संख्या पर प्रकाश डालते हुए, इसे tsv पर अपलोड करें, डेटाफ्रैम / पूल में लोड करें , विश्लेषण करें, मापदंडों का चयन करें ... रोकें, हमारे पास बहुत अधिक डेटा है और वे मेमोरी में फिट नहीं होते हैं , - निम्नलिखित त्रुटियां पकड़ें:

MemoryError: Unable to allocate array with shape (38, 288224989) and data type float64
OSError: [Errno 12] Cannot allocate memory

इस सीमा के आसपास जाने के लिए, छोटे टुकड़ों में पुनरावृति सीखना आवश्यक था, यह इस तरह दिखता है:

model = CatBoostRegressor(cat_features=cat_features,
          iterations=100,
          learning_rate=.5,
          depth=10,
          l2_leaf_reg=9,
          one_hot_max_size=5000)

for df in tqdm(pd.read_csv('history.tsv', sep='\t', 
                           na_values=['\\N'], 
                           chunksize=2_000_000)):
    ...
     model.fit(X=df[df.columns[:-1]][:train_size].values,
                  y=df['price'][:train_size].values,
                  eval_set=eval_pool,
                  verbose=False,
                  plot=False,
                  init_model=model) # <--        

परिणाम सामान्य रूप से RMSE ~ 100 वाला मॉडल था , मैं इस तरह के परिणाम से खुश होता, लेकिन पूर्वानुमानों के थोड़े से विश्लेषण और "सामान्यीकरण" के बाद (नकारात्मक और मूल्य जो इतिहास में न्यूनतम / अधिकतम मूल्यों से बहुत भिन्न होते हैं, उन्हें ऐतिहासिक कीमतों की संगत सीमाओं में लाया जाता है) । उसके बाद, लक्ष्य मीट्रिक ~ 80 है, इस तथ्य को ध्यान में रखते हुए कि, मेरे अनुभव में, एयरलाइन टिकटों के मूल्य निर्धारण में लगभग कोई तर्क और सामान्य ज्ञान नहीं है।

ऐसी विशेषताएं जो कीमत को सबसे अधिक प्रभावित करती हैं:

छवि

"शहरों के बीच की दूरी" सुविधाओं के लिए आंकड़े:

छवि

महान, हमारे पास एक मॉडल है - अब इसका उपयोग करने का समय है। सबसे पहले, KX मॉडल को जोड़ें, यह एक साधारण विन्यास के साथ किया जाता है:

कॉन्फ़िग
<models>
    <model>
        <!-- Model type. Now catboost only. -->
        <type>catboost</type>
        <!-- Model name. -->
        <name>price</name>
        <!-- Path to trained model. -->
        <path>/opt/models/price_iter_model_2.bin</path>
        <!-- Update interval. -->
        <lifetime>0</lifetime>
    </model>
</models>


हम एक नियमित भविष्यवाणी प्रक्रिया बनाते हैं - यह अपाचे एयरफ्लो का उपयोग करके करना काफी आसान है।

परिणामी DAG इस तरह दिखता है
image
DAGa ( Airflow):

SimpleHttpOperator
insert_ow_in_tmp = SimpleHttpOperator(
    task_id='insert_ow_in_tmp',
    http_conn_id='clickhouse_http',
    endpoint=dll_endpoint,
    method='POST',
    data=sql_templates.INSERT_OW_PREDICTIONS_IN_TMP,
    pool='clickhouse_select',
    dag=dag
)



साधारण चक्के का उपयोग करते हुए "उड़ान पर" भविष्यवाणी के लिए:

select origin, destination, date,
         modelEvaluate('price', *)  predicted_price -- ,   
from log.history

+--------+-------------+------------+-----------------+
| origin | destination | date       | predicted_price |
+--------+-------------+------------+-----------------+
| VKO    | DEB         | 2020-03-20 | 3234.43244      |
+--------+-------------+------------+-----------------+
--* ,   

मैं इस तथ्य को प्रतिस्थापित करना चाहता हूं कि ऐसा दृष्टिकोण चुना गया है, न केवल इसलिए कि इसे लागू करना आसान है - अभी भी प्लस हैं:

  • केएच के बाहर डेटा अपलोड करने की आवश्यकता नहीं है (इसका मतलब है कि लोहे पर लोड पर तेजी से और कम खर्चीला है)
  • Etl प्रक्रियाओं को करने की आवश्यकता नहीं है (आसान = अधिक विश्वसनीय)

हम एपीआई और फ्रंट-एंड को थोड़ा ठीक करते हैं और लंबे समय से प्रतीक्षित पूर्वानुमान प्राप्त करते हैं।

ये भविष्यवाणियां भी एयरलाइन टिकट मूल्य इतिहास में अच्छी तरह से फिट होती हैं:

छवि

कार्यक्षमता सस्ते में उपलब्ध है ।travel / history (यह मोबाइल पर कुटिलता से खुल जाएगा, केवल बड़ी स्क्रीन)।

यह सब, एक उत्पादक दिन है!

पिछले लेख


छुट्टी से पहले हवाई टिकट चुनने की समस्या
को हल करने का प्रयास # 2 से पहले हवाई टिकट चुनने की समस्या को हल करने का प्रयास

एक और दिलचस्प विशेषता


कठिन मार्गों का संयोजन
जटिल टिकट (त्रिकोण)

PS
महत्वपूर्ण! इन भविष्यवाणियों को किसी ऐसी चीज़ के रूप में न लें जो आपको खरीदारी की तारीख चुनने में मदद करती है - मॉडल सही ढंग से भविष्यवाणी नहीं कर सकता है, इसके अलावा, इसकी पर्याप्तता मेरे या किसी और द्वारा सत्यापित नहीं की गई है (सभी अपने जोखिम पर और जोखिम, बिना गारंटी के)।

1TB * - यदि आप tsv पर अपलोड करते हैं, तो KX में यह कम परिमाण का क्रम लेता है।

युपीडी:

कैटबॉस्ट बंडलों का उपयोग करते समय शीर्ष अवज्ञाकारी मुद्दे - क्लिकहाउस


  1. केएच में स्पष्ट विशेषताएं आदेश को बदलते हैं और अंत में बन जाते हैं (और प्रशिक्षण के दौरान उस क्रम में नहीं);
  2. modelEvaluate रिटर्न null - आपको यह जांचने की आवश्यकता है कि क्या आपके पास फीचर्स में शून्य मान हैं, यदि आपको उन्हें नैनो से बदलने की आवश्यकता है
  3. नए संस्करणों में केएक्स के लिए कॉन्फ़िगर किए गए प्रारूप के साथ एक अस्पष्ट क्षण है, यहां वर्णित है

All Articles