मशीन लर्निंग का उपयोग करके जंगल की आग की भविष्यवाणी

स्रोत नोड: 1194873

इस लेख का तात्पर्य क्या है?

वन, झाड़ी, या शाकाहारी आग, किसी भी अनियंत्रित और गैर-निर्धारित दहन या प्राकृतिक सेटिंग जैसे कि जंगल, घास के मैदान आदि में पौधों को जलाने के रूप में वर्णित किया जा सकता है। इस लेख में हम यह निर्धारित नहीं कर रहे हैं कि जंगल में आग लगेगी या नहीं। या नहीं, हम कुछ विशेषताओं के आधार पर जंगल की आग के भरोसे का अनुमान लगा रहे हैं।

जंगल की आग की भविष्यवाणी एमएल का उपयोग करना
छवि 1

हमें वन अग्नि भविष्यवाणी मॉडल की आवश्यकता क्यों है?

खैर, पहला सवाल यह उठता है कि हमें उस विशेष क्षेत्र में जंगल की आग की भविष्यवाणी करने के लिए मशीन लर्निंग की भी आवश्यकता क्यों है? तो, हाँ यह प्रश्न मान्य है कि अनुभवी वन विभाग जो लंबे समय से इन मुद्दों से निपट रहा है, एमएल की आवश्यकता क्यों है, यह कहते हुए कि उत्तर काफी सरल है कि अनुभवी वन विभाग 3- पर जांच कर सकता है- उनके मानव दिमाग से 4 पैरामीटर लेकिन दूसरी ओर एमएल कई मापदंडों को संभाल सकता है चाहे वह अक्षांश, देशांतर, उपग्रह, संस्करण और क्या न हो, इसलिए एक पैरामीटर के इस बहु-संबंध से निपटना जो जंगल में आग के लिए जिम्मेदार है हमें निश्चित रूप से ML की आवश्यकता है!

सामग्री की तालिका

  1. आवश्यक पुस्तकालयों का आयात करना
  2. अन्वेषणात्मक डेटा विश्लेषण
  3. डेटा की सफाई
  4. मॉडल विकास (RandomForestRegressor)
  5. मॉडल ट्यूनिंग (रैंडमसर्चसीवी)
  6. bz2 मॉड्यूल (बड़ा बोनस)

पुस्तकालयों का आयात करना

डीटी के रूप में आयात डेटा समय पीडी के रूप में पांडा आयात करें एनपी के रूप में आयात करें एसएनएस आयात के रूप में सीबॉर्न आयात करें matplotlib.pyplot plt% matplotlib के रूप में sklearn से इनलाइन।

जंगल में आग की खोज का डेटासेट पढ़ना (.csv)

वन = pd.read_csv ('fire_archive.csv')

आइए हमारे डेटासेट पर एक नज़र डालें (2.7+ एमबी)

वन.सिर ()

आउटपुट:

जंगल में आग की भविष्यवाणी के लिए डेटासेट पढ़ना

डाटा अन्वेषण

वन.आकार

आउटपुट:

(36011, 15)

यहाँ हम देख सकते हैं कि हमारे पास है 36011 पंक्तियाँ और 15 कॉलम हमारे डेटासेट में स्पष्ट रूप से, हमें बहुत सारी डेटा सफाई करनी होगी लेकिन पहले

आइए इस डेटासेट को और एक्सप्लोर करें

one.columns

आउटपुट:

सूचकांक (['अक्षांश', 'देशांतर', 'चमक', 'स्कैन', 'ट्रैक', 'acq_date', 'acq_time', 'उपग्रह', 'उपकरण', 'आत्मविश्वास', 'संस्करण', 'bright_t31' , 'एफआरपी', 'डेनाइट', 'टाइप'], डीटाइप = 'ऑब्जेक्ट')

फ़ॉरेस्ट फायर पूर्वानुमान डेटासेट में शून्य मानों की जाँच करना

वन.isnull().sum()

आउटपुट:

