Kampüs İşe Alımı: Lojistik Regresyon ile Bir Sınıflandırma Problemi

Kampüs İşe Alımı: Lojistik Regresyon ile Bir Sınıflandırma Problemi

Kaynak Düğüm: 1996810

Giriş

Bu projede, Hindistan'dan gelen verilere odaklanacağız. Ve amacımız, bir tahmin modeli, Lojistik Regresyon vb. gibi bir adayın özelliklerini verdiğimizde, model işe alıp almayacağını tahmin edebilir.

The veri kümesi Hindistan'daki bir İşletme Okulu'nun yerleştirme sezonu etrafında dönüyor. Veri setinde adaylar üzerinde iş deneyimi, sınav yüzdesi gibi çeşitli faktörler bulunur. Son olarak işe alım durumu ve ücretlendirme detaylarını içerir.

Lojistik Regresyon ile veri bilimi problemi

Kampüste işe alma, stajyerlik ve giriş seviyesi pozisyonları için genç yeteneklerin bulunması, katılımının sağlanması ve işe alınmasına yönelik bir stratejidir. Genellikle üniversite kariyer hizmetleri merkezleriyle çalışmayı ve üniversite öğrencileri ve yeni mezunlarla yüz yüze görüşmek için kariyer fuarlarına katılmayı içerir.

Bu makale, Veri Bilimi Blogatonu.

İçindekiler

  1. Problemi Çözme Adımları
  2. Verileri Hazırlayın
  3. Bir Lojistik Regresyon Modeli Oluşturun
  4. Lojistik Regresyon Modelinin Sonuçları
  5. Sonuç

Problemi Çözme Adımları

Bu yazıda, bu veri setini içe aktaracağız, temizleyeceğiz ve ardından bir lojistik regresyon modeli oluşturmak için hazırlayacağız. Buradaki hedeflerimiz şunlardır:

Öncelikle veri setimizi hazırlayacağız. ikili sınıflandırma. Şimdi, ne demek istiyorum? Bir dairenin fiyatı gibi sürekli bir değeri tahmin etmeye çalıştığımızda, sıfır ile birkaç milyon dolar arasında herhangi bir sayı olabilir. Biz buna regresyon problemi diyoruz.

Ancak bu projede işler biraz farklı. Sürekli bir değer tahmin etmek yerine, aralarında tahmin etmeye çalıştığımız ayrı gruplara veya sınıflara sahibiz. Buna Sınıflandırma problemi deniyor ve projemizde aralarından seçim yapmaya çalıştığımız sadece iki grubumuz olacağından, bu onu ikili bir sınıflandırma yapıyor.

İkinci amaç, işe alımı tahmin etmek için bir lojistik regresyon modeli oluşturmaktır. Üçüncü hedefimiz de, olasılık oranını kullanarak modelimizin tahminlerini açıklamak.

Şimdi, makine öğrenimi iş akışı açısından, izleyeceğimiz adımlar ve yol boyunca öğreneceğimiz bazı yeni şeyler. Yani içe aktarma aşamasında, verilerimizi ikili bir hedefle çalışacak şekilde hazırlayacağız. Keşif aşamasında, sınıf dengesine bakacağız. Yani temel olarak, adayların ne kadarı işe alındı ​​ve hangileri değildi? özellikler kodlama aşamasında ise kategorik özelliklerimize kodlama yapacağız. Bölünmüş kısımda, rastgele bir tren testi bölümü yapacağız.

Model oluşturma aşaması için öncelikle taban çizgimizi belirleyeceğiz ve doğruluk puanlarını kullanacağımız için doğruluk puanının ne olduğu ve ilgilendiğimiz metrik bu olduğunda nasıl temel oluşturacağımız hakkında daha fazla konuşacağız. İkinci olarak, lojistik regresyon yapacağız. Ve son olarak, değerlendirme aşamasına geçeceğiz. Yine doğruluk puanına odaklanacağız. Son olarak, sonuçları iletmek için olasılık oranına bakacağız.

