Metsäpalojen ennustaminen koneoppimisen avulla

Lähdesolmu: 1194873

Mitä tämä artikkeli sisältää?

Metsä-, pensas- tai kasvispalo voidaan kuvata kasvien hallitsemattomaksi ja säätämättömäksi polttamiseksi tai polttamiseksi luonnollisessa ympäristössä, kuten metsässä, niityllä jne. Tässä artikkelissa emme määritä, syttyykö metsäpalo. tai ei, ennustamme metsäpalon luotettavuutta joidenkin ominaisuuksien perusteella.

Metsäpalojen ennustaminen ML:n avulla
Image 1

Miksi tarvitsemme metsäpalojen ennustemallin?

No, ensimmäinen kysymys herää, miksi tarvitsemme koneoppimista ennustaaksemme metsäpalot kyseisellä alueella? Joten kyllä ​​kysymys on pätevä, että vaikka kokenut metsäosasto on jo pitkään käsitellyt näitä asioita, miksi on tarvetta ML:lle, sanottuaan vastaus on melko yksinkertainen, että kokenut metsäosasto voi tarkistaa 3- 4 parametria ihmismielestä, mutta ML toisaalta pystyy käsittelemään lukuisia parametreja, olivatpa ne sitten leveysaste, pituusaste, satelliitti, versio ja mikä tahansa, joten käsittelemme tätä metsäpalosta vastuussa olevan parametrin monisuhdetta. tarvitsemme ehdottomasti ML:ää!

Sisällysluettelo

  1. Tarvittavien kirjastojen tuominen
  2. Tutkimusaineistoanalyysi
  3. Tietojen puhdistus
  4. Mallin kehitys (RandomForestRegressor)
  5. Mallin viritys (RandomSearchCV)
  6. bz2-moduuli (iso bonus)

Tuodaan kirjastoja

tuonti päivämäärä-aika muodossa dt tuonti pandat pd-muodossa tuonti numpy-muodossa np tuonti seaborn-muodossa sns-tuonti matplotlib.pyplot-muodossa plt %matplotlib inline kohteesta sklearn.model_selection tuonti train_test_split kohteesta sklearn.metrics tuonti tarkkuus_pisteet, classification_report from sklearn.enseRemble

Metsäpalojen tutkimustietoaineiston lukeminen (.csv)

metsä = pd.read_csv('fire_archive.csv')

Katsotaanpa tietojoukkoamme (2.7+ Mt)

metsä.pää()

lähtö:

Metsäpalojen ennustamisen tietojoukon lukeminen

Tietojen etsintä

metsä.muoto

lähtö:

(36011, 15)

Tässä voimme nähdä, että meillä on 36011-rivit ja 15 sarakkeet Tietojoukossamme meidän on luonnollisesti puhdistettava paljon tietoja, mutta ensin

Tutkitaan tätä tietojoukkoa lisää

metsä.pylväät

lähtö:

Index(['leveysaste', 'pituusaste', 'kirkkaus', 'skannaus', 'raita', 'acq_date', 'acq_time', 'satelliitti', 'instrumentti', 'luottamus', 'versio', 'bright_t31' , 'frp', 'daynight', 'type'], dtype='object')

Tarkistetaan nolla-arvoja metsäpalojen ennustetietojoukosta

metsä.isnull().sum()

lähtö:

leveysaste 0 pituusaste 0 kirkkaus 0 skannaus 0 raita 0 acq_date 0 acq_time 0 satelliitti 0 instrumentti 0 luottamus 0 versio 0 bright_t31 0 frp 0 päiväyö 0 tyyppi 0 dtype: int64

Onneksi meillä ei ole nolla-arvoja tässä tietojoukossa

metsä.describe()

lähtö:

Tietojoukon kuvaus
plt.figure(figsize=(10, 10)) sns.heatmap(forest.corr(),annot=True,cmap='viridis',linewidths=.5)

lähtö:

Tietojoukon lämpökartta

Tietojen puhdistus

metsä = metsä.drop(['raita'], akseli = 1)

Tässä pudotamme kappalesarakkeen

Huomautus: Aineistosta emme muuten löydä, tapahtuuko metsäpalo vai ei, vaan yritämme löytää varmuutta metsäpalon tapahtumisesta. Ne saattavat vaikuttaa samalta, mutta niiden välillä on hyvin pieni ero, yritä löytää se 🙂

Kategorisen tiedon etsiminen

print("Skannaussarake") print(forest['scan'].value_counts()) print() print("Aqc_time sarake") print(forest['acq_time'].value_counts()) print() print( "Satelliittipylväs") print(forest['satelliitti'].value_counts()) print() print("instrumenttisarake") print(forest['instrument'].value_counts()) print() print("The version sarake") print(forest['versio'].value_counts()) print() print("The daynight column") print(forest['daynight'].value_counts()) print()

