Campus Recruitment: osztályozási probléma logisztikai regresszióval

Campus Recruitment: osztályozási probléma logisztikai regresszióval

Forrás csomópont: 1996810

Bevezetés

Ebben a projektben az Indiából származó adatokra fogunk összpontosítani. Célunk pedig az, hogy megteremtsük a prediktív modell, mint például a logisztikai regresszió stb., hogy amikor megadjuk egy jelölt jellemzőit, a modell meg tudja jósolni, hogy toborozni fog-e.

adatbázisba egy indiai Business School elhelyezési szezonja körül forog. Az adatkészlet különböző tényezőket tartalmaz a jelöltekre vonatkozóan, mint például a munkatapasztalat, a vizsgaszázalék stb. Végül tartalmazza a toborzás állapotát és a díjazás részleteit.

Adattudományi probléma a logisztikai regresszióval

Az egyetemi toborzás egy stratégia fiatal tehetségek beszerzésére, bevonására és felvételére gyakornoki és belépő szintű pozíciókra. Ez gyakran magában foglalja az egyetemi karrierszolgáltató központokkal való együttműködést és a karrierbörzéken való részvételt, hogy személyesen találkozzanak főiskolai hallgatókkal és frissen végzettekkel.

Ez a cikk részeként jelent meg Adattudományi Blogaton.

Tartalomjegyzék

  1. A probléma megoldásának lépései
  2. Adatok előkészítése
  3. Építsen fel egy logisztikai regressziós modellt
  4. A logisztikai regressziós modell eredményei
  5. Következtetés

A probléma megoldásának lépései

Ebben a cikkben importáljuk az adatkészletet, megtisztítjuk, majd előkészítjük egy logisztikus regressziós modell felépítéséhez. Céljaink itt a következők:

Először is elkészítjük adatkészletünket bináris osztályozás. Most mire gondolok? ha egy folyamatos értéket próbálunk megjósolni, például egy lakás árát, az nulla és sok millió dollár közötti tetszőleges szám lehet. Regressziós problémának nevezzük.

De ebben a projektben a dolgok egy kicsit másképp alakulnak. A folytonos érték előrejelzése helyett diszkrét csoportokat vagy osztályokat próbálunk megjósolni közöttük. Tehát ezt osztályozási problémának hívják, és mivel a projektünkben csak két csoport lesz, amelyek közül próbálunk választani, ez bináris osztályozássá teszi.

A második cél egy logisztikus regressziós modell létrehozása a toborzás előrejelzésére. A harmadik célunk pedig az, hogy megmagyarázzuk modellünk előrejelzéseit az esélyhányados segítségével.

Ami a gépi tanulási munkafolyamatot illeti, a követendő lépéseket és néhány újdonságot, amelyeket az út során megtanulunk. Tehát az importálási fázisban felkészítjük adatainkat, hogy egy bináris céllal működjenek. A feltárás fázisában az osztályegyensúlyt fogjuk vizsgálni. Tehát alapvetően a jelöltek mekkora hányada volt felvett, és milyen arányban nem? a jellemzők kódolási fázisában pedig a kategorikus jellemzőink szerint végezzük a kódolást. Az osztott részben véletlenszerű vonatteszt-felosztást végzünk.

A modellépítési szakaszban először is beállítjuk az alapvonalat, és mivel pontossági pontszámokat fogunk használni, többet fogunk beszélni arról, hogy mi a pontossági pontszám, és hogyan építsünk ki alapvonalat, amikor ez az a mutató, amelyre kíváncsiak vagyunk. Másodszor logisztikus regressziót fogunk végezni. És végül, de nem utolsósorban következik az értékelési szakasz. Ismét a pontossági pontszámra összpontosítunk. Végül az eredmények közlése érdekében megvizsgáljuk az esélyarányt.

Végül, mielőtt belemerülnénk a munkába, mutatkozzunk be az általunk használt könyvtáraknak, dobjuk a projektet. Először is importáljuk adatainkat a Google Colabe notebookba az io könyvtárba. Ezután, mivel logisztikus regressziós modellt fogunk használni, azt importáljuk a scikit-learnből. Utána is től scikit elsajátítható, importálni fogjuk teljesítménymutatóinkat, a pontossági pontszámot és a vonatteszt-felosztást.