Son olarak işe dalmadan önce throw projesinde kullanacağımız kütüphaneleri tanıtalım. İlk olarak, Google Colabe not defterindeki verilerimizi io kitaplığına aktaracağız. Ardından, bir lojistik regresyon modeli kullanacağımız için bunu scikit-learn'den içe aktaracağız. Bundan sonra da gelen scikit-öğrenme, performans ölçümlerimizi, doğruluk puanını ve tren-test-bölümünü içe aktaracağız.

Kullanacağız matplotlib ve görselleştirmemiz için seaborn ve Dizi  sadece biraz matematik için olacak.
İhtiyacımız var pandalar verilerimizi işlemek için, etiket kodlayıcı kategorik değişkenlerimizi kodlamak için ve standart ölçekleyici verileri normalleştirmek için. İhtiyacımız olan kütüphaneler bunlar olacak.

Verileri hazırlamaya geçelim.

#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)

Verileri Hazırlayın

ithalat

Verileri hazırlamaya başlamak için önemli işimize geçelim. Önce veri dosyamızı yüklüyoruz ve ardından bunları bir DataFrame `df.` içine koymamız gerekiyor.

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()
Lojistik Regresyon için Veri Kümesi

Güzel DataFrame'imizi görebiliriz ve 215 kaydımız ve hedefimiz olan 'status' özniteliğini içeren 15 sütunumuz var. Bu, tüm özelliklerin açıklamasıdır.

Lojistik regresyon

Keşfet

Şimdi keşfedeceğimiz tüm bu özelliklere sahibiz. Öyleyse başlayalım keşifsel veri analizi. Öncelikle, bu veri çerçevesinin bilgisine bir göz atalım ve bunlardan herhangi birini tutmamız gerekip gerekmediğini veya bırakmamız gerekip gerekmediğini görelim.

# 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

Şimdi `df` bilgisine baktığımızda aradığımız birkaç şey var, veri çerçevemizde 215 satır var ve kendimize sormak istediğimiz soru şu, eksik veri var mı? Ve buraya bakarsak, beklendiği gibi işe alınmayan adaylar nedeniyle maaş sütunu dışında eksik verimiz yok gibi görünüyor.

Burada bizim için başka bir endişe, modelimize gerçek dünyada konuşlandırılsaydı sahip olmayacağı bilgileri verecek herhangi bir sızdıran özellik var mı? Modelimizin bir adayın yerleştirilip yerleştirilmeyeceğini tahmin etmesini istediğimizi ve modelimizin bu tahminleri işe alım gerçekleşmeden önce yapmasını istediğimizi unutmayın. Dolayısıyla bu adaylar hakkında işe alımdan sonra herhangi bir bilgi vermek istemiyoruz.