अक्षांश 0 देशांतर 0 चमक 0 स्कैन 0 ट्रैक 0 acq_date 0 acq_time 0 उपग्रह 0 उपकरण 0 आत्मविश्वास 0 संस्करण 0 Bright_t31 0 frp 0 दिन रात 0 प्रकार 0 dtype: int64

सौभाग्य से, हमारे पास इस डेटासेट में कोई शून्य मान नहीं है

वन.वर्णन ()

आउटपुट:

डेटासेट का वर्णन करना
plt.figure(figsize=(10, 10)) एसएनएस.heatmap(forest.corr(),annot=True,cmap='viridis',linewidths=.5)

आउटपुट:

डेटासेट के लिए हीटमैप

डेटा की सफाई

वन = वन.ड्रॉप (['ट्रैक'], अक्ष = 1)

यहां हम ट्रैक कॉलम छोड़ रहे हैं

नोट: वैसे डेटासेट से हमें यह पता नहीं चल रहा है कि जंगल में आग लगती है या नहीं, हम जंगल में आग लगने का विश्वास तलाशने की कोशिश कर रहे हैं। वे एक ही चीज़ प्रतीत हो सकते हैं लेकिन उनके बीच बहुत छोटा सा अंतर है, उसे खोजने का प्रयास करें 🙂

श्रेणीबद्ध डेटा ढूँढना

प्रिंट ("स्कैन कॉलम") प्रिंट (वन ['स्कैन']। value_counts ()) प्रिंट () प्रिंट ("एकक्यू_टाइम कॉलम") प्रिंट (वन ['acq_time']। value_counts ()) प्रिंट () "उपग्रह स्तंभ") प्रिंट (वन ['उपग्रह']। value_counts ()) प्रिंट () प्रिंट ("इंस्ट्रूमेंट कॉलम") प्रिंट (वन ['इंस्ट्रूमेंट']। value_counts ()) प्रिंट () प्रिंट ("द) संस्करण स्तंभ") प्रिंट (वन ['संस्करण']। value_counts ()) प्रिंट () प्रिंट ("द डेनाइट कॉलम") प्रिंट (वन ['डेनाइट']। value_counts ()) प्रिंट ()

आउटपुट:

स्कैन कॉलम 1.0 8284 1.1 6000 1.2 3021 1.3 2412 1.4 1848 1.5 1610 1.6 1451 1.7 1281 1.8 1041 1.9 847 2.0 707 2.2 691 2.1 649 2.3 608 2.5 468 2.4 433 2.8 422 3.0 402 2.7 366 2.9 361 2.6 347 3.1 259 3.2 244 3.6 219 3.4 203 3.3 203 3.8 189 3.9 156 4.7 149 4.3 137 3.5 134 3.7 134 4.1 120 4.6 118 4.5 116 4.2 108 4.0 103 4.4 100 4.8 70 64 506 851 नाम: स्कैन, dtype: int454 AQC_TIME COLUMN 631 122 612 423 574 448 563 1558 1 635 1 ... 1153 1 302 1 1519 1 662 64 20541 15470 नाम: acq_time, लंबाई: 64, dtype: int36011 सैटेलाइट कॉलम Aqua 64 टेरा 6.3 नाम: सैटेलाइट, dtype: int36011 इंस्ट्रूमेंट कॉलम MODIS 64 नाम: इंस्ट्रूमेंट, dtype: int28203 संस्करण स्तंभ 7808 64 नाम: संस्करण, dtype: intXNUMX दिन रात स्तंभ D XNUMX N XNUMX नाम: दिन रात, dtype: intXNUMX

उपरोक्त आंकड़ों से, हम देख सकते हैं कि कुछ स्तंभों में केवल उनमें आवर्ती एक मूल्य, अर्थात वे हमारे लिए मूल्यवान नहीं हैं
इसलिए हम उन्हें पूरी तरह से गिरा देंगे।
इस प्रकार केवल उपग्रह और दिन रात कॉलम ही हैं श्रेणीबद्ध प्रकार.