Használni fogjuk matplotlib és tengeri vizualizációnk számára, és numpy  csak kis matek lesz.
Szükségünk van pandák az adataink manipulálására, a labelencoder a kategorikus változóink kódolására, a szabványos skálázó pedig az adatok normalizálására. Ezek lesznek azok a könyvtárak, amelyekre szükségünk lesz.

Ugorjunk bele az adatok előkészítésébe.

#import libraries
import io
import warnings import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler warnings.simplefilter(action="ignore", category=FutureWarning)

Adatok előkészítése

import

Az adatok előkészítésének megkezdéséhez lássuk fontos munkánkat. Először betöltjük az adatfájlunkat, majd el kell helyeznünk őket egy DataFrame `df.` fájlba

from google.colab import files
uploaded = files.upload()
# Read CSV file
df = pd.read_csv(io.BytesIO(uploaded["Placement_Data_Full_Class.csv"]))
print(df.shape)
df.head()
Adatkészlet a logisztikai regresszióhoz

Láthatjuk a gyönyörű DataFrame-ünket, és 215 rekordunk és 15 oszlopunk van, amelyek tartalmazzák a "status" attribútumot, a célunkat. Ez az összes funkció leírása.

Logisztikus regresszió

Fedezd fel

Most mindezekkel a funkciókkal rendelkezünk, amelyeket megvizsgálunk. Tehát kezdjük a mi feltáró adatelemzés. Először is vessünk egy pillantást az adatkeretre vonatkozó információkra, és nézzük meg, hogy esetleg meg kell-e tartanunk valamelyiket, vagy esetleg el kell hagynunk.

# Inspect DataFrame
df.info() <class 'pandas.core.frame.DataFrame'>
RangeIndex: 215 entries, 0 to 214
Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 sl_no 215 non-null int64 1 gender 215 non-null object 2 ssc_p 215 non-null float64 3 ssc_b 215 non-null object 4 hsc_p 215 non-null float64 5 hsc_b 215 non-null object 6 hsc_s 215 non-null object 7 degree_p 215 non-null float64 8 degree_t 215 non-null object 9 workex 215 non-null object 10 etest_p 215 non-null float64 11 specialisation 215 non-null object 12 mba_p 215 non-null float64 13 status 215 non-null object 14 salary 148 non-null float64
dtypes: float64(6), int64(1), object(8)
memory usage: 25.3+ KB