Dolayısıyla, bu `maaş' özelliğinin kurumun sunduğu maaş hakkında bilgi verdiği oldukça açıktır. Ve bu maaş kabul edilenler için olduğu için buradaki bu özellik kaçak teşkil ediyor ve onu düşürmek zorunda kalıyoruz.

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

Bakmak istediğim ikinci şey, bu farklı özellikler için veri türleri. Yani, bu veri türlerine baktığımızda, hedefimizle sekiz kategorik özelliğimiz ve yedi sayısal özelliğimiz var ve her şey doğru. Artık bu fikirlere sahip olduğumuza göre, onları daha derinlemesine keşfetmek için biraz zaman ayıralım.

Hedefimizin iki sınıfı olduğunu biliyoruz. Adayları yerleştirdik, adayları yerleştirmedik. Soru şu ki, bu iki sınıfın göreli oranı nedir? Aynı dengedeler mi? Yoksa biri diğerinden çok mu fazla? Bu, sınıflandırma problemleri yaparken bir göz atmanız gereken bir şeydir. Yani bu, EDA'mızda önemli bir adım.

# Plot class balance
df["status"].value_counts(normalize=True).plot( kind="bar", xlabel="Class", ylabel="Relative Frequency", title="Class Balance"
);
Lojistik Regresyon için sınıf dengesizliği

Pozitif "yerleştirildi" sınıfımız, gözlemlerimizin %65'inden fazlasını oluşturur ve "Yerleştirilmemiş" negatif sınıfımız yaklaşık %30'dur. Şimdi, eğer bunlar süper dengesiz olsaydı, mesela, 80'den fazla olsaydı, hatta daha fazla olsaydı, bunların dengesiz sınıflar olduğunu söylerdim. Ve modelimizin doğru şekilde çalışacağından emin olmak için biraz çalışmamız gerekecek. Ama bu iyi bir denge.

Özelliklerimiz ile hedef arasındaki bağlantıyı fark etmek için bir görselleştirme daha yapalım. Sayısal özelliklerle başlayalım.

İlk olarak, bir dağılım grafiği kullanarak özelliklerin bireysel dağılımını göreceğiz ve ayrıca bir kutu grafiği kullanarak sayısal özellikler ile hedefimiz arasındaki ilişkiyi göreceğiz.

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]);
"Lojistik regresyon

Çizimimizin ilk sütununda, tüm dağılımların normal bir dağılım izlediğini ve adayın eğitim performanslarının çoğunun %60-80 arasında olduğunu görebiliriz.

İkinci sütunda, sağda 'Placed' sınıfı ve ardından solda 'Yerleştirilmemiş' sınıfı olan çift kutu grafiğimiz var. 'etest_p' ve 'mba_p' özellikleri için, bu iki dağıtım arasında model oluşturma açısından pek bir fark yoktur. Sınıflar üzerindeki dağılımda önemli bir örtüşme vardır, bu nedenle bu özellikler hedefimiz için iyi bir tahmin edici olmayacaktır. Geri kalan özelliklere gelince, onları hedefimizin potansiyel iyi tahmincileri olarak kabul edecek kadar belirgindir. Kategorik özelliklere geçelim. Ve onları keşfetmek için bir sayım grafiği kullanacağız.

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")
"Lojistik regresyon

Konuya baktığımızda kadın adaylarımızdan daha fazla erkek adayımız olduğunu görüyoruz. Adaylarımızın çoğunun iş tecrübesi yok ama bu adaylar sahip olanlardan daha fazla işe alındı. Ticaret 'hsc' dersi olarak yapmış adaylarımız var ve bir lisans öğrencisinin yanı sıra, bilim geçmişine sahip adaylar her iki durumda da en yüksek ikinci sırada.

Lojistik regresyon modelleri hakkında küçük bir not, sınıflandırma amaçlı olmalarına rağmen, lineer regresyon gibi diğer lineer modellerle aynı gruptadırlar ve bu nedenle, her ikisi de lineer model oldukları için. Çoklu bağlantı sorunu hakkında da endişelenmemiz gerekiyor. Yani bir korelasyon matrisi yaratmamız gerekiyor ve sonra onu bir ısı haritasında çizmemiz gerekiyor. Burada tüm özelliklere bakmak istemiyoruz, sadece sayısal özelliklere bakmak istiyoruz ve hedefimizi dahil etmek istemiyoruz. Çünkü eğer hedefimiz bazı özelliklerimizle örtüşüyorsa, bu çok iyi.

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');
korelasyon matrisi

İşte çok az veya hiç korelasyon anlamına gelen açık mavi ve daha yüksek bir korelasyona sahip olduğumuz koyu mavi. Bu yüzden o lacivert için uyanık olmak istiyoruz. Bu çizimin ortasından aşağı doğru inen koyu mavi bir çizgi, çapraz bir çizgi görebiliriz. Bunlar kendileriyle ilişkili özelliklerdir. Ve sonra bazı karanlık kareler görüyoruz. Bu, özellikler arasında bir dizi korelasyonumuz olduğu anlamına gelir.

EDA'mızın son adımında, kategorik özelliklerde yüksek-düşük kardinaliteyi kontrol etmemiz gerekiyor. Önemlilik, kategorik bir değişkendeki benzersiz değerlerin sayısını ifade eder. Yüksek kardinalite, kategorik özelliklerin çok sayıda benzersiz değere sahip olduğu anlamına gelir. Bir özelliği yüksek kardinalite yapan kesin benzersiz değer sayısı yoktur. Ancak, kategorik özelliğin değeri neredeyse tüm gözlemler için benzersizse, genellikle atılabilir.

# 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

Benzersiz değerlerin sayısının bir veya çok yüksek olduğu herhangi bir sütun görmüyorum. Ama bence burada kaçırdığımız bir kategorik tür sütunu var. Bunun nedeni de bir nesne olarak değil tamsayı olarak kodlanmış olmasıdır. 'sl_no' sütunu bildiğimiz anlamda bir tamsayı değildir. Bu adaylar bazı sırayla sıralanır. Sadece benzersiz bir isim etiketi ve isim bir kategori gibi, değil mi? Yani bu kategorik bir değişkendir. Ve herhangi bir bilgisi yok, bu yüzden onu bırakmamız gerekiyor.

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

Özellikler Kodlama

Analizimizi bitirdik ve bir sonraki yapmamız gereken kategorik özelliklerimizi kodlamak, 'LabelEncoder' kullanacağım. Etiket Kodlama, kategorik değişkenleri işlemek için popüler bir kodlama tekniğidir. Bu tekniği kullanarak, her etikete alfabetik sıralamaya göre benzersiz bir tamsayı atanır.

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()
kod çıktısı

Bölünmüş

Verilerimizi içe aktardık ve temizledik. Biraz keşifsel veri analizi yaptık ve şimdi verilerimizi bölmemiz gerekiyor. İki tür bölmemiz var: dikey bölme veya özellik-hedef ve yatay bölme veya tren-test kümeleri. Dikey olanla başlayalım. 'X' özellik matrisimizi ve 'y' hedef vektörümüzü oluşturacağız. Hedefimiz “statü”. Özelliklerimiz 'df'de kalan tüm sütunlar olmalıdır.

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

Modeller genellikle eğitmek için verileri normalleştirdiklerinde daha iyi performans gösterir, peki normalleştirme nedir? normalleştirme birkaç değişkenin değerlerini benzer bir aralığa dönüştürmektir. Hedefimiz değişkenlerimizi normalize etmektir. Yani değer aralıkları 0'dan 1'e kadar olacak. Bunu yapalım ve `StandardScaler'ı kullanacağım.

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

