Lopullinen opas logistiseen regressioon Python PlatoBlockchain Data Intelligencessa. Pystysuuntainen haku. Ai.

Lopullinen opas logistiseen regressioon Pythonissa

esittely

Joskus sekoitetaan lineaarinen regressio aloittelijat – termin jakamisen vuoksi regressio - logistinen regressio on paljon erilainen kuin lineaarinen regressio. Lineaarinen regressio ennustaa arvoja, kuten 2, 2.45, 6.77 tai jatkuvat arvot, mikä tekee siitä a regressio algoritmi, logistinen regressio ennustaa arvoja, kuten 0 tai 1, 1 tai 2 tai 3, jotka ovat diskreetit arvot, mikä tekee siitä a luokittelu algoritmi. Kyllä, sitä kutsutaan regressio mutta on a luokittelu algoritmi. Siitä lisää hetken kuluttua.

Siksi, jos datatieteen ongelmaasi liittyy jatkuvia arvoja, voit soveltaa a regressio algoritmi (lineaarinen regressio on yksi niistä). Muussa tapauksessa, jos kyseessä on syötteiden, erillisten arvojen tai luokkien luokittelu, voit käyttää a luokittelu algoritmi (logistinen regressio on yksi niistä).

Tässä oppaassa suoritamme logistisen regression Pythonissa Scikit-Learn-kirjaston kanssa. Selitämme myös miksi sana "regressio" on läsnä nimessä ja miten logistinen regressio toimii.

Tätä varten lataamme ensin tiedot, jotka luokitellaan, visualisoidaan ja esikäsitellään. Sitten rakennamme logistisen regressiomallin, joka ymmärtää tiedot. Tämä malli arvioidaan sitten ja sitä käytetään arvojen ennustamiseen uuden syötteen perusteella.

Motivoiminen

Yritys, jossa työskentelet, teki kumppanuuden turkkilaisen maataloustilan kanssa. Tähän kumppanuuteen kuuluu kurpitsansiementen myynti. Kurpitsansiemenet ovat erittäin tärkeitä ihmisen ravitsemukselle. Ne sisältävät hyvän osuuden hiilihydraatteja, rasvoja, proteiineja, kalsiumia, kaliumia, fosforia, magnesiumia, rautaa ja sinkkiä.

Datatieteen tiimissä sinun tehtäväsi on kertoa ero kurpitsansiementyyppien välillä pelkästään datan avulla – tai luokittelulohko siementyypin mukaiset tiedot.

Turkkilainen maatila toimii kahdella kurpitsansiementyypillä, joista toinen on ns Çerçevelik ja se toinen Ürgüp Sivrisi.

Kurpitsansiementen luokittelussa tiimisi on noudattanut vuoden 2021 paperia ”Koneoppimismenetelmien käyttö kurpitsansiementen luokittelussa (Cucurbita pepo L.). Geneettiset resurssit ja viljelykasvien evoluutio" Koklulta, Sarigililta ja Ozbekilta – tässä artikkelissa on menetelmä valokuvaamiseen ja siemenmittojen poimimiseen kuvista.

Paperissa kuvatun prosessin päätyttyä otettiin seuraavat mittaukset:

  • alue – pikselien määrä kurpitsansiemenen sisällä
  • kehä – kurpitsansiementen ympärysmitta pikseleinä
  • Pääakselin pituus – myös kurpitsansiementen ympärysmitta pikseleinä
  • Pieni akselin pituus – kurpitsansiemenen pieni akselietäisyys
  • eksentrisyys – kurpitsansiemenen epäkeskisyys
  • Kupera alue – kurpitsansiemenen muodostaman alueen pienimmän kuperan kuoren pikselien lukumäärä
  • Laajuus – kurpitsansiemenpinta-alan suhde rajapintojen pikseleihin
  • Vastaava halkaisija – neliöjuuri kurpitsansiemenen pinta-alan kertomisesta neljällä jaettuna pi:llä
  • tiiviyttä – kurpitsansiemenen pinta-alan suhde ympyrän pinta-alaan, jolla on sama ympyrä
  • kiinteys – kurpitsansiementen kupera ja kupera tila
  • pyöreys – kurpitsansiementen soikeaisuus ottamatta huomioon sen reunojen vääristymiä
  • Kuvasuhde – kurpitsansiementen kuvasuhde

Nämä ovat mittoja, joiden kanssa sinun on työskenneltävä. Mittojen lisäksi löytyy myös luokka kahden kurpitsansiementyypin etiketti.

Aloittaaksesi siementen luokittelun, tuodaan tiedot ja aletaan tarkastella niitä.

Tietojoukon ymmärtäminen

Huomautus: Voit ladata kurpitsatietojoukon tätä.

Tietojoukon lataamisen jälkeen voimme ladata sen tietokehysrakenteeseen käyttämällä pandas kirjasto. Koska se on Excel-tiedosto, käytämme tiedostoa read_excel() menetelmä:

import pandas as pd

fpath = 'dataset/pumpkin_seeds_dataset.xlsx' 
df = pd.read_excel(fpath)

Kun tiedot on ladattu, voimme vilkaista nopeasti ensimmäiset 5 riviä käyttämällä head() menetelmä:

df.head() 

Tämä johtaa:

	Area 	Perimeter 	Major_Axis_Length 	Minor_Axis_Length 	Convex_Area 	Equiv_Diameter 	Eccentricity 	Solidity 	Extent 	Roundness 	Aspect_Ration 	Compactness 	Class
0 	56276 	888.242 	326.1485 			220.2388 			56831 			267.6805 		0.7376 			0.9902 		0.7453 	0.8963 		1.4809 			0.8207 			Çerçevelik
1 	76631 	1068.146 	417.1932 			234.2289 			77280 			312.3614 		0.8275 			0.9916 		0.7151 	0.8440 		1.7811 			0.7487 			Çerçevelik
2 	71623 	1082.987 	435.8328 			211.0457 			72663 			301.9822 		0.8749 			0.9857 		0.7400 	0.7674 		2.0651 			0.6929 			Çerçevelik
3 	66458 	992.051 	381.5638 			222.5322 			67118 			290.8899 		0.8123 			0.9902 		0.7396 	0.8486 		1.7146 			0.7624 			Çerçevelik
4 	66107 	998.146 	383.8883 			220.4545 			67117 			290.1207 		0.8187 			0.9850 		0.6752 	0.8338 		1.7413 			0.7557 			Çerçevelik