lähtö:

Skannauspylväs 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 Nimi: skannaus, dtype: int108 sarake aqc_time 4.0 103 4.4 100 4.8 70 64 506 851 454 ... 631 122 612 423 574 448 563 1558 1 635 Nimi: acq_time, Pituus: 1, dtype: int1153 Satelliittipylväs Aqua 1 Terra 302 Nimi: satelliitti, dtype: 1 instrumentti1519 sarake1 Nimi: int662 int64 Versiosarake 20541 15470 Nimi: versio, dtype: int64 Päiväyön sarake D 36011 N 64 Nimi: daynight, dtype: int6.3

Yllä olevista tiedoista voimme nähdä, että joissakin sarakkeissa on juuri yksi arvo toistuu niissäeli ne eivät ole meille arvokkaita
Joten jätämme ne kokonaan pois.
Vain siis satelliitti ja päivä Yö sarakkeet ovat ainoita kategorinen tyyppi.

Tämän sanottuamme voimme jopa käyttää skannata sarake muuttaaksesi sen a kategorinen tietotyyppi sarake. Mitä teemme hetken kuluttua.

metsä = metsä.drop(['instrumentti', 'versio'], akseli = 1)
metsä.pää()

lähtö:

Tarkastellaan metsäpalojen ennustamisen tietojen päätä
daynight_map = {"D": 1, "N": 0} satelliittikartta = {"Terra": 1, "Aqua": 0} metsä['daynight'] = metsä['daynight'].map(daynight_map) forest[ 'satelliitti'] = metsä['satelliitti'].kartta(satelliittikartta)
metsä.pää()

lähtö:

Tietojoukon ensimmäisten rivien tarkastelu

Tarkastellaan toisen sarakkeen tyyppiä

metsä['tyyppi'].arvo_määrät()

lähtö:

0 35666 2 335 3 10 Nimi: tyyppi, dtype: int64

Metsän ja tyyppien tietokehyksen ketjuttaminen

tyypit = pd.get_dummies(metsä['tyyppi']) metsä = pd.concat([metsä, tyypit], akseli=1)
metsä = metsä.pisara(['tyyppi'], akseli = 1) metsä.pää()

lähtö:

Tietojen tarkasteleminen metsän ja tyyppien dataframe-ketjun jälkeen

Nimeä sarakkeet uudelleen ymmärtämisen helpottamiseksi

metsä = metsä.nimetä uudelleen(sarakkeet={0: 'tyyppi_0', 2: 'tyyppi_2', 3: 'tyyppi_3'})

Binning-menetelmä

  • Mainitsin nyt, että muunnamme skannaussarakkeen kategoriseksi tyypiksi, teemme tämän käyttämällä binning menetelmä.
  • Näiden sarakkeiden vaihteluväli oli 1 - 4.8
bins = [0, 1, 2, 3, 4, 5] otsikot = [1,2,3,4,5] forest['scan_binned'] = pd.cut(forest['scan'], bins=bins, etiketit = etiketit)
metsä.pää()

lähtö:

Binning-menetelmän soveltaminen

Tietotyypin muuntaminen päivämäärätyypiksi alkaen merkkijono tai NumPy.

metsä['acq_date'] = pd.to_datetime(metsä['acq_date'])

Nyt pudotamme skannata pylväs ja kahva päivämäärätyyppi data – voimme poimia hyödyllistä tietoa näistä tietotyypeistä aivan kuten teemme kategorinen data.

metsä = metsä.drop(['skannaa'], akseli = 1)

Uuden sarakevuoden luominen acq_date-sarakkeen avulla

metsä['vuosi'] = metsä['acq_date'].dt.year forest.head()

lähtö:

Uuden sarakkeen luominen

Koska olemme lisänneet vuosisarakkeen samalla tavalla, lisäämme Kuukausi ja päivä sarake

metsä['kuukausi'] = metsä['acq_date'].dt.kuukausi metsä['päivä'] = metsä['acq_date'].dt.day

Tietojoukon muoto tarkistetaan uudelleen

metsä.muoto

lähtö:

(36011, 17)

Nyt, kuten näemme, on lisätty kaksi saraketta, jotka ovat päivämääräsarakkeiden erittely

Erottelemme tavoitemuuttujamme

y = metsä['luottamus'] fin = metsä.drop(['luottamus', 'acq_date', 'acq_time', 'bright_t31', 'type_0'], akseli = 1)

Korrelaatio tarkistetaan vielä kerran

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

lähtö:

Korrelaation tarkistaminen
Kuva tekijältä

Katsotaan nyt puhdistettua ja lajiteltua tietojoukkoamme

fin.head()

lähtö:

Puhdistetun ja lajiteltujen tietojen katselu

Puhtaiden tietojen jakaminen koulutus- ja testaustietojoukoksi

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

Mallirakennus

RandomForestRegressorin käyttö mallin rakentamiseen

satunnainen_malli = RandomForestRegressor(n_estimators=300, random_state = 42, n_jobs = -1)
#Fit random_model.fit(Xtrain, ytrain) y_pred = random_model.predict(Xtest) #Tarkuuden tarkistaminen random_model_accuracy = round(random_model.score(Xtrain, ytrain)*100,2) print(round(random_model_accura) ')

lähtö:

95.32%

Tarkkuuden tarkistaminen

random_model_accuracy1 = round(random_model.score(Xtest, ytest)*100,2) print(round(random_model_accuracy1, 2), '%')

lähtö:

65.32%

Mallin tallentaminen suolakurkkumoduulilla sarjoitetussa muodossa

tuonti suolakurkku saved_model = pickle.dump(random_model, open('ForestModelOld.pickle','wb'))

Mallin viritys

  • Tarkkuus ei ole niin suuri, ja malli on ylisovitettu
  • Joten käytämme RandomCV:tä

Kaikkien parametrien saaminen mallista

random_model.get_params()

lähtö:

{'bootstrap': Totta, 'ccp_alpha': 0.0, 'criterion': 'mse', 'max_depth': Ei mitään, 'max_features': 'auto', 'max_leaf_nodes': Ei mitään, 'max_samples': Ei mitään,'_rity : 0.0, 'min_impurity_split': Ei mitään, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 300, 'n_jobs':rando,', -1,: -42 0, 'verbose': XNUMX, 'warm_start': False}

RadomizedSearchCV:n käyttöönotto!