ऐसा कहकर, हम इसका उपयोग भी कर सकते हैं स्कैन इसे एक में पुनर्गठित करने के लिए कॉलम श्रेणीबद्ध डेटा प्रकार स्तंभ. जो हम थोड़ी देर में करेंगे।

वन = वन.ड्रॉप (['साधन', 'संस्करण'], अक्ष = 1)
वन.सिर ()

आउटपुट:

वन अग्नि भविष्यवाणी के लिए डेटा के प्रमुख को देखते हुए
daynight_map = {"D": 1, "N": 0} satellite_map = {"Terra": 1, "Aqua": 0} फ़ॉरेस्ट ['डेनाइट'] = फ़ॉरेस्ट ['डेनाइट'].मैप (डेनाइट_मैप) फ़ॉरेस्ट[ 'उपग्रह'] = वन ['उपग्रह'] मानचित्र (उपग्रह_मानचित्र)
वन.सिर ()

आउटपुट:

डेटासेट की प्रारंभिक पंक्तियों को देखना

दूसरे कॉलम के प्रकार को देखते हुए

वन ['प्रकार']। value_counts ()

आउटपुट:

0 35666 2 335 3 10 नाम: प्रकार, dtype: int64

श्रृंखलाबद्ध वन और प्रकार डेटा फ्रेम

प्रकार = pd.get_dummies (वन ['प्रकार']) वन = pd.concat ([वन, प्रकार], अक्ष = 1)
वन = वन.ड्रॉप (['प्रकार'], अक्ष = 1) वन.सिर ()

आउटपुट:

फ़ॉरेस्ट और टाइप डेटाफ़्रेम को जोड़ने के बाद डेटा देखना

बेहतर समझ के लिए स्तंभों का नाम बदलना

वन = वन। नाम बदलें (कॉलम = {0: 'टाइप_0', 2: 'टाइप_2', 3: 'टाइप_3'})

बिनिंग विधि

  • अब मैंने उल्लेख किया है कि हम स्कैन कॉलम को श्रेणीबद्ध प्रकार में परिवर्तित कर रहे हैं, हम इसका उपयोग कर रहे हैं बिनिंग विधि।
  • इन स्तंभों की सीमा 1 से 4.8 थी
डिब्बे = [0, 1, 2, 3, 4, 5] लेबल = [1,2,3,4,5] वन ['scan_binned'] = pd.कट (वन ['स्कैन'], डिब्बे = डिब्बे, लेबल = लेबल)
वन.सिर ()

आउटपुट:

बिनिंग विधि लागू करना

डेटाटाइप को डेटटाइप में कनवर्ट करना स्ट्रिंग या NumPy.

वन ['acq_date'] = pd.to_datetime (वन ['acq_date'])

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

वन = वन.ड्रॉप (['स्कैन'], अक्ष = 1)

acq_date कॉलम की मदद से एक नया कॉलम वर्ष बनाना

वन ['वर्ष'] = वन ['acq_date'].dt.वर्ष वन.हेड ()

आउटपुट:

एक नया कॉलम बनाना

जैसे हमने ईयर कॉलम जोड़ा है वैसे ही हम जोड़ेंगे माह और दिन स्तंभ

वन ['माह'] = वन ['acq_date'].dt.महीना वन ['दिन'] = वन ['acq_date'].dt.day

डेटासेट के आकार की फिर से जाँच करना

वन.आकार

आउटपुट:

(36011, 17)

अब, जैसा कि हम देख सकते हैं कि दो और कॉलम जोड़े गए हैं जो डेट कॉलम का ब्रेकडाउन हैं

हमारे लक्ष्य चर को अलग करना

y = वन ['आत्मविश्वास'] फिन = वन। ड्रॉप (['आत्मविश्वास', 'acq_date', 'acq_time', 'bright_t31', 'type_0'], अक्ष = 1)

सहसंबंध के लिए एक बार फिर जाँच की जा रही है

plt.figure(figsize=(10, 10)) एसएनएस.heatmap(fin.corr(),annot=True,cmap='viridis',linewidths=.5)