Ha most megnézzük a `df' információkat, van néhány dolog, amit keresünk, 215 sor van az adatkeretünkben, és azt a kérdést szeretnénk feltenni magunknak, hogy nincs-e hiányzó adat? És ha ide nézünk, úgy tűnik, a fizetés rovaton kívül nincs hiányzó adatunk, ahogy az várható volt, a fel nem vett jelöltek miatt.

A másik aggodalomra ad okot, hogy vannak-e olyan szivárgó funkciók, amelyek olyan információkat adnának a modellünknek, amelyekkel nem rendelkezne, ha a valós világban telepítenék? Ne feledje, hogy azt akarjuk, hogy modellünk megjósolja, hogy egy jelölt helyezést ér-e el vagy sem, és azt akarjuk, hogy a modellünk ezeket a jóslatokat a toborzás megtörténte előtt tegye meg. Ezekről a jelöltekről tehát a toborzás után nem kívánunk tájékoztatást adni.

Tehát elég egyértelmű, hogy ez a "fizetés" funkció információt ad a vállalat által kínált fizetésről. És mivel ez a fizetés azoknak szól, akiket elfogadnak, ez a tulajdonság itt kiszivárogtatást jelent, és el kell hagynunk.

df.drop(columns="salary", inplace=True)

A második dolog, amit meg akarok nézni, az ezekhez a különféle szolgáltatásokhoz tartozó adattípusok. Tehát ezeket az adattípusokat tekintve nyolc kategorikus jellemzőnk van a célunkkal és hét numerikus jellemzőnk, és minden helyes. Tehát most, hogy megvannak ezek az ötleteink, szánjunk egy kis időt, hogy mélyebben megvizsgáljuk őket.

Tudjuk, hogy a célunknak két osztálya van. Jelölteket állítottunk fel, és nem jelölteket. A kérdés az, hogy mekkora e két osztály relatív aránya? Ugyanarról az egyensúlyról szólnak? Vagy az egyik sokkal több, mint a másik? Ez olyasvalami, amit érdemes szemügyre venni, amikor osztályozási problémákat intéz. Tehát ez egy jelentős lépés az EDA-nkban.

# Plot class balance
df["status"].value_counts(normalize=True).plot( kind="bar", xlabel="Class", ylabel="Relative Frequency", title="Class Balance"
);
Osztálykiegyensúlyozatlanság a logisztikai regresszióhoz

A pozitív osztályunk az „elhelyezett” megfigyeléseink több mint 65%-át teszi ki, a negatív osztályunk a „Nem helyezett” pedig 30% körüli. Nos, ha ezek rendkívül kiegyensúlyozatlanok lennének, például ha több lenne, mint 80 vagy még ennél is több, akkor azt mondanám, hogy ezek kiegyensúlyozatlan osztályok. És még dolgoznunk kell, hogy megbizonyosodjunk arról, hogy a modellünk a megfelelő módon fog működni. De ez egy jó egyensúly.

Készítsünk még egy vizualizációt, hogy észrevegyük az összefüggést jellemzőink és a cél között. Kezdjük a numerikus jellemzőkkel.

Először egy eloszlási diagram segítségével láthatjuk a jellemzők egyedi eloszlását, és egy dobozdiagram segítségével láthatjuk a numerikus jellemzők és a célunk közötti kapcsolatot is.

fig,ax=plt.subplots(5,2,figsize=(15,35))
for index,i in enumerate(df.select_dtypes("number").drop(columns="sl_no")): plt.suptitle("Visualizing Distribution of Numerical Columns Indivualy and by Class",size=20) sns.histplot(data=df, x=i, kde=True, ax=ax[index,0]) sns.boxplot(data=df, x='status', y=i, ax=ax[index,1]);
"Logisztikus regresszió

A cselekményünk első oszlopában azt láthatjuk, hogy az összes megoszlás normál eloszlást követ, és a jelölt oktatási teljesítményének nagy része 60-80% között mozog.

A második oszlopban van egy dupladobozos rajzunk, a jobb oldalon a 'Elhelyezett' osztály, majd a bal oldalon a 'Not Placed' osztály. Az 'etest_p' és 'mba_p' jellemzők esetében nincs sok különbség a két disztribúció között a modellépítés szempontjából. Jelentős átfedés van az osztályok közötti megoszlásban, így ezek a jellemzők nem lennének jó előrejelzők a célunkra vonatkozóan. Ami a többi jellemzőt illeti, ezek elég jól megkülönböztethetők ahhoz, hogy célpontunk lehetséges jó előrejelzőjeként tekintsünk rájuk. Térjünk át a kategorikus jellemzőkre. Feltárásukhoz pedig egy számolási diagramot fogunk használni.

fig,ax=plt.subplots(7,2,figsize=(15,35))
for index,i in enumerate(df.select_dtypes("object").drop(columns="status")): plt.suptitle("Visualizing Count of Categorical Columns",size=20) sns.countplot(data=df,x=i,ax=ax[index,0]) sns.countplot(data=df,x=i,ax=ax[index,1],hue="status")
"Logisztikus regresszió

A cselekményt nézve azt látjuk, hogy több férfi jelöltünk van, mint nő. A legtöbb jelöltünknek nincs munkatapasztalata, de ezeket a jelölteket többen vették fel, mint akiknek volt. Vannak olyan jelöltjeink, akik kereskedelmi pályát végeztek „hsc” szakként, és az alsó tagozaton kívül a tudományos háttérrel rendelkezők mindkét esetben a második legmagasabbak.

Egy kis megjegyzés a logisztikus regressziós modellekhez, bár osztályozásra szolgálnak, ugyanabba a csoportba tartoznak, mint a többi lineáris modell, például a lineáris regresszió, és ezért, mivel mindkettő lineáris modell. A multikollinearitás kérdésével is foglalkoznunk kell. Tehát létre kell hoznunk egy korrelációs mátrixot, majd azt hőtérképen kell ábrázolnunk. Itt nem az összes jellemzőt akarjuk megvizsgálni, csak a számszerű jellemzőket akarjuk megnézni, és nem akarjuk belefoglalni a célunkat. Mivel ha a célunk korrelál néhány funkciónkkal, az nagyon jó.

corr = df.select_dtypes("number").corr()
# Plot heatmap of `correlation`
plt.title('Correlation Matrix')
sns.heatmap(corr, vmax=1, square=True, annot=True, cmap='GnBu');
korrelációs mátrix

Itt van a világoskék, ami alig vagy egyáltalán nem jelent összefüggést, és a sötétkék, amivel magasabb a korrelációnk. Szóval szeretnénk vigyázni a sötétkékekre. Láthatunk egy sötétkék vonalat, egy átlós vonalat, amely lefelé halad a cselekmény közepén. Ezek azok a tulajdonságok, amelyek önmagukkal korrelálnak. És akkor látunk néhány sötét négyzetet. Ez azt jelenti, hogy egy csomó összefüggés van a funkciók között.

Az EDA utolsó lépésében ellenőriznünk kell a kategorikus jellemzők magas-alacsony számosságát. A kardinalitás egy kategorikus változóban található egyedi értékek számát jelenti. A magas kardinalitás azt jelenti, hogy a kategorikus jellemzőknek nagyszámú egyedi értéke van. Az egyedi értékeknek nincs pontos száma, amely egy jellemzőt nagyszámúvá tenne. De ha a kategorikus jellemző értéke szinte minden megfigyelésnél egyedi, akkor általában el lehet dobni.

# Check for high- and low-cardinality categorical features
df.select_dtypes("object").nunique() gender 2
ssc_b 2
hsc_b 2
hsc_s 3
degree_t 3
workex 2
specialisation 2
status 2
dtype: int64

Nem látok olyan oszlopokat, ahol az egyedi értékek száma egy vagy bármi szuper magas lenne. De azt hiszem, van egy kategorikus típusú rovat, amit itt hiányolunk. Ennek az az oka, hogy nem objektumként, hanem egész számként van kódolva. Az 'sl_no' oszlop nem egész szám az általunk ismert értelemben. Ezek a jelöltek valamilyen sorrendben vannak rangsorolva. Csak egy egyedi névcímke, és a név olyan, mint egy kategória, igaz? Tehát ez egy kategorikus változó. És nincs információja, ezért el kell hagynunk.

df.drop(columns="sl_no", inplace=True)

Jellemzők Kódolás

Befejeztük az elemzést, és a következő lépés a kategorikus jellemzőink kódolása, a 'LabelEncoder'-t fogom használni. A címkekódolás egy népszerű kódolási technika kategorikus változók kezelésére. Ezzel a technikával minden címkéhez egyedi egész szám van hozzárendelve alfabetikus sorrend alapján.

lb = LabelEncoder () cat_data = ['gender', 'ssc_b', 'hsc_b', 'hsc_s', 'degree_t', 'workex', 'specialisation', 'status']
for i in cat_data: df[i] = lb.fit_transform(df[i]) df.head()
kód kimenet

Hasított

Importáltuk és megtisztítottuk adatainkat. Elvégeztünk egy kis feltáró adatelemzést, és most fel kell osztanunk adatainkat. Kétféle felosztásunk van: függőleges felosztás vagy jellemző-cél és vízszintes split vagy vonat-teszt készletek. Kezdjük a függőlegessel. Létrehozzuk az „X” jellemzőmátrixunkat és az „y” célvektorunkat. Célunk a „státusz”. Jellemzőink legyenek az összes olyan oszlop, amely a "df"-ben marad.

#vertical split
target = "status"
X = df.drop(columns = target)
y = df[target]

A modellek általában jobban teljesítenek, ha normalizált adatokkal rendelkeznek a képzéshez, tehát mi a normalizálás? Normalizálás több változó értékét egy hasonló tartományba transzformálja. Célunk a változóink normalizálása. Tehát az értéktartományuk 0 és 1 között lesz. Tegyük ezt meg, és én a `StandardScaler'-t fogom használni.