Täällä meillä on kaikki mittaukset vastaavissa sarakkeissa, meidän piirteet, ja myös luokka sarake, meidän tavoite, joka on tietokehyksen viimeinen. Näemme kuinka monta mittausta meillä on käyttämällä shape määrite:

df.shape 

Tuotos on:

(2500, 13)

Muototulos kertoo, että tietojoukossa on 2500 merkintää (tai riviä) ja 13 saraketta. Koska tiedämme, että kohdesarakkeessa on yksi, tämä tarkoittaa, että meillä on 12 ominaisuussaraketta.

Voimme nyt tutkia kohdemuuttujaa, kurpitsansiemeniä Class. Koska ennustamme tuon muuttujan, on mielenkiintoista nähdä, kuinka monta näytettä kustakin kurpitsansiemenestä meillä on. Yleensä mitä pienempi ero esiintymien lukumäärän välillä luokissamme on, sitä tasapainoisempi on otoksemme ja sitä paremmat ennusteemme.

Tämä tarkastus voidaan tehdä laskemalla jokainen siemennäyte value_counts() menetelmä:

df['Class'].value_counts() 

Yllä oleva koodi näyttää:

Çerçevelik       1300
Ürgüp Sivrisi    1200
Name: Class, dtype: int64

Näemme, että näytteitä on 1300 Çerçevelik siemeniä ja 1200 näytettä Ürgüp Sivrisi siemen. Huomaa, että niiden välinen ero on 100 näytettä, erittäin pieni ero, mikä on meille hyvä ja osoittaa, että näytteiden määrää ei tarvitse tasapainottaa.

Katsotaanpa myös ominaisuuksiemme kuvaavia tilastoja describe() menetelmää nähdäksesi kuinka hyvin tiedot jakautuvat. Transponoimme myös tuloksena olevan taulukon kanssa T Tilastojen vertailun helpottamiseksi:

df.describe().T

Tuloksena oleva taulukko on:

					count 	mean 			std 			min 		25% 			50% 			75% 			max
Area 				2500.0 	80658.220800 	13664.510228 	47939.0000 	70765.000000 	79076.00000 	89757.500000 	136574.0000
Perimeter 			2500.0 	1130.279015 	109.256418 		868.4850 	1048.829750 	1123.67200 		1203.340500 	1559.4500
Major_Axis_Length 	2500.0 	456.601840 		56.235704 		320.8446 	414.957850 		449.49660 		492.737650 		661.9113
Minor_Axis_Length 	2500.0 	225.794921 		23.297245 		152.1718 	211.245925 		224.70310 		240.672875 		305.8180
Convex_Area 		2500.0 	81508.084400 	13764.092788 	48366.0000 	71512.000000 	79872.00000 	90797.750000 	138384.0000
Equiv_Diameter 		2500.0 	319.334230 		26.891920 		247.0584 	300.167975 		317.30535 		338.057375 		417.0029
Eccentricity 		2500.0 	0.860879 		0.045167 		0.4921 		0.831700 		0.86370 		0.897025 		0.9481
Solidity 			2500.0 	0.989492 		0.003494 		0.9186 		0.988300 		0.99030 		0.991500 		0.9944
Extent 				2500.0 	0.693205 		0.060914 		0.4680 		0.658900 		0.71305 		0.740225 		0.8296
Roundness 			2500.0 	0.791533 		0.055924 		0.5546 		0.751900 		0.79775 		0.834325 		0.9396
Aspect_Ration 		2500.0 	2.041702 		0.315997 		1.1487 		1.801050 		1.98420 		2.262075 		3.1444
Compactness 		2500.0 	0.704121 		0.053067 		0.5608 		0.663475 		0.70770 		0.743500 		0.9049

Katsomalla taulukkoa, kun vertailet tarkoittaa ja standardipoikkeama (std) sarakkeita, voidaan nähdä, että useimpien ominaisuuksien keskiarvo on kaukana keskihajonnasta. Tämä osoittaa, että data-arvot eivät ole keskittyneet keskiarvon ympärille, vaan enemmän hajallaan sen ympärille – toisin sanoen ne ovat suuri vaihtelevuus.

Myös kun katsot minimi (min) Ja maksimi (max) sarakkeita, joitain ominaisuuksia, kuten Areaja Convex_Area, niillä on suuria eroja minimi- ja maksimiarvojen välillä. Tämä tarkoittaa, että näissä sarakkeissa on hyvin pieniä tietoja ja myös erittäin suuria tietoarvoja, tai korkeampi amplitudi data-arvojen välillä.

Suuren vaihtelun, suuren amplitudin ja eri mittayksiköillä varustettujen ominaisuuksien ansiosta suurin osa tiedoistamme hyötyisi siitä, että kaikilla ominaisuuksilla olisi sama asteikko tai skaalattu. Tietojen skaalaus keskittää tiedot keskiarvon ympärille ja vähentää sen varianssia.

Tämä skenaario viittaa todennäköisesti myös siihen, että tiedoissa on poikkeavuuksia ja ääriarvoja. Joten on parasta, että niitä on poikkeava hoito tietojen skaalauksen lisäksi.

On olemassa joitain koneoppimisalgoritmeja, esimerkiksi puupohjaisia ​​algoritmeja, kuten Satunnainen metsäluokitus, joihin suuri datavarianssi, poikkeamat ja ääriarvot eivät vaikuta. Logistinen regressio on erilainen, se perustuu funktioon, joka luokittelee arvomme, ja tämän funktion parametreihin voivat vaikuttaa arvot, jotka ovat poissa yleisestä datatrendistä ja joilla on suuri varianssi.

Ymmärrämme logistisesta regressiosta enemmän, kun saamme sen käyttöön. Toistaiseksi voimme jatkaa tietojemme tutkimista.

Huomautus: Tietojenkäsittelytieteessä on suosittu sanonta: "Roskat sisään, roskat ulos" (GIGO), joka sopii hyvin koneoppimiseen. Tämä tarkoittaa sitä, että kun meillä on roskadataa – mittauksia, jotka eivät kuvaa ilmiöitä sinänsä, tiedot, joita ei ymmärretty ja hyvin valmistettu algoritmin tai mallin mukaan, muodostavat todennäköisesti virheellisen tulosteen, joka ei toimi päivittäin.
Tämä on yksi syistä, miksi tietojen tutkiminen, ymmärtäminen ja valitun mallin toiminta on niin tärkeää. Tekemällä näin voimme välttää laittamasta roskat malliimme – antamasta sen sijaan arvoa ja saamaan arvoa ulos.

Datan visualisointi