Şimdi yatay bölme veya tren testi setlerini yapalım. Verilerimizi (X ve y) rastgele bir tren-test ayrımı kullanarak eğitim ve test setlerine ayırmamız gerekiyor. test setimiz toplam verimizin %20'si olmalıdır. Tekrar üretilebilirlik için bir random_state ayarlamayı da unutmuyoruz.

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,)

Bir Lojistik Regresyon Modeli Oluşturun

Temel

Şimdi modelimizi oluşturmaya başlamamız gerekiyor ve temelimizi belirlemek için sipariş vermeye başlamamız gerekecek. Ele aldığımız problem türünün bir sınıflandırma problemi olduğunu ve sınıflandırma modellerini değerlendirmek için farklı ölçümler olduğunu unutmayın. Odaklanmak istediğim doğruluk puanı.

Şimdi, doğruluk puanı nedir? Makine öğrenimindeki doğruluk puanı, bir model tarafından yapılan doğru tahminlerin sayısını yapılan toplam tahmin sayısına göre ölçen bir değerlendirme metriğidir. Doğru tahmin sayısını toplam tahmin sayısına bölerek hesaplıyoruz. Yani bu, doğruluk puanının 0 ile 1 arasında olduğu anlamına gelir. Sıfır iyi değildir. Olmak istemediğin yer orası ve biri mükemmel. O halde bunu aklımızda tutalım ve referans noktasının, gözlem ne olursa olsun, bizim için yalnızca bir tahminde bulunan, tekrar tekrar bir tahmin veren bir model olduğunu hatırlayalım.