आउटपुट:

सहसंबंध की जाँच करना
लेखक द्वारा छवि

आइए अब हमारे साफ और क्रमबद्ध डेटासेट देखें

फिन.हेड ()

आउटपुट:

साफ और क्रमबद्ध डेटा देखना

स्वच्छ डेटा को प्रशिक्षण और परीक्षण डेटासेट में विभाजित करना

Xtrain, Xtest, ytrain, ytest = train_test_split(fin.iloc[:, :500], y, test_size=0.2)

प्रतिरूप निर्माण

मॉडल निर्माण के लिए रैंडमफ़ॉरेस्ट रीग्रेसर का उपयोग करना

रैंडम_मॉडल = रैंडमफॉरेस्टरेग्रेसर(n_estimator=300, रैंडम_स्टेट = 42, n_jobs = -1)
#Fit random_model.fit(Xtrain, ytrain) y_pred = random_model.predict(Xtest) #सटीकता की जाँच करना random_model_accuracy = राउंड(random_model.score(Xtrain, ytrain)*100,2) प्रिंट(राउंड(random_model_accuracy, 2), '% ')

आउटपुट:

95.32%

सटीकता की जाँच करना

random_model_accuracy1 = राउंड (random_model.score (Xtest, ytest)*100,2) प्रिंट (राउंड (random_model_accuracy1, 2), '%')

आउटपुट:

65.32%

क्रमबद्ध प्रारूप का उपयोग करके मॉडल को अचार मॉड्यूल द्वारा सहेजना

आयात अचार सहेजा_मॉडल = अचार।

मॉडल ट्यूनिंग

  • सटीकता इतनी महान नहीं है, साथ ही मॉडल ओवरफिटिंग है
  • इसलिए हम रैंडमसीवी का उपयोग करते हैं

मॉडल से सभी पैरामीटर प्राप्त करना

random_model.get_params ()

आउटपुट:

{'बूटस्ट्रैप': ट्रू, 'सीसीपी_अल्फा': 0.0, 'मानदंड': 'एमएसई', 'मैक्स_डेप्थ': कोई नहीं, 'मैक्स_फीचर्स': 'ऑटो', 'मैक्स_लीफ_नोड्स': कोई नहीं, 'मैक्स_सैंपल्स': कोई नहीं, 'मिन_इमपुरिटी_डिक्रीज' : 0.0, 'min_impurity_split': कोई नहीं, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 300, 'n_jobs': -1, 'oob_score': गलत, 'random_state': 42, 'क्रिया': 0, 'वार्म_स्टार्ट': गलत}

रेडोमाइज़्डसर्चसीवी को काम में लाना!

""" n_estimators = जंगल में पेड़ों की संख्या max_features = नोड को विभाजित करने के लिए मानी जाने वाली सुविधाओं की अधिकतम संख्या max_deep = प्रत्येक निर्णय पेड़ में स्तरों की अधिकतम संख्या min_samples_split = नोड विभाजित होने से पहले नोड में रखे गए डेटा बिंदुओं की न्यूनतम संख्या min_samples_leaf = लीफ नोड बूटस्ट्रैप में अनुमत डेटा बिंदुओं की न्यूनतम संख्या = डेटा बिंदुओं के नमूने के लिए विधि (प्रतिस्थापन के साथ या बिना) """
sklearn.model_selection आयात से RandomizedSearchCV
यादृच्छिक वन में पेड़ों की संख्या
n_estimators = [int (x) np.linspace में x के लिए (प्रारंभ = 300, स्टॉप = 500, संख्या = 20)]
प्रत्येक विभाजन पर विचार करने के लिए सुविधाओं की संख्या
max_features = ['ऑटो', 'sqrt']
पेड़ में स्तरों की अधिकतम संख्या
मैक्स_डेपथ = [इंट (एक्स) एक्स के लिए एनपी.लिनस्पेस में (15, 35, संख्या = 7)] मैक्स_डेप्थ.एपेंड (कोई नहीं)
एक नोड को विभाजित करने के लिए आवश्यक नमूनों की न्यूनतम संख्या
min_samples_split = [2, 3, 5]
प्रत्येक पत्ती नोड पर आवश्यक नमूनों की न्यूनतम संख्या
min_samples_leaf = [1, 2, 4]
यादृच्छिक ग्रिड बनाएँ
random_grid = {'n_estimators': n_estimators, 'max_features': max_features, 'max_deep': max_deep, 'min_samples_split': min_samples_split, 'min_samples_leaf': min_samples_leaf, } प्रिंट (random_grid)