Tähän asti meillä on kuvaavien tilastojen avulla jokseenkin abstrakti tilannekuva tietojen joistakin ominaisuuksista. Toinen tärkeä askel on visualisoida se ja vahvistaa hypoteesimme suuresta varianssista, amplitudista ja poikkeavuuksista. Jotta nähdään, näkyykö tähän mennessä havaitsemme tiedoissa, voimme piirtää kaavioita.

On myös mielenkiintoista nähdä, kuinka ominaisuudet liittyvät kahteen ennustettavaan luokkaan. Tätä varten tuodaan seaborn pakkaa ja käytä pairplot kaavio, josta voit tarkastella kutakin ominaisuusjakaumaa ja kunkin ominaisuuden luokkaerottelua:

import seaborn as sns


sns.pairplot(data=df, hue='Class')

Huomautus: Yllä olevan koodin suorittaminen saattaa kestää hetken, koska parikaavio yhdistää kaikkien ominaisuuksien sirontakaaviot (voi) ja näyttää myös ominaisuusjakaumat.

Katsomalla parikaaviota voimme nähdä, että useimmissa tapauksissa pisteet Çerçevelik luokka on selvästi erotettu pisteistä Ürgüp Sivrisi luokkaa. Joko yhden luokan pisteet ovat oikealla, kun muut ovat vasemmalla, tai jotkut ovat ylhäällä, kun taas toiset ovat alhaalla. Jos käyttäisimme luokkien erottamiseen jonkinlaista käyrää tai viivaa, tämä osoittaa, että ne on helpompi erottaa, jos ne olisi sekoitettu, luokittelu olisi vaikeampaa.

In Eccentricity, Compactness ja Aspect_Ration sarakkeita, myös jotkin "eristetty" tai yleisestä datatrendistä poikkeavat kohdat – poikkeamat – ovat helposti havaittavissa.

Kun katsot diagonaalia kaavion vasemmasta yläkulmasta oikeaan alakulmaan, huomaa, että datajakaumat on myös värikoodattu luokkiemme mukaan. Jakauman muodot ja molempien käyrien välinen etäisyys ovat muita indikaattoreita siitä, kuinka erotettavissa ne ovat – mitä kauempana toisistaan, sitä parempi. Useimmissa tapauksissa niitä ei ole päällekkäin, mikä tarkoittaa, että ne on helpompi erottaa, mikä myös edistää tehtäväämme.

Voimme myös piirtää peräkkäin kaikkien muuttujien boxplotit sns.boxplot() menetelmä. Useimmiten on hyödyllistä suunnata boxplots vaakasuoraan, joten boxplottien muodot ovat samat kuin jakautumismuodot, voimme tehdä sen orient Perustelu:


sns.boxplot(data=df, orient='h') 

Lopullinen opas logistiseen regressioon Python PlatoBlockchain Data Intelligencessa. Pystysuuntainen haku. Ai.

Huomaa yllä olevassa juonessa Area ja Convex_Area niillä on niin suuri magnitudi verrattuna muiden sarakkeiden magnitudeihin, että ne puristavat muut boxplotit. Jotta voimme tarkastella kaikkia boxplotteja, voimme skaalata ominaisuuksia ja piirtää ne uudelleen.

Ennen kuin teet sen, on vain ymmärrettävä, että jos ominaisuuksilla on arvoja, jotka liittyvät läheisesti muihin arvoihin, esimerkiksi jos on arvoja, jotka myös kasvavat muiden ominaisuusarvojen kasvaessa, positiivinen korrelaatio; tai jos on arvoja, jotka tekevät päinvastoin, pienennetään, kun taas muut arvot pienenevät, joilla on a Negatiivinen korrelaatio.

Tämä on tärkeää tarkastella, koska vahvat suhteet tiedoissa voivat tarkoittaa, että jotkin sarakkeet on johdettu muista sarakkeista tai niillä on samanlainen merkitys kuin mallissamme. Kun näin tapahtuu, mallin tulokset saattavat olla yliarvioituja ja haluamme tuloksia, jotka ovat lähempänä todellisuutta. Jos korrelaatiot ovat vahvoja, se tarkoittaa myös sitä, että voimme vähentää ominaisuuksien määrää ja käyttää vähemmän sarakkeita, mikä tekee mallista paremman vähävarainen.

Huomautus: Oletuskorrelaatio on laskettu corr() menetelmä on Pearson-korrelaatiokerroin. Tämä kerroin ilmaistaan, kun tiedot ovat kvantitatiivisia, normaalisti jakautuneita, niissä ei ole poikkeavuuksia ja niillä on lineaarinen suhde.

Toinen vaihtoehto olisi laskea Spearmanin korrelaatiokerroin. Spearmanin kerrointa käytetään, kun data on ordinaalista, epälineaarista, sillä on mikä tahansa jakautuma ja siinä on poikkeavia arvoja. Huomaa, että tietomme eivät täysin sovi Pearsonin tai Spearmanin oletuksiin (on myös enemmän korrelaatiomenetelmiä, kuten Kendallin). Koska tietomme ovat kvantitatiivisia ja meidän on tärkeää mitata sen lineaarista suhdetta, käytämme Pearsonin kerrointa.

Katsotaanpa muuttujien välisiä korrelaatioita ja sitten voidaan siirtyä tietojen esikäsittelyyn. Laskemme korrelaatiot kanssa corr() menetelmällä ja visualisoi ne Seabornin avulla heatmap(). Lämpökartan vakiokoko on yleensä pieni, joten tuomme maahan matplotlib (yleinen visualisointikone/kirjasto, jonka päälle Seaborn on rakennettu) ja muuta kokoa figsize:

import matplotlib.pyplot as plt
plt.figure(figsize=(15, 10))

correlations = df.corr()
sns.heatmap(correlations, annot=True) 

Lopullinen opas logistiseen regressioon Python PlatoBlockchain Data Intelligencessa. Pystysuuntainen haku. Ai.

Tässä lämpökartassa arvot, jotka ovat lähempänä 1:tä tai -1:tä, ovat arvoja, joihin meidän on kiinnitettävä huomiota. Ensimmäinen tapaus tarkoittaa korkeaa positiivista korrelaatiota ja toinen korkeaa negatiivista korrelaatiota. Molemmat arvot, elleivät yli 0.8 tai -0.8, ovat hyödyllisiä logistiselle regressiomallillemme.

Kun korrelaatiot ovat korkeat, kuten yksi 0.99 välillä Aspec_Ration ja Compactness, tämä tarkoittaa, että voimme käyttää vain Aspec_Ration tai vain Compactness, molempien sijaan (koska ne olisivat melkein yhtä suuret ennustajat toisistaan). Sama pätee Eccentricity ja Compactness kanssa -0.98 korrelaatio, for Area ja Perimeter kanssa 0.94 korrelaatio ja jotkut muut sarakkeet.