""" n_estimators = puiden määrä metsässä max_features = solmun jakamiseen otettujen ominaisuuksien enimmäismäärä max_depth = tasojen maksimimäärä kussakin päätöspuussa min_samples_split = solmussa olevien datapisteiden vähimmäismäärä ennen solmun jakamista min_samples_leaf = tietopisteiden vähimmäismäärä sallittu lehtisolmun bootstrapissa = menetelmä datapisteiden näytteenottoon (korvaamalla tai ilman) """
osoitteesta sklearn.model_selection tuonti RandomizedSearchCV
Puiden lukumäärä satunnaisessa metsässä
n_estimators = [int(x) x:lle np.linspacessa(aloitus = 300, lopetus = 500, määrä = 20)]
Ominaisuuksien lukumäärä jokaisessa jaossa
max_features = ['auto', 'sqrt']
Puun tasojen enimmäismäärä
max_depth = [int(x) x:lle np.linspace(15, 35, num = 7)] max_depth.append(Ei mitään)
Solmun jakamiseen vaadittavien näytteiden vähimmäismäärä
min_samples_split = [2, 3, 5]
Vähimmäismäärä näytteitä vaaditaan kussakin lehtisolmussa
min_samples_leaf = [1, 2, 4]
Luo satunnainen ruudukko
random_grid = {'n_estimators': n_estimators, 'max_features': max_features, 'max_depth': max_depth, 'min_samples_split': min_samples_split, 'min_samples_leaf': min_samples_leaf,_gri

lähtö:

{'n_estimators': [300, 310, 321, 331, 342, 352, 363, 373, 384, 394, 405, 415, 426, 436, 447, 457, 468, 478', 489, 500, 15',18 : ['auto', 'sqrt'], 'max_depth': [21, 25, 28, 31, 35, 2, 3, Ei mitään], 'min_samples_split': [5, 1, 2], 'min_samples_leaf': [ 4, XNUMX, XNUMX]}
  • Parametrien satunnainen haku käyttäen kolminkertaista ristiinvalidointia, hakee 3 eri yhdistelmästä ja käyttää kaikkia saatavilla olevia ytimiä
  • n_iter, joka ohjaa kokeilevien eri yhdistelmien määrää, ja cv, joka on ristiintarkistuksessa käytettävien taitojen määrä
rf_random = RandomizedSearchCV(estimaattori = satunnainen_malli, param_jakaumat = random_grid, n_iter = 50, cv = 3, verbose=2, random_state=42) # Sovita satunnaishakumalli rf_random.fit(Xtrain, ytrain)

lähtö:

Metsäpalojen ennustamismallimme tulos

Aivan kuten tämä katkelma, tulee olemaan lukuisia taitoksia tässä satunnaishakuCV:ssä

Paras parametri saa siitä irti

rf_random.best_params_

lähtö:

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

Uuden mallin luominen viritetyillä parametreilla

random_new = RandomForestRegressor(n_estimators = 394, min_samples_split = 2, min_samples_leaf = 1, max_features = 'sqrt', max_depth = 25, bootstrap = tosi)
#Fit random_new.fit(Xtrain, ytrain)
y_pred1 = random_new.predict(Xtest)
#Tarkuuden tarkistaminen random_model_accuracy1 = round(random_new.score(Xtrain, ytrain)*100,2) print(round(random_model_accuracy1, 2), '%')

lähtö:

95.31%

Tarkkuuden tarkistaminen

random_model_accuracy2 = round(random_new.score(Xtest, ytest)*100,2) print(round(random_model_accuracy2, 2), '%')

lähtö:

67.39%

Säädetty malli tallennetaan suolakurkkumoduulilla sarjoitetussa muodossa

saved_model = pickle.dump(random_new, open('ForestModel.pickle','wb'))

Ladataan viritettyä peitattua mallia

reg_from_pickle = suolakurkku.load(tallennettu_malli)

bz2-tiedosto

Tässä tulee kirsikka kakun päällä -osa (tämän artikkelin bonus). Ymmärretään, mistä tässä bz2file-moduulissa on kyse. Aloitetaan!

Mikä on bz2file

bz2file on yksi python-moduuleista, jotka vastaavat tiedostojen pakkaamisesta ja purkamisesta, joten se voi auttaa pienentämään sarjoitettujen tai deserialisoitujen tiedostojen kokoa, mikä on erittäin hyödyllistä pitkällä aikavälillä, kun meillä on suuria tietojoukkoja.

Miten bz2file on hyödyllinen tässä?

Koska tiedämme, että tietojoukkomme on 2.7+ Mt ja Random-metsämallimme huimat 700+ Mt, joten meidän on pakattava se, jotta malli ei johtaisi hektisenä tallennustilanteena.

Kuinka asentaa bz2file?

  • Jupyter muistikirja: !pip install bz2file
  • Anaconda kehote/CMD: pip asennus bz2file

Siksi asensin bz2file, jota käytetään tietojen pakkaamiseen. Tämä on hengenpelastuspaketti niille, joilla on vähän tilaa levyllä, mutta jotka haluavat tallentaa tai käyttää suuria tietojoukkoja. Nyt marinoitu viila oli ohi 700 MB koossa, joka käytettäessä bz2 pakattiin kokoiseksi tiedostoksi 93 Mt tai vähemmän.

import bz2 compressionLevel = 9 source_file = 'ForestModel.pickle' # tämä tiedosto voi olla eri muodossa, kuten .csv tai muu... destination_file = 'ForestModel.bz2' ja open(source_file, 'rb') datana: tarbz2contents = bz2.compress(data.read(), pakkaustaso) fh = avoin(kohdetiedosto, "wb") fh.write(tarbz2contents) fh.close()

Tämä koodi estää viritetyn suolakurkkumallin koon.

Okei, tämä on kääre minun puoleltani!

loppuviitteet

Kiitos, että luit artikkelini 🙂

Toivon, että pidät tästä vaiheittaisesta oppimisesta metsäpalojen ennustaminen koneoppimisen avulla. Viimeinen asia, jonka haluan mainita, on se, että olen erittäin tietoinen siitä, että mallin tarkkuus ei ole niin hyvä, mutta artikkelin tavoite on melko tasapainoinen, joten voitte kokeilla erilaisia ​​Ml-algoritmeja etsiäksesi parempaa tarkkuutta. .

Tässä repo linkkiä tähän artikkeliin.

Täältä pääset muihin artikkeleihini, jotka on julkaistu Analytics Vidhyassa osana Blogathonia (linkkiä)

Jos sinulla on kysyttävää, voit ottaa minuun yhteyttä LinkedInissä, katso tämä linkkiä

Tietoja minusta

Tervehdys kaikille, olen tällä hetkellä töissä in TCS ja aiemmin työskentelin Data Science Associate Analyst -analyytikona in Zorba Consulting Intia. Kokopäivätyön ohella minulla on valtava kiinnostus samasta alasta eli tietotieteestä ja sen muista tekoälyn alaryhmistä, kuten tietokonenäkö, koneoppiminen ja syväoppiminen, voit vapaasti tehdä yhteistyötä kanssani missä tahansa projektissa edellä mainituilla verkkotunnuksilla (LinkedIn).

Kuvan lähde

  1. Kuva 1 – https://www.theleader.info/wp-content/uploads/2017/08/forest-fire.jpg

Tässä metsäpalojen ennustamista koskevassa artikkelissa näkyvät tiedotusvälineet eivät ole Analytics Vidhyan omistuksessa, ja niitä käytetään tekijän harkinnan mukaan.

Lähde: https://www.analyticsvidhya.com/blog/2021/10/forest-fire-prediction-using-machine-learning/

Aikaleima:

Lisää aiheesta Analyysi Vidhya