scaler = StandardScaler()
X = scaler.fit_transform(X)

Most végezzük el a vízszintes osztási vagy vonat-teszt készleteket. Adatainkat (X és y) képzési és teszthalmazokra kell felosztanunk egy randomizált vonat-teszt felosztás segítségével. tesztkészletünk az összes adatunk 20%-a legyen. És ne felejtsük el beállítani a random_state értéket a reprodukálhatóság érdekében.

X_train, X_test, y_train, y_test = train_test_split( X, y, test_size = 0.2, random_state = 42 ) print("X_train shape:", X_train.shape)
print("y_train shape:", y_train.shape)
print("X_test shape:", X_test.shape)
print("y_test shape:", y_test.shape) X_train shape: (172, 12)
y_train shape: (172,)
X_test shape: (43, 12)
y_test shape: (43,)

Építsen fel egy logisztikai regressziós modellt

kiindulási

Tehát most el kell kezdenünk a modellünk felépítését, és el kell kezdenünk a megrendelést, hogy beállítsuk az alapállapotunkat. Ne feledje, hogy a probléma típusa, amellyel foglalkozunk, egy osztályozási probléma, és az osztályozási modellek értékelésére különböző mérőszámok állnak rendelkezésre. Amire szeretnék összpontosítani, az a pontossági pontszám.

