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 Area
ja 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')
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)
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')
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_Ration
ja 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.
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.
- 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}}
$$
- 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}}
$$
- 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}}
$$
- 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-score
ja 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')
- 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:
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.
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!
- blockchain
- C + +
- koodi
- coingenius
- tietojenkäsittely
- datan visualisointi
- Jaava
- matplotlib
- ei korvattava tunnus
- numpy
- Avoin meri
- pandas
- PHP
- Platon
- plato ai
- Platonin tietotieto
- Platon peli
- Platoblockchain
- PlatonData
- platopeliä
- Monikulmio
- Python
- suhtautua
- scikit opittava
- merestä syntynyt
- älykäs sopimus
- Solana
- Stackabus
- Vyper
- Web3
- zephyrnet