Tietojen esikäsittely

Koska olemme jo tutkineet dataa jonkin aikaa, voimme aloittaa sen esikäsittelyn. Käytetään toistaiseksi kaikkia luokan ennusteen ominaisuuksia. Saatuamme ensimmäisen mallin, perusviivan, voimme sitten poistaa joitakin erittäin korreloituja sarakkeita ja verrata sitä perusviivaan.

Ominaisuussarakkeet ovat meidän X tiedot ja luokkasarake, meidän y kohdetiedot:

y = df['Class']
X = df.drop(columns=['Class'], axis=1)

Kategoristen ominaisuuksien muuttaminen numeerisiksi ominaisuuksiksi

Mitä tulee meidän Class sarake – sen arvot eivät ole numeroita, joten meidän on myös muutettava ne. On monia tapoja tehdä tämä muutos; tässä käytämme replace() menetelmä ja vaihda Çerçevelik että 0 ja Ürgüp Sivrisi että 1.

y = y.replace('Çerçevelik', 0).replace('Ürgüp Sivrisi', 1)

Pidä kartoitus mielessä! Kun luet tuloksia mallistasi, haluat muuntaa ne takaisin ainakin mielessäsi tai takaisin luokannimeksi muille käyttäjille.

Tietojen jakaminen juna- ja testisarjoihin

Tutkiessamme olemme havainneet, että ominaisuuksia on skaalattava. Jos tekisimme skaalauksen nyt tai automaattisesti, skaalaamme arvot kokonaisuuden kanssa X ja y. Siinä tapauksessa esittelemme tietojen vuotaminen, koska pian valmistuvan testijoukon arvot olisivat vaikuttaneet skaalaukseen. Tietovuoto on yleinen syy ML-mallien toistamattomiin tuloksiin ja näennäisesti korkeaan suorituskykyyn.

Skaalauksen ajattelu osoittaa, että meidän on ensin jaettava X ja y tiedot edelleen juna- ja testisarjoihin ja sitten niihin sovittaa skaalausharjoitussarjassa ja muuttaa sekä juna- että testisarjat (ilman että testisarja on koskaan vaikuttanut skaalauslaitteeseen, joka tekee tämän). Käytämme tätä varten Scikit-Learniä train_test_split() menetelmä:

from sklearn.model_selection import train_test_split
SEED = 42 

X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=.25, 
                                                    random_state=SEED)

Asetus test_size=.25 varmistaa, että käytämme 25 % tiedoista testaukseen ja 75 % koulutukseen. Tämä voidaan jättää pois, kun se on oletusjako, mutta Pythonic tapa kirjoittaa koodia neuvoo, että "eksplisiittisyys on parempi kuin implisiittinen".

Huomautus: Lause "eksplisiitti on parempi kuin implisiittinen" on viittaus Pythonin Zentai PEP20. Siinä esitetään joitain ehdotuksia Python-koodin kirjoittamiseen. Jos näitä ehdotuksia noudatetaan, koodi otetaan huomioon Pythonic. Voit tietää siitä enemmän tätä.

Kun tiedot on jaettu juna- ja testisarjoihin, on hyvä käytäntö tarkastella, kuinka monta tietuetta kussakin sarjassa on. Se voidaan tehdä shape määrite:

X_train.shape, X_test.shape, y_train.shape, y_test.shape

Tämä näyttää:

((1875, 12), (625, 12), (1875,), (625,))

Näemme, että splitin jälkeen meillä on 1875 tietuetta harjoituksiin ja 625 testaukseen.

Tietojen skaalaus

Kun olemme saaneet juna- ja testisarjamme valmiiksi, voimme jatkaa tietojen skaalaamista Scikit-Learnin avulla StandardScaler objekti (tai muu kirjaston tarjoama skaalaus). Vuodon välttämiseksi skaalanpoistaja on asennettu X_train tietoja ja junaarvoja käytetään sitten skaalaamaan – tai muuttamaan – sekä juna- että testidataa:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

Koska tavallisesti soitat:

scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

Kaksi ensimmäistä riviä voidaan tiivistää yksiköllä fit_transform() puhelu, joka sopii skaalauslaitteeseen ja muuttaa sen yhdellä kertaa. Voimme nyt toistaa boxplot-kaaviot nähdäksemme eron tietojen skaalauksen jälkeen.

Koska skaalaus poistaa sarakkeiden nimet, voimme ennen piirtämistä järjestää junatiedot tietokehykseksi sarakkeiden nimillä visualisoinnin helpottamiseksi:

column_names = df.columns[:12] 
X_train = pd.DataFrame(X_train, columns=column_names)

sns.boxplot(data=X_train, orient='h')

Lopullinen opas logistiseen regressioon Python PlatoBlockchain Data Intelligencessa. Pystysuuntainen haku. Ai.

Vihdoinkin saamme nähdä kaikki boxplotimme! Huomaa, että niissä kaikissa on poikkeavuuksia ja ominaisuuksia, jotka esittävät normaalista kauempana jakauman (joissa käyrät ovat joko vinossa vasemmalle tai oikealle), kuten esim. Solidity, Extent, Aspect_Rationja Compactedness, ovat samat, joilla oli korkeammat korrelaatiot.

Poikkeamien poistaminen IQR-menetelmällä

Tiedämme jo, että poikkeamat voivat vaikuttaa logistiseen regressioon. Yksi tapa hoitaa niitä on käyttää menetelmää nimeltä Interkvartiilialue or IQR. IQR-menetelmän ensimmäinen vaihe on jakaa junatietomme neljään osaan, joita kutsutaan kvartiileiksi. Ensimmäinen kvartiili, Q1, on 25 % tiedoista, toinen, Q2, 50 %, kolmas, Q3, 75 %:iin ja viimeinen, Q4, 100 %:iin. Boksikuvaajan laatikot on määritelty IQR-menetelmällä, ja ne ovat visuaalinen esitys siitä.

Vaakasuuntaisessa laatikkokaaviossa vasemmalla oleva pystyviiva merkitsee 25 % tiedoista, pystyviiva keskellä 50 % tiedosta (tai mediaani) ja viimeinen pystyviiva oikealla 75 % tiedoista. . Mitä tasaisempia molemmat pystysuorien viivojen määrittämät neliöt ovat kooltaan – tai mitä enemmän pystysuora mediaaniviiva on keskellä – tarkoittaa, että tietomme ovat lähempänä normaalijakaumaa tai vähemmän vinoja, mikä on hyödyllistä analyysissämme.