Most mi a pontossági pontszám? A gépi tanulás pontossági pontszáma egy olyan értékelési mérőszám, amely a modell által adott helyes előrejelzések számát méri az előrejelzések teljes számához viszonyítva. Úgy számítjuk ki, hogy a helyes előrejelzések számát elosztjuk az összes jóslat számával. Tehát ez azt jelenti, hogy a pontossági pontszám 0 és 1 közé esik. A nulla nem jó. Ez az, ahol nem akarsz lenni, és az egyik tökéletes. Tartsuk tehát ezt szem előtt, és ne feledjük, hogy az alapvonal egy olyan modell, amely újra és újra egy előrejelzést ad, függetlenül attól, hogy mi a megfigyelés, számunkra csak egy tippet.

A mi esetünkben két osztályunk van, helyezett vagy sem. Tehát ha csak egy jóslatot tehetünk, mi lenne az egyetlen tippünk? Ha azt mondtad, hogy a többségi osztály. Szerintem ennek van értelme, nem? Ha csak egy előrejelzésünk lehet, akkor valószínűleg azt kell választanunk, amelyik a legmagasabb megfigyeléseket tartalmazza az adatkészletünkben. Tehát az alapvonalunk azt a százalékos arányt fogja használni, amelyet a többségi osztály a képzési adatokban megjelenít. Ha a modell nem üti meg ezt az alapvonalat, akkor a jellemzők nem adnak hozzá értékes információkat megfigyeléseink osztályozásához.

Használhatjuk a "value_counts" metódust a "normalize = True" argumentummal az alapvonal pontosságának kiszámításához:

acc_baseline = y_train.value_counts(normalize=True).max()
print("Baseline Accuracy:", round(acc_baseline, 2)) Baseline Accuracy: 0.68

Láthatjuk, hogy alappontosságunk 68% vagy 0.68 arányban. Tehát ahhoz, hogy értéket adhassunk a hasznunkhoz, szeretnénk e szám fölé kerülni, és közelebb kerülni egyhez. Ez a célunk, és most kezdjük el modellünk felépítését.

Hajtogat

Most itt az ideje, hogy megépítsük a modellünket a logisztikai regresszió segítségével. Logisztikus regressziót fogunk használni, de előtte beszéljünk egy kicsit arról, hogy mi az a logisztikai regresszió, és hogyan működik, majd végezhetjük el a kódolást. És ehhez itt van egy kis rácsunk.

Tegyük fel, hogy az x tengely mentén megvan a jelöltek p_degrees értéke az adatkészletünkben. És ahogy haladok jobbról balra, egyre magasabbak a fokok, majd az Y tengely mentén megvannak a lehetséges osztályok az elhelyezéshez: nulla és egy.

grafikon a logisztikai regresszióhoz

Tehát, ha felvázolnánk az adatpontjainkat, hogyan nézne ki? Elemzésünk azt mutatja, hogy a magas `p_degree` jelöltet nagyobb valószínűséggel veszik fel. Valószínűleg így nézne ki, ahol a kis `p_fokkal` rendelkező jelölt nullán lenne. A magas `p_fokkal` rendelkező jelölt pedig eggyel magasabb.

p-diploma logisztikai regresszióból

Tegyük fel, hogy ezzel lineáris regressziót akartunk csinálni. Tegyük fel, hogy egy vonalat akartunk rajzolni.
Ha ezt megtennénk, akkor az történne, hogy az egyenest úgy ábrázolják, hogy a lehető legközelebb legyen az összes ponthoz. És így valószínűleg egy olyan vonalhoz jutnánk, amely valahogy így néz ki. Ez jó modell lenne?

hajtogat

Nem igazán. Ami történne, az az, hogy a jelölt p_fokától függetlenül mindig kapunk egyfajta értéket. És ez nem segít nekünk, mert a számok ebben az összefüggésben nem jelentenek semmit. Ennek az osztályozási problémának nullának vagy egynek kell lennie. Szóval ez így nem fog menni.