Bizim durumumuzda, yerleştirilmiş veya yerleştirilmemiş iki sınıfımız var. Yani sadece bir tahminde bulunabilseydik, tek tahminimiz ne olurdu? Çoğunluk sınıfı dediysen. Bence bu mantıklı, değil mi? Yalnızca bir tahminimiz varsa, muhtemelen veri kümemizde en yüksek gözlemlere sahip olanı seçmeliyiz. Bu nedenle, referans noktamız, çoğunluk sınıfının eğitim verilerinde gösterdiği yüzdeyi kullanacaktır. Model bu temeli geçmiyorsa, özellikler gözlemlerimizi sınıflandırmak için değerli bilgiler eklemiyor.

Temel doğruluğu hesaplamak için "değer_sayımları" yöntemini "normalize = True" bağımsız değişkeniyle kullanabiliriz:

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

Temel doğruluğumuzun oransal olarak %68 veya 0.68 olduğunu görebiliriz. Dolayısıyla, işe yarayacak değer katmak için, bu sayının üzerine çıkmak ve bire yaklaşmak istiyoruz. Hedefimiz bu ve şimdi modelimizi oluşturmaya başlayalım.

yinele

Şimdi Lojistik Regresyon kullanarak modelimizi oluşturma zamanı. Lojistik regresyonu kullanacağız ama ondan önce biraz lojistik regresyonun ne olduğundan ve nasıl çalıştığından bahsedelim ve sonra kodlama işlerini yapabiliriz. Ve bunun için burada küçük bir ızgaramız var.

x ekseni boyunca, veri kümemizde p_degrees adayları olduğunu varsayalım. Ve sağdan sola hareket ettikçe, dereceler yükseliyor ve yükseliyor ve sonra Y ekseni boyunca yerleştirme için olası sınıflara sahibim: sıfır ve bir.

Lojistik Regresyon için grafik

Öyleyse, veri noktalarımızı çizecek olsaydık, neye benzerdi? Analizimiz, yüksek bir "p_degree" adayının işe alınma olasılığının daha yüksek olduğunu gösteriyor. Yani, muhtemelen küçük bir "p_degree" değerine sahip adayın sıfırda olacağı buna benzer bir şey olacaktır. Ve "p_degree"si yüksek olan aday birden yukarıda olur.

Lojistik Regresyon için p derecesi

Şimdi bununla lineer regresyon yapmak istediğimizi varsayalım. Diyelim ki bir çizgi çizmek istedik.
Şimdi, bunu yaparsak, o çizgi öyle çizilir ki, mümkün olduğu kadar tüm noktalara yakın olmaya çalışılır. Ve muhtemelen buna benzer bir çizgi elde ederiz. Bu iyi bir model olur mu?

yinelemek

Tam olarak değil. Ne olurdu, adayın p_degree'si ne olursa olsun, her zaman bir çeşit değer alırdık. Ve bu bize yardımcı olmayacak çünkü bu bağlamda rakamlar hiçbir şey ifade etmiyor. Bu sınıflandırma probleminin sıfır veya bir olması gerekir. Yani, bu şekilde çalışmayacak.

Öte yandan, bu bir çizgi olduğu için, p_degree'si çok düşük olan bir adayımız olursa ne olur? Birdenbire, tahminimiz negatif bir sayı. Ve yine, bu hiç mantıklı değil. Negatif bir sayı yoktur ya sıfır ya da bir olması gerekir. Ve aynı şekilde p_degree'si çok yüksek olan bir adayımız olursa benim de pozitif, birden fazla bir şey olabilir. Ve yine, bu hiç mantıklı değil. Ya sıfıra ya da bire ihtiyacımız var.

tahmin