IQR-laatikon lisäksi sen molemmilla puolilla on vaakasuoria viivoja. Nämä viivat merkitsevät minimi- ja maksimijakauman arvot, jotka on määritelty

$$
Minimi = Q1 – 1.5*IQR
$$

ja

$$
Maksimi = Q3 + 1.5*IQR
$$

IQR on täsmälleen ero Q3:n ja Q1:n (tai Q3 – Q1) välillä ja se on tiedon keskeisin kohta. Siksi IQR:ää etsiessämme päädymme suodattamaan poikkeamat datan ääripäissä tai minimi- ja maksimipisteissä. Laatikkokaaviot antavat meille kurkistuksen siitä, mikä on IQR-menetelmän tulos.

Lopullinen opas logistiseen regressioon Python PlatoBlockchain Data Intelligencessa. Pystysuuntainen haku. Ai.

Voimme käyttää Pandaa quantile() menetelmä kvantiilimme löytämiseksi, ja iqr mistä scipy.stats paketti saadaksesi kunkin sarakkeen kvartiilitietoalueen:

from scipy.stats import iqr

Q1 = X_train.quantile(q=.25)
Q3 = X_train.quantile(q=.75)

IQR = X_train.apply(iqr)

Nyt meillä on Q1, Q3 ja IQR, voimme suodattaa arvot lähempänä mediaania:


minimum = X_train < (Q1-1.5*IQR)
maximum = X_train > (Q3+1.5*IQR)


filter = ~(minimum | maximum).any(axis=1)


X_train = X_train[filter]

Harjoitusrivemme suodattamisen jälkeen voimme nähdä kuinka monta niistä on vielä tiedoissa shape:

X_train.shape

Tämä johtaa:

(1714, 12)

Näemme, että rivien määrä nousi 1875:stä 1714:ään suodatuksen jälkeen. Tämä tarkoittaa, että 161 riviä sisälsi poikkeavia arvoja eli 8.5 % tiedoista.

Huomautus: On suositeltavaa, että poikkeavien arvojen suodatus, NaN-arvojen poistaminen ja muut toiminnot, joihin liittyy tietojen suodattaminen ja puhdistaminen, pysyvät alle tai enintään 10 % tiedoista. Kokeile muita ratkaisuja, jos suodatus tai poisto ylittää 10 % tiedoistasi.

Poikkeamien poistamisen jälkeen olemme melkein valmiita sisällyttämään tiedot malliin. Mallin sovittamiseen käytämme junatietoja. X_train suodatetaan, mutta entä y_train?

y_train.shape

Tämä tuottaa:

(1875,)

Huomaa, että y_train siinä on vielä 1875 riviä. Meidän on sovitettava yhteen määrä y_train rivit numeroon X_train rivejä eikä vain mielivaltaisesti. Meidän on poistettava poistamiemme kurpitsansiementapahtumien y-arvot, jotka ovat todennäköisesti hajallaan y_train aseta. Suodatettu X_train stilillä on alkuperäiset indeksit ja indeksissä on aukkoja, joista poistimme poikkeamat! Voimme sitten käyttää hakemistoa X_train DataFrame etsiäksesi vastaavat arvot y_train:

y_train = y_train.iloc[X_train.index]

Tämän jälkeen voimme tarkastella y_train muoto uudestaan:

y_train.shape

Mitkä lähdöt:

(1714,)

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

Nyt, y_train on myös 1714 riviä ja ne ovat samat kuin X_train rivit. Olemme vihdoin valmiita luomaan logistisen regressiomallimme!

Logistisen regressiomallin käyttöönotto

Vaikein osa on tehty! Esikäsittely on yleensä vaikeampaa kuin mallin kehittäminen, kun on kyse Scikit-Learnin kaltaisten kirjastojen käytöstä, jotka ovat virtaviivaistaneet ML-mallien soveltamisen vain muutamalle riville.

Ensin tuomme maahan LogisticRegression luokka ja instantoi se luomalla a LogisticRegression esine:

from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression(random_state=SEED)

Toiseksi sovitamme junatietomme logreg mallin kanssa fit() menetelmällä ja ennustaa testitietomme predict() menetelmällä, tallentamalla tulokset muodossa y_pred:



logreg.fit(X_train.values, y_train)
y_pred = logreg.predict(X_test)

Olemme jo tehneet ennusteita mallillamme! Katsotaanpa 3 ensimmäistä riviä X_train nähdäksesi, mitä tietoja olemme käyttäneet:

X_train[:3]

Yllä oleva koodi tuottaa:

       Area          Perimeter     Major_Axis_Length    Minor_Axis_Length    Convex_Area   Equiv_Diameter       Eccentricity  Solidity      Extent        Roundness     Aspect_Ration        Compactness
0      -1.098308     -0.936518     -0.607941            -1.132551            -1.082768     -1.122359            0.458911      -1.078259     0.562847      -0.176041     0.236617             -0.360134
1      -0.501526     -0.468936     -0.387303            -0.376176            -0.507652     -0.475015            0.125764      0.258195      0.211703      0.094213      -0.122270            0.019480
2      0.012372      -0.209168     -0.354107            0.465095              0.003871      0.054384            -0.453911     0.432515      0.794735      0.647084      -0.617427            0.571137

Ja ensimmäisten 3 ennusteiden kohdalla y_pred nähdäksesi tulokset:

y_pred[:3] 

Tämä johtaa:

array([0, 0, 0])

Näille kolmelle riville ennustimme, että ne olivat ensimmäisen luokan siemeniä, Çerçevelik.

Kanssa logistinen regressio, sen sijaan, että ennustaisit lopullisen luokan, kuten 0, voimme myös ennustaa todennäköisyyden, että rivi koskee 0 luokkaa. Näin itse asiassa tapahtuu, kun logistinen regressio luokittelee tiedot ja predict() menetelmä siirtää sitten tämän ennusteen kynnyksen läpi palauttaakseen "kovan" luokan. Ennakoidaksesi luokkaan kuulumisen todennäköisyyttä, predict_proba() käytetään:

y_pred_proba = logreg.predict_proba(X_test)

Tarkastellaan myös y:n todennäköisyyksien ennusteiden kolmea ensimmäistä arvoa:

y_pred_proba[:3] 

Mitkä lähdöt:

        # class 0   class 1   
array([[0.54726628, 0.45273372],
       [0.56324527, 0.43675473],
       [0.86233349, 0.13766651]])