Másrészt, mivel ez egy sor, mi van akkor, ha nagyon alacsony p_fokú jelöltünk van? Nos, a becslésünk hirtelen negatív szám. És ennek megint semmi értelme. Nincs negatív szám, annak nullának vagy egynek kell lennie. És ugyanígy, ha van egy jelöltünk nagyon magas p_fokozattal, akkor lehet, hogy van egy pozitívum, valami felette. És ennek megint semmi értelme. Egy nullát vagy egyet kell kapnunk.

előrejelzés

Tehát amit itt látunk, az néhány komoly korlátja a lineáris regresszió osztályozási használatának. Tehát mit kell tennünk? Létre kell hoznunk egy olyan modellt, amelyik az első számú: nem megy nulla alá vagy egy fölé, ezért nulla és egy közé kell kötni. És a kettes szám, bármi is jön ki ebből a függvényből, abból az egyenletből, amit létrehozunk, talán nem önmagában jóslatként kellene kezelnünk, hanem a végső előrejelzésünk felé tett lépésként.

Hadd bontsam ki, amit az imént mondtam, és emlékeztessük magunkat, hogy amikor a lineáris regressziós modelljeinket készítjük, a végén ehhez a lineáris egyenlethez jutunk, amely a legegyszerűbb forma. És ez az az egyenlet vagy függvény, amely megadja nekünk ezt az egyenest.

img

Van egy módja annak, hogy ezt a sort 0 és 1 közé kössük. És azt tehetjük, hogy vesszük ezt a most létrehozott függvényt, és bezárjuk egy másik függvénybe, amit szigmoid függvénynek nevezünk.

funkció a logisztikai regresszióhoz

Tehát felveszem az imént kapott lineáris egyenletet, és csökkentem a szigmoid függvényben, és exponenciálisnak teszem.

funkció a logisztikai regresszióhoz

Az történik, hogy ahelyett, hogy egyenes vonalat kapnánk, egy vonalat kapunk, amely valahogy így néz ki. Az egyiknél elakadt. Bejön és lefelé kunkorodik. Ezután a nullán ragad.

logisztikus regresszió

Igaz, így néz ki a vonal, és láthatjuk, hogy megoldottuk az első problémánkat. Bármit is kapunk ki ebből a függvényből, 0 és 1 között lesz. A második lépésben nem fogjuk azt kezelni, ami ebből az egyenletből származik, mint végső előrejelzést. Ehelyett valószínűségként fogjuk kezelni.

logisztikus regresszió

Mire gondolok? Ez azt jelenti, hogy amikor jóslatot készítek, 0 és 1 közötti lebegőpontos értéket kapok. És azt fogom tenni, hogy úgy kezelem, mint annak valószínűségét, hogy az előrejelzésem a pozitív osztályba tartozik.

Tehát 0.9999-nél magasabb értéket kapok. Azt mondom, 99% a valószínűsége, hogy ez a jelölt a mi pozitív, helyezett osztályunkba tartozik. Szóval szinte biztos vagyok benne, hogy a pozitív osztályba tartozik. Ellenkező esetben, ha 0.001-nél vagy bármi másnál csökken, akkor azt mondom, hogy ez a szám alacsony. Annak valószínűsége, hogy ez a megfigyelés a pozitív, az elhelyezett osztályba tartozik, majdnem nulla. És így azt fogom mondani, hogy a nulladik osztályhoz tartozik.

Tehát ennek van értelme az egyhez vagy a nullához közeli számok esetében. De felteheti magának a kérdést, hogy mit csináljak más értékekkel? A működési mód az, hogy egy levágási vonalat 0.5-re teszünk, tehát minden értéket, amelyet ez alá a vonal alá kapok, nullára teszem, tehát az előrejelzésem nem, és ha ez a vonal felett van, ha az ötös pont felett van , ezt a pozitív osztályba fogom tenni, a jóslatom egy.

p-fok

Tehát most van egy függvényem, amely nulla és egy közötti előrejelzést ad, és ezt valószínűségként kezelem. És ha ez a valószínűség 0.5 vagy 50% felett van, azt mondom, oké, pozitív osztály. És ha 50% alatt van, azt mondom, az negatív osztály, nulla. Tehát így működik a logisztikai regresszió. És most már megértettük, kódoljuk és illesszük. A 'max_iter' hiperparamétert 1000-re fogom beállítani. Ez a paraméter a megoldók általi konvergálandó iterációk maximális számát jelenti.

# Build model
model = LogisticRegression(max_iter=1000) # Fit model to training data
model.fit(X_train, y_train) LogisticRegression(max_iter=1000)

