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.
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
- Tarvittavien kirjastojen tuominen
- Tutkimusaineistoanalyysi
- Tietojen puhdistus
- Mallin kehitys (RandomForestRegressor)
- Mallin viritys (RandomSearchCV)
- 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ö:
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ö:
plt.figure(figsize=(10, 10)) sns.heatmap(forest.corr(),annot=True,cmap='viridis',linewidths=.5)
lähtö:
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ö:
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ö:
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ö:
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ö:
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ö:
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ö:
Katsotaan nyt puhdistettua ja lajiteltua tietojoukkoamme
fin.head()
lähtö:
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ö:
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
- Kuva 1 – https://www.theleader.info/wp-content/uploads/2017/08/forest-fire.jpg
Lähde: https://www.analyticsvidhya.com/blog/2021/10/forest-fire-prediction-using-machine-learning/
- "
- 100
- 116
- 39
- 420
- 7
- 9
- pääsy
- algoritmit
- Kaikki
- Analytics
- ALUE
- artikkeli
- artikkelit
- tekoäly
- auto
- PARAS
- tarkkailun
- Siivous
- koodi
- Sarake
- Tietokoneen visio
- luottamus
- konsultointi
- Luominen
- tiedot
- tietojenkäsittely
- päivä
- tekemisissä
- päätöspuu
- syvä oppiminen
- Kehitys
- verkkotunnuksia
- Pudota
- jne.
- tutkimus
- Ominaisuudet
- Tulipalo
- Etunimi
- sovittaa
- muoto
- Ilmainen
- hyvä
- suuri
- pää
- tätä
- HTTPS
- Intia
- tiedot
- Älykkyys
- korko
- kysymykset
- IT
- tarrat
- suuri
- leveysaste
- johtava
- oppiminen
- Pitkät
- koneoppiminen
- Media
- Metrics
- ML
- ML-algoritmit
- malli
- Muut
- Muuta
- kasvit
- ennustus
- projekti
- Python
- alue
- Lukeminen
- ajaa
- satelliitti
- skannata
- tiede
- Haku
- asetus
- Yksinkertainen
- Koko
- pieni
- So
- jakaa
- Alkaa
- Levytila
- verkkokaupasta
- Kohde
- Maa
- Testaus
- aika
- raita
- koulutus
- arvo
- visio
- KUKA
- Referenssit
- X
- vuosi