आउटपुट:

{'n_estimators': [300, 310, 321, 331, 342, 352, 363, 373, 384, 394, 405, 415, 426, 436, 447, 457, 468, 478, 489, 500], 'max_features' : ['ऑटो', 'sqrt'], 'अधिकतम_गहराई': [15, 18, 21, 25, 28, 31, 35, कोई नहीं], 'min_samples_split': [2, 3, 5], 'min_samples_leaf': [ 1, 2, 4]}
  • मापदंडों की एक यादृच्छिक खोज, 3 गुना क्रॉस-सत्यापन का उपयोग करते हुए, 100 विभिन्न संयोजनों में खोज करें और सभी उपलब्ध कोर का उपयोग करें
  • n_iter, जो कोशिश करने के लिए विभिन्न संयोजनों की संख्या को नियंत्रित करता है, और cv जो क्रॉस-सत्यापन के लिए उपयोग करने के लिए सिलवटों की संख्या है
rf_random = RandomizedSearchCV (अनुमानक = random_model, param_distributions = random_grid, n_iter = 50, cv = 3, वर्बोज़ = 2, random_state = 42) # यादृच्छिक खोज मॉडल को फ़िट करें rf_random.fit (Xtrain, ytrain)

आउटपुट:

जंगल में आग की भविष्यवाणी के लिए हमारे मॉडल का आउटपुट

इस स्निपेट की तरह ही होगा असंख्य तह इस रैंडमाइज्ड सर्च सीवी में

इसमें से सर्वश्रेष्ठ पैरामीटर प्राप्त करना

rf_random.best_params_

आउटपुट:

{'n_estimators': 394, 'min_samples_split': 2, 'min_samples_leaf': 1, 'max_features': 'sqrt', 'max_deep': 25}

ट्यून किए गए मापदंडों के साथ एक नया मॉडल बनाना

random_new = RandomForestRegressor (n_estimators = 394, min_samples_split = 2, min_samples_leaf = 1, max_features = 'sqrt', max_deep = 25, बूटस्ट्रैप = ​​True)
#Fit random_new.fit (Xtrain, ytrain)
y_pred1 = यादृच्छिक_नया.भविष्यवाणी(Xtest)
#सटीकता की जाँच करना random_model_accuracy1 = राउंड(random_new.score(Xtrain, ytrain)*100,2) प्रिंट(राउंड(random_model_accuracy1, 2), '%')

आउटपुट:

95.31%

सटीकता की जाँच करना

random_model_accuracy2 = राउंड (random_new.score (Xtest, ytest)*100,2) प्रिंट (राउंड (random_model_accuracy2, 2), '%')

आउटपुट:

67.39%

क्रमबद्ध प्रारूप का उपयोग करके अचार मॉड्यूल द्वारा ट्यून किए गए मॉडल को सहेजना

सेव_मॉडल = अचार.डंप (रैंडम_न्यू, ओपन ('फॉरेस्टमॉडल.पिकल', 'डब्ल्यूबी'))

ट्यून्ड पिकल्ड मॉडल लोड हो रहा है

reg_from_pickle = अचार.लोड (saved_model)

bz2फ़ाइल

यहाँ केक के हिस्से पर चेरी आती है (इस लेख का बोनस)। आइए समझते हैं कि यह bz2file मॉड्यूल क्या है। आएँ शुरू करें!

Bz2file क्या है