Nyt meillä on kolmen nollan sijasta yksi sarake jokaiselle luokalle. Vasemmalla olevassa sarakkeessa alkaen 0.54726628, ovat luokkaan liittyvien tietojen todennäköisyydet 0; ja oikeassa sarakkeessa alkaen 0.45273372, ovat todennäköisyys, että se liittyy luokkaan 1.

Huomautus: Tämä ero luokituksessa tunnetaan myös nimellä kova ja pehmeä ennustus. Kova ennuste laatikostaa ennusteen luokkaan, kun taas pehmeät ennusteet tulostavat todennäköisyys luokkaan kuuluvasta instanssista.

Siellä on enemmän tietoa siitä, kuinka ennustettu tulos on tehty. Se ei itse asiassa ollut 0, mutta 55 %:n todennäköisyys luokkaan 0, ja 45 %:n todennäköisyys luokkaan 1. Tämä paljastaa, miten kolme ensimmäistä X_test luokkaan liittyvät tietopisteet 0, ovat todella selkeitä vain kolmannen datapisteen osalta 86 %:n todennäköisyydellä – eikä niinkään kahden ensimmäisen datapisteen osalta.

Kun tiedotetaan löydöksistä ML-menetelmillä – yleensä on parasta palauttaa pehmeä luokka ja siihen liittyvä todennäköisyys "luottamus" tuosta luokittelusta.

Puhumme lisää siitä, miten se lasketaan, kun menemme syvemmälle malliin. Tällä hetkellä voimme siirtyä seuraavaan vaiheeseen.

Mallin arviointi luokitusraporttien avulla

Kolmas vaihe on nähdä, kuinka malli toimii testidatalla. Voimme tuoda Scikit-Learnin classification_report() ja ohita meidän y_test ja y_pred argumentteina. Sen jälkeen voimme tulostaa vastauksen.

Luokitteluraportti sisältää eniten käytetyt luokitusmittarit, kuten tarkkuus, muistaa, f1-pisteetja tarkkuus.

  1. Tarkkuus: ymmärtääksesi, mitä oikeita ennustearvoja luokittelijamme piti oikeina. Tarkkuus jakaa nämä todelliset positiiviset arvot kaikella, mikä ennustettiin positiiviseksi:

$$
tarkkuus = frac{teksti{tosi positiivinen}}{teksti{tosi positiivinen} + teksti{väärä positiivinen}}
$$

  1. Palauttaa mieleen: ymmärtääksesi kuinka monta todellista positiivista luokittimemme tunnisti. Palautus lasketaan jakamalla todelliset positiiviset asiat millä tahansa, jonka olisi pitänyt ennustaa positiiviseksi:

$$
muistaa = frac{teksti{tosi positiivinen}}{teksti{tosi positiivinen} + teksti{väärä negatiivinen}}
$$

  1. F1 pisteet: on tasapainoinen tai harmoninen keskiarvo tarkkuudesta ja muistamisesta. Pienin arvo on 0 ja suurin on 1. Milloin f1-score on yhtä suuri kuin 1, se tarkoittaa, että kaikki luokat ennustettiin oikein – tämä on erittäin vaikea saada todellisilla tiedoilla:

$$
teksti{f1-pisteet} = 2* frac{teksti{tarkkuus} * teksti{recall}}{teksti{tarkkuus} + teksti{recall}}
$$

  1. tarkkuus: kuvaa kuinka monta ennustetta luokittimemme osui oikeaan. Pienin tarkkuusarvo on 0 ja suurin on 1. Tämä arvo yleensä kerrotaan 100:lla prosenttiosuuden saamiseksi:

$$
tarkkuus = murto{teksti{oikeiden ennusteiden määrä}}{teksti{ennusteiden kokonaismäärä}}
$$

Huomautus: On äärimmäisen vaikeaa saada 100 % tarkkuutta mistään todellisesta tiedosta, jos näin tapahtuu, ota huomioon, että jokin vuoto tai jotain vikaa saattaa tapahtua – ideaalisesta tarkkuusarvosta ei ole yksimielisyyttä, ja se on myös kontekstista riippuvainen. Arvo 70 %, mikä tarkoittaa, että luokitin tekee virheitä 30 %:ssa tiedoista, tai yli 70 % on yleensä riittävä useimmille malleille.

from sklearn.metrics import classification_report
cr = classification_report(y_test, y_pred)
print(cr)

Sitten voimme tarkastella luokitusraportin tulosta:

				precision    recall  f1-score   support

           0       0.83      0.91      0.87       316
           1       0.90      0.81      0.85       309

    accuracy                           0.86       625
   macro avg       0.86      0.86      0.86       625
weighted avg       0.86      0.86      0.86       625

Tämä on tuloksemme. Huomaa, että precision, recall, f1-scoreja accuracy Mittarit ovat kaikki erittäin korkeita, yli 80 %, mikä on ihanteellista – mutta näihin tuloksiin vaikuttivat todennäköisesti korkeat korrelaatiot, eivätkä ne säily pitkällä aikavälillä.

Mallin tarkkuus on 86 %, mikä tarkoittaa, että se saa luokituksen väärin 14 % ajasta. Meillä on nämä yleistiedot, mutta olisi mielenkiintoista tietää tapahtuuko 14 % virheitä luokan luokittelussa 0 tai luokkaa 1. Sen tunnistamiseksi, mitkä luokat tunnistetaan väärin mitkä ja millä taajuudella – voimme laskea ja piirtää a sekaannusmatriisi mallimme ennusteista.

Mallin arviointi hämmennysmatriisin avulla

Lasketaan ja piirretään sitten sekaannusmatriisi. Sen jälkeen voimme ymmärtää sen jokaisen osan. Sekoitusmatriisin piirtämiseen käytämme Scikit-Learnia confusion_matrix(), jonka tuomme osoitteesta metrics moduuli.

Sekaannusmatriisi on helpompi visualisoida Seabornilla heatmap(). Joten sen luomisen jälkeen annamme hämmennysmatriisimme argumenttina lämpökartalle:

from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d')

Lopullinen opas logistiseen regressioon Python PlatoBlockchain Data Intelligencessa. Pystysuuntainen haku. Ai.

  1. Sekaannusmatriisi: matriisi näyttää kuinka monta näytettä mallilla on oikea tai väärä kussakin luokassa. Arvoja, jotka olivat oikein ja oikein ennustettu, kutsutaan tosi positiivisia, ja niitä, joiden ennustettiin olevan positiivisia, mutta jotka eivät olleet positiivisia, kutsutaan vääriä positiivisia. Sama nimikkeistö todellisia negatiivisia ja väärät negatiivit käytetään negatiivisille arvoille;