Burada gördüğümüz şey, sınıflandırma için doğrusal regresyon kullanmanın bazı ciddi sınırlamalarıdır. Peki ne yapmamız gerekiyor? Bir numaranın sıfırın altına veya birin üstüne çıkmadığı, bu nedenle sıfır ile bir arasında sınırlanması gereken bir model oluşturmamız gerekiyor. Ve iki numara, bu fonksiyondan, yarattığımız denklemden ne çıkarsa çıksın, belki de onu kendi başına bir tahmin olarak değil, son tahminimizi yapmaya yönelik bir adım olarak ele almalıyız.

Şimdi az önce söylediklerimi açmama izin verin ve kendimize lineer regresyon modellerimizi yaparken, en basit form olan bu lineer denklemi elde ettiğimizi hatırlayalım. Ve bu bize o düz çizgiyi veren denklem ya da fonksiyon.

img

Bu çizgiyi 0 ile 1 arasında bağlamanın bir yolu var. Ve yapabileceğimiz şey, az önce oluşturduğumuz bu fonksiyonu alıp başka bir fonksiyon içine almak, buna sigmoid fonksiyon denir.

Lojistik Regresyon işlevi

Şimdi elimizdeki lineer denklemi alıp sigmoid fonksiyonunda küçülteceğim ve üstel olarak koyacağım.

Lojistik Regresyon işlevi

Olan şu ki, düz bir çizgi elde etmek yerine, buna benzer bir çizgi elde ediyoruz. Birde takıldı. İçeri giriyor ve aşağı doğru kıvrılıyor. Sonra sıfırda takılıp kalıyor.

lojistik regresyon

Doğru, çizgi böyle görünüyor ve ilk problemimizi çözdüğümüzü görebiliriz. Bu fonksiyondan ne çıkarsak 0 ile 1 arasında olacaktır. İkinci adımda, bu denklemden çıkanı nihai tahmin olarak ele almayacağız. Bunun yerine, bunu bir olasılık olarak ele alacağız.

lojistik regresyon

Ne demek istiyorum? Bu, bir tahmin yaptığımda, 0 ile 1 arasında bir kayan noktalı değer elde edeceğim anlamına gelir. Ve bunu tahminimin pozitif sınıfa ait olma olasılığı olarak ele alacağım.

Böylece 0.9999'a kadar bir değer alıyorum. Bu adayın pozitif, yerleştirilmiş sınıfımıza ait olma olasılığının %99 olduğunu söyleyeceğim. Bu yüzden pozitif sınıfa ait olduğundan neredeyse eminim. Tersine, 0.001 noktasına düşerse veya her neyse, bu sayının düşük olduğunu söyleyeceğim. Bu özel gözlemin pozitif, yerleştirilmiş sınıfa ait olma olasılığı neredeyse sıfırdır. Ve böylece, bunun sıfır sınıfına ait olduğunu söyleyeceğim.

Bu, bire yakın veya sıfıra yakın sayılar için anlamlıdır. Ancak kendinize, aradaki diğer değerlerle ne yapacağımı sorabilirsiniz. İşleyiş şekli, 0.5'e bir kesme çizgisi koymaktır, yani bu çizginin altına aldığım herhangi bir değer, onu sıfıra koyacağım, bu yüzden tahminim hayır ve eğer bu çizginin üzerindeyse, eğer beş noktasının üzerindeyse , Bunu olumlu sınıfa koyacağım, tahminim birdir.

p derecesi

Şimdi bana sıfır ile bir arasında bir tahmin veren bir fonksiyona sahibim ve bunu bir olasılık olarak ele alıyorum. Ve bu olasılık %0.5 veya %50'nin üzerindeyse, tamam, pozitif birinci sınıf derim. Ve eğer %50'nin altındaysa, bu negatif sınıf, sıfır diyorum. Lojistik regresyonun çalışma şekli budur. Ve şimdi bunu anladık, hadi kodlayalım ve sığdıralım. 'max_iter' hiperparametresini 1000 olarak ayarlayacağım. Bu parametre, çözücülerin yakınsaması için maksimum yineleme sayısını ifade eder.

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