bz2file अजगर में मॉड्यूल में से एक है जो फ़ाइलों के संपीड़न और विसंपीड़न के लिए जिम्मेदार है, इसलिए यह क्रमबद्ध या डिस्क्रिअलाइज़्ड फ़ाइल को छोटे आकार में कम करने में मदद कर सकता है जो लंबे समय में बहुत मददगार होगा जब हमारे पास बड़े डेटासेट होंगे

यहाँ bz2file कैसे मददगार है?

जैसा कि हम जानते हैं कि हमारा डेटासेट 2.7+ एमबी है और हमारा रैंडम फ़ॉरेस्ट मॉडल 700+ एमबी का है, इसलिए हमें इसे कम करने की आवश्यकता है ताकि वह मॉडल भंडारण के लिए एक व्यस्त स्थिति के रूप में अग्रणी न हो।

Bz2file कैसे स्थापित करें?

  • ज्यूपिटर नोटबुक: पाइप bz2file स्थापित करें
  • एनाकोंडा प्रॉम्प्ट/सीएमडी: पिप bz2file स्थापित करें

इसलिए मैंने bz2file इंस्टॉल किया, जिसका उपयोग डेटा को कंप्रेस करने के लिए किया जाता है। यह उन लोगों के लिए एक जीवन-रक्षक पैकेज है, जिनकी डिस्क पर कम जगह है, लेकिन वे बड़े डेटासेट को स्टोर या उपयोग करना चाहते हैं। अब अचार वाली फाइल खत्म हो चुकी थी 700 एमबी आकार में जो उपयोग किए जाने पर bz2 आकार की फ़ाइल में संकुचित हो जाता है 93 एमबी या उससे कम.

आयात bz2 कंप्रेशनलेवल = 9 स्रोत_फाइल = 'फॉरेस्टमॉडल.पिकल' # यह फाइल एक अलग प्रारूप में हो सकती है, जैसे .csv या अन्य ... = bz2.compress(data.read(), कंप्रेशनलेवल) fh = open(destination_file, "wb") fh.write(tarbz2contents) fh.close()

यह कोड ट्यून किए गए अचार मॉडल के आकार को दबा देगा।

ठीक है तो यह मेरी तरफ से एक लपेट है!

एंडनोट्स

मेरा लेख 🙂 पढ़ने के लिए धन्यवाद

मुझे आशा है कि आप लोगों को यह चरण-दर-चरण सीखना पसंद आएगा मशीन लर्निंग का उपयोग करके जंगल की आग की भविष्यवाणी. एक आखिरी बात जो मैं उल्लेख करना चाहता हूं वह यह है कि मैं इस तथ्य से बहुत अच्छी तरह वाकिफ हूं कि मॉडल की सटीकता उतनी अच्छी नहीं है, लेकिन लेख का उद्देश्य काफी संतुलित है, इसलिए आप लोग बेहतर सटीकता देखने के लिए अलग-अलग एमएल एल्गोरिदम आज़मा सकते हैं। .

यहाँ रेपो है संपर्क इस लेख को।

यहां आप मेरे अन्य लेखों तक पहुंच सकते हैं जो ब्लॉगाथॉन के एक भाग के रूप में एनालिटिक्स विद्या पर प्रकाशित होते हैं (संपर्क)

यदि आपके पास कोई प्रश्न है तो आप मुझसे लिंक्डइन पर जुड़ सकते हैं, इसे देखें संपर्क

मेरे बारे में

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

छवि स्रोत-

  1. इमेज 1 - https://www.theleader.info/wp-content/uploads/2017/08/forest-fire.jpg

जंगल की आग की भविष्यवाणी पर इस लेख में दिखाए गए मीडिया पर एनालिटिक्स विद्या का स्वामित्व नहीं है और इसका उपयोग लेखक के विवेक पर किया जाता है।

स्रोत: https://www.analyticsvidhya.com/blog/2021/10/forest-fire-prediction-use-machine-learning/

समय टिकट:

से अधिक एनालिटिक्स विधा