értékelje

Itt az ideje, hogy megnézzük, hogyan működik a modellünk. Itt az ideje, hogy értékeljük a logisztikai regressziós modellt. Emlékezzünk tehát arra, hogy ezúttal a teljesítménymutató a pontossági pontszám érdekel minket, és pontosat szeretnénk. És meg akarjuk győzni a 0.68-as alapvonalat. A modell pontossága az accuracy_score függvény segítségével számítható ki. A függvényhez két argumentumra van szükség, a valódi címkékre és az előre jelzett címkékre.

acc_train = accuracy_score(y_train, model.predict(X_train))
acc_test = model.score(X_test, y_test) print("Training Accuracy:", round(acc_train, 2))
print("Test Accuracy:", round(acc_test, 2)) Training Accuracy: 0.9
Test Accuracy: 0.88

90%-os edzési pontosságot láthatunk. Ez veri az alapvonalat. Tesztünk pontossága valamivel alacsonyabb volt, 88%. Ez is megverte az alapvonalat, és nagyon közel volt az edzési pontosságunkhoz. Szóval ez jó hír, mert ez azt jelenti, hogy a modellünk nem túlzottan illeszkedik, vagy ilyesmi.

A logisztikai regressziós modell eredményei

Ne feledje, hogy a logisztikus regresszióval a végső nulla vagy egy előrejelzést kapjuk. De az előrejelzés alatt van egy nulla vagy egy közötti lebegőpontos szám valószínűsége, és néha hasznos lehet megnézni, mik ezek a valószínűségi becslések. Nézzük meg edzési előrejelzéseinket, és nézzük az első ötöt. A „jósló” módszer megjósolja egy jelöletlen megfigyelés célpontját.

model.predict(X_train)[:5] array([0, 1, 1, 1, 1])

Tehát ezek voltak a végső jóslatok, de milyen valószínűségek állnak mögöttük? Ahhoz, hogy ezeket megkapjuk, egy kicsit más kódot kell csinálnunk. Ahelyett, hogy a `predict' módszert használnánk a modellünkhöz, a 'predict_proba'-t fogom használni a betanítási adatainkhoz.

y_train_pred_proba = model.predict_proba(X_train)
print(y_train_pred_proba[:5]) [[0.92003219 0.07996781] [0.03202019 0.96797981] [0.00678421 0.99321579] [0.03889446 0.96110554] [0.00245525 0.99754475]]

Egyfajta beágyazott listát láthatunk, amelyben két különböző oszlop található. A bal oldali oszlop mutatja annak valószínűségét, hogy egy jelöltet nem helyeznek el, vagy a negatív osztályunkat, a „Nem helyezték el”. A másik oszlop a "Elhelyezett" pozitív osztályt vagy a jelölt elhelyezésének valószínűségét jelenti. A második oszlopra összpontosítunk. Ha jól megnézzük az első valószínűségi becslést, akkor láthatjuk, hogy ez 0.07. Tehát mivel ez 50% alatt van, a modellünk szerint az én előrejelzésem nulla. És a következő jóslatoknál láthatjuk, hogy ezek mind 0.5 felett vannak, és ezért a modellünk végül egyet jósolt.

Most szeretnénk kivonni a jellemzők neveit és fontosságát, és sorozatba foglalni őket. És mivel a jellemzők fontosságát esélyhányadosként kell megjelenítenünk, csak egy kis matematikai átalakítást kell végrehajtanunk fontosságunk exponenciálisának figyelembevételével.

# Features names
features = ['gender', 'ssc_p', 'ssc_b', 'hsc_p', 'hsc_b', 'hsc_s', 'degree_p' ,'degree_t', 'workex', 'etest_p', 'specialisation', 'mba_p']
# Get importances
importances = model.coef_[0]
# Put importances into a Series
odds_ratios = pd.Series(np.exp(importances), index= features).sort_values()
# Review odds_ratios.head() mba_p 0.406590
degree_t 0.706021
specialisation 0.850301
hsc_b 0.876864
etest_p 0.877831
dtype: float64

Mielőtt megvitatnánk az esélyhányadosokat és azok mibenlétét, nézzük meg őket egy vízszintes oszlopdiagramon. Használjunk pandákat a cselekmény elkészítéséhez, és ne feledjük, hogy az öt legnagyobb együtthatót fogjuk keresni. És nem akarjuk az összes esélyarányt használni. Tehát a farkot akarjuk használni.

# Horizontal bar chart, five largest coefficients
odds_ratios.tail().plot(kind="barh")
plt.xlabel("Odds Ratio")
plt.ylabel("Feature")
plt.title("High Importance Features");
# Vízszintes oszlopdiagram, öt legnagyobb együttható odds_ratios.tail().plot(kind=

Most azt akarom, hogy képzelj el egy függőleges vonalat közvetlenül az 5-ösnél, és azzal szeretném kezdeni, hogy megnézed. Beszéljünk ezekről külön-külön, vagy csak az első párról. Kezdjük tehát itt az „ssc_p”-vel, amely a „Középfokú oktatás százalékos arányára – 10. évfolyam” utal. És láthatjuk, hogy az esélyhányados 30. Nos, ez mit jelent? Ez azt jelenti, hogy ha egy jelölt magas „ssc_p”-vel rendelkezik, az esélye annak, hogy helyezést érjen el, hatszor nagyobb, mint a többi jelölté, ha minden egyenlő. Tehát egy másik módja ennek az, hogy ha a jelölt `ssc_p-vel rendelkezik, a jelölt felvételének esélye hatszorosára nő.