Değerlendirmek

Şimdi modelimizin nasıl çalıştığını görme zamanı. Lojistik Regresyon modelini değerlendirme zamanı. Bu sefer, ilgilendiğimiz performans metriğinin doğruluk puanı olduğunu ve doğru bir tane istediğimizi hatırlayalım. Ve 0.68'lik taban çizgisini geçmek istiyoruz. Model doğruluğu, correct_score işlevi kullanılarak hesaplanabilir. İşlev, gerçek etiketler ve tahmin edilen etiketler olmak üzere iki bağımsız değişken gerektirir.

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

Eğitim doğruluğumuzu %90 olarak görebiliriz. Temel çizgiyi atıyor. Test doğruluğumuz %88 ile biraz daha düşüktü. Aynı zamanda taban çizgisini de geçti ve eğitim doğruluğumuza çok yakındı. Bu iyi bir haber, çünkü bu, modelimizin fazla uydurma falan olmadığı anlamına geliyor.

Lojistik Regresyon Modelinin Sonuçları

Lojistik regresyonla, sıfır veya birin bu son tahminlerine ulaştığımızı unutmayın. Ancak bu tahminin altında, sıfır veya bir arasında bir kayan noktalı sayı olasılığı vardır ve bazen bu olasılık tahminlerinin ne olduğunu görmek yardımcı olabilir. Antrenman tahminlerimize bakalım ve ilk beşe bakalım. 'Tahmin' yöntemi, etiketlenmemiş bir gözlemin hedefini tahmin eder.

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