Katsomalla hämmennysmatriisikaaviota voimme nähdä, että meillä on 287 arvot jotka olivat 0 ja ennustettu kuten 0 - tai tosi positiivisia Oppituntia varten 0 (Çerçevelik-siemenet). Meillä on myös 250 todellista positiivista luokalle 1 (Ürgüp Sivrisi siemenet). Todelliset positiiviset ovat aina matriisin diagonaalissa, joka kulkee vasemmasta yläkulmasta oikeaan alakulmaan.

Meillä on myös 29 arvot, jotka piti olla 0, mutta ennustettu niin 1 (vääriä positiivisia) Ja 59 arvot jotka olivat 1 ja ennustettu kuten 0 (väärät negatiivit). Näiden numeroiden avulla voimme ymmärtää, että mallin eniten tekemä virhe on se, että se ennustaa vääriä negatiivisia. Joten se voi päätyä enimmäkseen luokittelemaan Ürgüp Sivrisi -siemenen Çerçevelik-siemeniksi.

Tällainen virhe selittyy myös sillä, että 81 % muistaa luokan 1. Huomaa, että mittarit ovat yhteydessä toisiinsa. Ja ero takaisinkutsussa johtuu siitä, että Ürgüp Sivrisi -luokan näytettä on 100 vähemmän. Tämä on yksi seurauksista siitä, että näytteitä on vain muutama vähemmän kuin toisessa luokassa. Parantaaksesi entisestään muistamista voit joko kokeilla luokkapainoja tai käyttää useampia Ürgüp Sivrisi -näytteitä.

Tähän mennessä olemme toteuttaneet suurimman osan datatieteen perinteisistä vaiheista ja käyttäneet logistista regressiomallia mustana laatikkona.

Huomautus: Jos haluat mennä pidemmälle, käytä Cross Validation (CV) ja ruudukkohaku etsiä vastaavasti mallia, joka yleistää eniten datan suhteen, ja parhaat malliparametrit, jotka valitaan ennen harjoittelua, tai hyperparametrien.

Ihannetapauksessa CV:n ja Grid Searchin avulla voit toteuttaa myös ketjutetun tavan suorittaa tietojen esikäsittelyvaiheita, tietojen jakamista, mallintamista ja arviointia – mikä on helppoa Scikit-Learnin avulla. putkistojen.

Nyt on aika avata musta laatikko ja katsoa sen sisälle syvemmälle ymmärtämään, miten logistinen regressio toimii.

Mene syvemmälle siihen, miten logistinen regressio todella toimii

- regressio sana ei ole vahingossa, jotta ymmärtäisimme, mitä logistinen regressio tekee, voimme muistaa, mitä sen sisarus, lineaarinen regressio tekee tiedoille. Lineaarisen regression kaava oli seuraava:

$$
y = b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n
$$

Missä b0 oli regression leikkauspiste, b1 kerroin ja x1 tiedot.

Tämä yhtälö johti suoraan, jota käytettiin uusien arvojen ennustamiseen. Johdantoa muistettaessa erona on nyt se, että emme ennusta uusia arvoja, vaan luokkaa. Joten tuon suoran on muutettava. Logistisella regressiolla otamme käyttöön epälineaarisuuden ja ennuste tehdään nyt käyttämällä käyrää viivan sijaan:

Lopullinen opas logistiseen regressioon Python PlatoBlockchain Data Intelligencessa. Pystysuuntainen haku. Ai.

Huomaa, että vaikka lineaarinen regressioviiva jatkuu ja muodostuu jatkuvista äärettömistä arvoista, logistinen regressiokäyrä voidaan jakaa keskelle ja siinä on ääripäät arvoissa 0 ja 1. Tämä "S"-muoto on syy tietojen luokitteluun - pisteet, jotka ovat lähempänä tai putoavat ylimpään ääripäähän kuuluvat luokkaan 1, kun taas pisteet, jotka ovat alemmassa kvadrantissa tai lähempänä 0:ta, kuuluvat luokkaan 0. "S" on väli 0 ja 1, 0.5 – se on logististen regressiopisteiden kynnys.

Lopullinen opas logistiseen regressioon Python PlatoBlockchain Data Intelligencessa. Pystysuuntainen haku. Ai.

Ymmärrämme jo visuaalisen eron logistisen ja lineaarisen regression välillä, mutta entä kaava? Logistisen regression kaava on seuraava:

$$
y = b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n
$$

Se voidaan kirjoittaa myös seuraavasti:

$$
y_{todennäköisyys} = murtoluku{1}{1 + e^{(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}}
$$

Tai jopa kirjoitetaan näin:

$$
y_{todennäköisyys} = murto{e^{(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}}{1 + e^{(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}}
$$

Yllä olevassa yhtälössä meillä on syötteen todennäköisyys sen arvon sijaan. Sen osoittaja on 1, joten se voi johtaa arvon välillä 0 ja 1, ja 1 plus arvon nimittäjään, joten sen arvo on 1 ja jotain – tämä tarkoittaa, että koko murtoluku ei voi olla suurempi kuin 1 .

Ja mikä on nimittäjässä oleva arvo? se on e, luonnollisen logaritmin kanta (noin 2.718282), korotettuna lineaarisen regression potenssiin:

$$
e^{(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}
$$

Toinen tapa kirjoittaa se olisi:

$$
vasen (frac{p}{1-p} oikea) = {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}
$$

Tuossa viimeisessä yhtälössä ln on luonnollinen logaritmi (kanta e) ja p on todennäköisyys, joten tuloksen todennäköisyyden logaritmi on sama kuin lineaarisen regression tulos.

Toisin sanoen lineaarisen regression tuloksen ja luonnollisen logaritmin avulla voimme päätyä todennäköisyyteen syötteelle, joka liittyy suunniteltuun luokkaan tai ei.

Koko logistisen regression johtamisprosessi on seuraava:

$$
p{X} = murto{e^{(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}}{1 + e^{(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}}
$$

$$
p(1 + e^{(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}) = e^{(b_0 + b_1 * x_1 + b_2 *x_2 + b_3 * x_3 + lpistettä + b_n * x_n)}
$$

$$
p + p*e^{(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)} = e^{(b_0 + b_1 * x_1 + b_2 *x_2 + b_3 * x_3 + lpisteet + b_n * x_n)}
$$

p
=

e

(

b
0

+

b
1

*

x
1

+

b
2

*

x
2

+

b
3

*

x
3

+
...
+

b
n

*

x
n

)

-
p
*

e

(

b
0

+

b
1

*

x
1

+

b
2

*

x
2

+

b
3

*

x
3

+
...
+

b
n

*

x
n

)

$$
frac{p}{1-p} = e^{(b_0 + b_1 * x_1 + b_2 *x_2 + b_3 * x_3 + ldots + b_n * x_n)}
$$

$$
Vasen (frac{p}{1-p} oikea) = (b_0 + b_1 * x_1 + b_2 *x_2 + b_3 * x_3 + ldots + b_n * x_n)
$$

Tämä tarkoittaa, että logistisella regressiomallilla on myös kertoimet ja leikkausarvo. Koska se käyttää lineaarista regressiota ja lisää siihen epälineaarisen komponentin luonnollisella logaritmilla (e).

Näemme mallimme kertoimien ja leikkauspisteen arvot samalla tavalla kuin teimme lineaarisen regression tapauksessa käyttämällä coef_ ja intercept_ ominaisuudet:

logreg.coef_

Joka näyttää kunkin 12 ominaisuuden kertoimet:

array([[ 1.43726172, -1.03136968,  0.24099522, -0.61180768,  1.36538261,
        -1.45321951, -1.22826034,  0.98766966,  0.0438686 , -0.78687889,
         1.9601197 , -1.77226097]])
logreg.intercept_

Siitä seuraa:

array([0.08735782])

Kertoimien ja leikkauspistearvojen avulla voimme laskea datamme ennustetut todennäköisyydet. Otetaan ensimmäinen X_test arvot uudelleen, esimerkkinä:

X_test[:1]

Tämä palauttaa ensimmäisen rivin X_test NumPy-taulukona:

array([[-1.09830823, -0.93651823, -0.60794138, -1.13255059, -1.0827684 ,
        -1.12235877,  0.45891056, -1.07825898,  0.56284738, -0.17604099,
         0.23661678, -0.36013424]])

Alkuyhtälön jälkeen:

$$
p{X} = murto{e^{(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}}{1 + e^{(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}}
$$

Pythonissa meillä on:

import math

lin_reg = logreg.intercept_[0] + 
((logreg.coef_[0][0]* X_test[:1][0][0])+ 
(logreg.coef_[0][1]* X_test[:1][0][1])+ 
(logreg.coef_[0][2]* X_test[:1][0][2])+ 
(logreg.coef_[0][3]* X_test[:1][0][3])+ 
(logreg.coef_[0][4]* X_test[:1][0][4])+ 
(logreg.coef_[0][5]* X_test[:1][0][5])+ 
(logreg.coef_[0][6]* X_test[:1][0][6])+ 
(logreg.coef_[0][7]* X_test[:1][0][7])+ 
(logreg.coef_[0][8]* X_test[:1][0][8])+ 
(logreg.coef_[0][9]* X_test[:1][0][9])+ 
(logreg.coef_[0][10]* X_test[:1][0][10])+ 
(logreg.coef_[0][11]* X_test[:1][0][11]))

px = math.exp(lin_reg)/(1 +(math.exp(lin_reg)))
px

Tämä johtaa:

0.45273372469369133

Jos katsomme uudelleen predict_proba ensimmäisen tulos X_test rivi, meillä on:

logreg.predict_proba(X_test[:1])


Tämä tarkoittaa, että alkuperäinen logistinen regressioyhtälö antaa meille luokkaan liittyvän syötteen todennäköisyyden 1, selvittääksesi mikä todennäköisyys on luokalle 0, voimme yksinkertaisesti:

1 - px


Huomaa, että molemmat px ja 1-px ovat identtisiä predict_proba tuloksia. Näin logistinen regressio lasketaan ja miksi regressio on osa sen nimeä. Mutta entä termi logistinen?

Termi logistinen tulee logit, joka on toiminto, jonka olemme jo nähneet:

$$
vasemmalla (frac{p}{1-p} oikealla)
$$

Olemme juuri laskeneet sen kanssa px ja 1-px. Tämä on logit, jota myös kutsutaan log-kertoimet koska se on yhtä suuri kuin kertoimien logaritmi missä p on todennäköisyys.

Yhteenveto

Tässä oppaassa olemme tutkineet yhtä perustavanlaatuisimmista koneoppimisen luokittelualgoritmeista, ts logistinen regressio.

Aluksi toteutimme logistisen regression mustana laatikkona Scikit-Learnin koneoppimiskirjaston kanssa, ja myöhemmin ymmärsimme sen askel askeleelta saadaksemme selväksi, miksi ja mistä termit regressio ja logistiikka ovat peräisin.

Olemme myös tutkineet ja tutkineet dataa, ymmärtäen, että se on yksi datatieteen analyysin tärkeimmistä osista.

Tästä eteenpäin neuvoisin sinua leikkiä moniluokkainen logistinen regressio, logistinen regressio useammalle kuin kahdelle luokalle – voit käyttää samaa logistista regressioalgoritmia muille tietojoukoille, joissa on useita luokkia, ja tulkita tuloksia.

Huomautus: Saatavilla on hyvä kokoelma tietojoukkoja tätä jotta voit leikkiä.

Suosittelen sinua myös opiskelemaan L1 ja L2 laillistuksia, ne ovat tapa "rangaista" korkeampaa dataa, jotta se tulee lähemmäksi normaalia, mikä kestää mallin monimutkaisuuden, jotta algoritmi voi saada paremman tuloksen. Käyttämässämme Scikit-Learn-toteutuksessa on jo L2-regulaatio oletusarvoisesti. Toinen huomioitava asia on erilainen ratkaisijat, Kuten lbgs, jotka optimoivat logistisen regressioalgoritmin suorituskyvyn.

On myös tärkeää katsoa tilastollinen lähestymistapa logistiseen regressioon. Sillä on oletukset Tietojen käyttäytymisestä ja muista tilastoista, jotka on säilytettävä tyydyttävien tulosten takaamiseksi, kuten:

  • havainnot ovat riippumattomia;
  • selittävien muuttujien välillä ei ole multikollineaarisuutta;
  • ei ole äärimmäisiä poikkeavuuksia;
  • selittävien muuttujien ja vastemuuttujan logiitin välillä on lineaarinen suhde;
  • otoskoko on riittävän suuri.

Huomaa, kuinka monet näistä oletuksista käsiteltiin jo tietojen analysoinnissa ja käsittelyssä.

Toivon, että jatkat tutkimista, mitä logistisella regressiolla on tarjota kaikissa eri lähestymistavoissaan!

Aikaleima:

Lisää aiheesta Stackabus