Tehát minden öt feletti esélyhányados növeli a jelöltek helyezésének esélyét. És ezért van ez a függőleges vonal ötnél. És ez az ötféle jellemző olyan jellemző, amely leginkább a megnövekedett toborzáshoz kapcsolódik. Tehát ez az esélyhányadosunk. Most megvizsgáltuk azokat a funkciókat, amelyek leginkább kapcsolódnak a toborzás növekedéséhez. Nézzük a hozzá kapcsolódó jellemzőket, a toborzás csökkenését. Tehát most itt az ideje, hogy megnézzük a legkisebbeket. Tehát ahelyett, hogy a farkát néznénk, azt nézzük.

odds_ratios.head().plot(kind="barh")
plt.xlabel("Odds Ratio")
plt.xlabel("Odds Ratio")
plt.ylabel("Feature")
plt.title("Low Importance Features");
alacsony jelentőségű funkció

Az első dolog, amit látnunk kell, hogy az x tengelyen minden egy vagy az alatt van. Nos, ez mit jelent? Tehát nézzük meg a legkisebb esélyhányadosunkat. Ez az mba_p, amely az MBA százalékára utal. Körülbelül 0.45-re láthatjuk, hogy készen van. Nos, ez mit jelent? Nos, a 0.45 és az 1 közötti különbség 0.55. Rendben? És mit jelent ez a szám? Az MBA-val rendelkező jelentkezőket 55%-kal kisebb valószínűséggel veszik fel, ha minden más dolog egyenlő. Rendben? Így 0.55-szeresére vagy 55%-ra csökkentette a toborzás esélyét. És ez itt mindenre igaz.

Következtetés

Szóval mit tanultunk? Először az előkészített adatfázisban tudtuk meg, hogy osztályozással, pontosabban bináris osztályozással dolgozunk, logisztikai regresszió segítségével. Ami az adatok feltárását illeti, rengeteg dolgot csináltunk, de ami a legfontosabbakat illeti, az osztályegyensúlyt néztük, igaz? Pozitív és negatív osztályaink aránya. Ezután felosztjuk adatainkat.

Mivel a logisztikai regresszió egy osztályozási modell, megismertünk egy új teljesítménymutatót, a pontossági pontszámot. Most a pontossági pontszám 0 és 1 közé esik. A nulla rossz, az egy pedig jó. Amikor iteráltunk, megtanultuk a logisztikus regressziót. Ez egy varázslatos módszer, ahol felvehet egy lineáris egyenletet, egy egyenest, és beillesztheti egy másik függvénybe, egy szigmoid függvénybe és egy aktiváló függvénybe, és ebből valószínűségbecslést kaphat, és ezt a valószínűségi becslést előrejelzéssé alakíthatja.

Végül megismertük az esélyhányadost és az együtthatók értelmezésének módját, hogy megnézzük, egy adott tulajdonság növeli-e annak esélyét, hogy jelöltet toboroztunk vagy sem.

Projekt forráskódja: https://github.com/SawsanYusuf/Campus-Recruitment.git

A cikkben bemutatott média nem az Analytics Vidhya tulajdona, és a szerző saját belátása szerint használja. 

Időbélyeg:

Még több Analytics Vidhya