Yani bunlar son tahminlerdi, ama bunların ardındaki olasılıklar neler? Bunları elde etmek için biraz farklı bir kod yapmamız gerekiyor. Modelimizle `predict' yöntemini kullanmak yerine, eğitim verilerimizle 'predict_proba'yı kullanacağım.

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]]

İçinde iki farklı sütun bulunan bir tür iç içe liste görebiliriz. Soldaki sütun, bir adayın yerleştirilmemesi veya negatif sınıfımızın 'Yerleştirilmemiş' olma olasılığını temsil eder. Diğer sütun "Yerleştirildi" pozitif sınıfını veya bir adayın yerleştirilme olasılığını temsil eder. İkinci sütuna odaklanacağız. İlk olasılık tahminine doğru bakarsak bunun 0.07 olduğunu görebiliriz. Bu %50'nin altında olduğu için modelimiz tahminimin sıfır olduğunu söylüyor. Ve sonraki tahminler için, bunların hepsinin 0.5'in üzerinde olduğunu görebiliriz ve bu nedenle modelimiz sonunda bir tahminde bulundu.

Şimdi özellik adlarını ve önemlerini çıkarıp bir dizi haline getirmek istiyoruz. Ve özellik önemini olasılık oranları olarak göstermemiz gerektiğinden, önemimizin üstelini alarak küçük bir matematiksel dönüşüm yapmamız gerekiyor.

# 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

Olasılık oranlarını ve ne olduklarını tartışmadan önce, hadi bunları yatay bir çubuk grafikte görelim. Olay örgüsünü oluşturmak için pandaları kullanalım ve en büyük beş katsayıya bakacağımızı hatırlayalım. Ve tüm olasılık oranlarını kullanmak istemiyoruz. Bu yüzden kuyruğu kullanmak istiyoruz.

# Horizontal bar chart, five largest coefficients
odds_ratios.tail().plot(kind="barh")
plt.xlabel("Odds Ratio")
plt.ylabel("Feature")
plt.title("High Importance Features");
# Yatay çubuk grafik, en büyük beş katsayı odds_ratios.tail().plot(kind=

Şimdi 5'te dikey bir çizgi hayal etmenizi istiyorum ve ona bakarak başlamak istiyorum. Bunların her biri hakkında ayrı ayrı veya sadece ilk çift hakkında konuşalım. O halde burada 'Ortaöğretim yüzdesi – 10. Sınıf' anlamına gelen 'ssc_p' ile başlayalım. Ve olasılık oranının 30 olduğunu görebiliriz. Şimdi, bu ne anlama geliyor? Bu, bir adayın yüksek bir 'ssc_p' değerine sahip olması durumunda, her şeyin eşit olması koşuluyla, yerleştirilme olasılıklarının diğer adaylardan altı kat daha fazla olduğu anlamına gelir. Bunu düşünmenin başka bir yolu da, adayın `ssc_p` olması, adayın işe alınma şansının altı kat artmasıdır.

Dolayısıyla, beşin üzerindeki herhangi bir oran oranı, adayların yerleştirilme ihtimalini artırır. İşte bu yüzden beşte dikey bir çizgimiz var. Ve bu beş tür özellik, artan istihdamla en çok ilişkilendirilen özelliklerdir. Yani, olasılık oranımız bu kadar. Şimdi, işe alımdaki artışla en çok ilişkilendirilen özelliklere baktık. Bununla ilişkili özelliklere, işe alımdaki azalmaya bakalım. Şimdi en küçüğüne bakma zamanı. Yani kuyruğa bakmak yerine ona bakacağız.

odds_ratios.head().plot(kind="barh")
plt.xlabel("Odds Ratio")
plt.xlabel("Odds Ratio")
plt.ylabel("Feature")
plt.title("Low Importance Features");
düşük önem özelliği

Burada görmemiz gereken ilk şey, x eksenindeki her şeyin bir veya altında olduğuna dikkat edin. Şimdi bu ne anlama geliyor? Öyleyse, buradaki en küçük olasılık oranımıza bir göz atalım. MBA yüzdesini ifade eden mba_p'dir. 0.45 civarında hazır olduğunu görebiliriz. Şimdi bu ne anlama geliyor? 0.45 ile 1 arasındaki fark 0.55'tir. Elbette? Ve bu sayı ne anlama geliyor? MBA'li Adayların işe alınma olasılığı %55 daha azdır, diğer her şey eşittir. Elbette? Böylece işe alım olasılığını 0.55 veya %55 oranında azalttı. Ve bu buradaki her şey için geçerli.

Sonuç

yani? Ne Öğrendik? İlk olarak, hazırlanan veri aşamasında, Lojistik Regresyon kullanarak sınıflandırma, özellikle ikili sınıflandırma ile çalıştığımızı öğrendik. Verileri keşfetme açısından bir sürü şey yaptık, ancak vurgulamalar açısından sınıf dengesine baktık, değil mi? Olumlu ve olumsuz sınıflarımızın oranı. Daha sonra verilerimizi bölüyoruz.

Lojistik Regresyon bir sınıflandırma modeli olduğundan, yeni bir performans ölçütü olan doğruluk puanını öğrendik. Artık doğruluk puanı 0 ile 1 arasında değişiyor. Sıfır kötü, bir iyi. Yineleme yaparken, lojistik regresyonu öğrendik. Bu, doğrusal bir denklemi, bir düz çizgiyi alıp başka bir fonksiyonun, bir sigmoid fonksiyonun ve bir aktivasyon fonksiyonunun içine koyabileceğiniz ve bundan bir olasılık tahmini elde edebileceğiniz ve bu olasılık tahminini tahmine dönüştürebileceğiniz sihirli bir yoldur.

Son olarak, olasılık oranını ve belirli bir özelliğin bir adayı işe alıp almama olasılığımızı artırıp artırmayacağını görmek için katsayıları nasıl yorumlayabileceğimizi öğrendik.

Proje kaynak kodu: https://github.com/SawsanYusuf/Campus-Recruitment.git

Bu makalede gösterilen medya Analytics Vidhya'ya ait değildir ve Yazarın takdirine bağlı olarak kullanılır. 

Zaman Damgası:

Den fazla Analitik Vidhya