Rekrutmen Kampus: Masalah Klasifikasi dengan Regresi Logistik

Rekrutmen Kampus: Masalah Klasifikasi dengan Regresi Logistik

Node Sumber: 1996810

Pengantar

Dalam proyek ini, kami akan berfokus pada data dari India. Dan tujuan kami adalah untuk membuat model prediksi, seperti Regresi Logistik, dll. sehingga ketika kita memberikan karakteristik seorang kandidat, model tersebut dapat memprediksi apakah mereka akan merekrut.

Grafik kumpulan data berputar di sekitar musim penempatan Sekolah Bisnis di India. Dataset memiliki berbagai faktor tentang kandidat, seperti pengalaman kerja, persentase ujian, dll. Terakhir, berisi status rekrutmen dan detail remunerasi.

Masalah ilmu data dengan Regresi Logistik

Rekrutmen kampus adalah strategi untuk mencari, melibatkan, dan mempekerjakan talenta muda untuk magang dan posisi tingkat awal. Ini sering melibatkan bekerja dengan pusat layanan karir universitas dan menghadiri pameran karir untuk bertemu langsung dengan mahasiswa dan lulusan baru.

Artikel ini diterbitkan sebagai bagian dari Blogathon Ilmu Data.

Daftar Isi

  1. Langkah-langkah yang Terlibat dalam Memecahkan Masalah
  2. Siapkan Data
  3. Bangun Model Regresi Logistik
  4. Hasil Model Regresi Logistik
  5. Kesimpulan

Langkah-langkah yang Terlibat dalam Memecahkan Masalah

Pada artikel ini, kita akan mengimpor dataset tersebut, membersihkannya, lalu menyiapkannya untuk membuat model regresi logistik. Tujuan kami di sini adalah sebagai berikut:

Pertama, Kami akan menyiapkan kumpulan data kami untuk klasifikasi biner. Sekarang, apa yang saya maksud? ketika kami mencoba untuk memprediksi nilai kontinu, seperti harga sebuah apartemen, itu bisa berupa angka antara nol dan jutaan dolar. Kami menyebutnya masalah regresi.

Namun dalam proyek ini, segalanya sedikit berbeda. Alih-alih memprediksi nilai kontinu, kami memiliki grup atau kelas terpisah yang kami coba prediksi di antara mereka. Jadi ini disebut masalah Klasifikasi, dan karena dalam proyek kita, kita hanya akan memiliki dua grup yang ingin kita pilih, yang membuatnya menjadi klasifikasi biner.

Tujuan kedua adalah membuat model regresi logistik untuk memprediksi rekrutmen. Dan tujuan ketiga kami adalah menjelaskan prediksi model kami menggunakan rasio odds.

Sekarang dalam hal alur kerja pembelajaran mesin, langkah-langkah yang akan kita ikuti, dan beberapa hal baru, akan kita pelajari di sepanjang jalan. Jadi pada tahap impor, kami akan menyiapkan data kami untuk bekerja dengan target biner. Pada tahap eksplorasi, Kami akan melihat keseimbangan kelas. Jadi pada dasarnya, berapa proporsi kandidat yang diangkat, dan berapa proporsi yang tidak? dan pada fase pengkodean fitur, kami akan melakukan pengkodean ke fitur kategorikal kami. Pada bagian split, kita akan melakukan split tes kereta secara acak.

Untuk fase pembuatan model, pertama-tama, kita akan menetapkan garis dasar, dan karena kita akan menggunakan skor akurasi, kita akan berbicara lebih banyak tentang apa itu skor akurasi dan cara membuat garis dasar saat itulah metrik yang kami minati. Kedua, kami akan melakukan regresi logistik. Dan yang tak kalah pentingnya, kita akan memiliki fase evaluasi. Kami akan kembali fokus pada skor akurasi. Terakhir, untuk mengomunikasikan hasil, kita akan melihat rasio odds.

Terakhir, Sebelum terjun ke pekerjaan, mari perkenalkan diri kita ke perpustakaan yang akan kita gunakan untuk melempar proyek. Pertama, kami akan mengimpor data kami ke notebook Google Colabe ke perpustakaan io. Kemudian, karena kita akan menggunakan model regresi logistik, kita akan mengimpornya dari scikit-learn. Setelah itu, juga dari scikit-belajar, kami akan mengimpor metrik kinerja, skor akurasi, dan pemisahan tes-latihan.

Kami akan gunakan Matplotlib dan seaborn untuk visualisasi kami, dan JumlahPy  akan hanya untuk sedikit matematika.
Kita butuh panda untuk memanipulasi data kami, labelencoder untuk menyandikan variabel kategori kami, dan scaler standar untuk menormalkan data. Itu akan menjadi perpustakaan yang kita butuhkan.

Mari langsung mempersiapkan data.

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

Siapkan Data

impor

Untuk mulai menyiapkan data, mari kita selesaikan pekerjaan penting kita. Pertama, kita memuat file data kita, dan kemudian kita perlu memasukkannya ke dalam DataFrame `df.`

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()
Dataset untuk Regresi Logistik

Kami dapat melihat DataFrame kami yang indah, dan kami memiliki 215 record dan 15 kolom yang menyertakan atribut `status`, target kami. Ini adalah deskripsi untuk semua fitur.

Regresi logistik

Jelajahi

Sekarang kita memiliki semua fitur yang akan kita jelajahi. Jadi mari kita mulai analisis data eksplorasi. Pertama, mari kita lihat info untuk kerangka data ini dan lihat apakah ada di antara mereka yang mungkin perlu kita pertahankan atau mungkin perlu kita hilangkan.

# 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

Sekarang ketika kami melihat info `df`, ada beberapa hal yang kami cari, kami memiliki 215 baris dalam kerangka data kami, dan pertanyaan yang ingin kami tanyakan pada diri kami sendiri adalah, apakah ada data yang hilang? Dan kalau kita lihat di sini, sepertinya tidak ada data yang hilang kecuali kolom gaji, seperti yang diharapkan, karena kandidat yang belum dipekerjakan.

Kekhawatiran lain bagi kami di sini adalah, apakah ada fitur bocor yang akan memberikan informasi ke model kami yang tidak akan ada jika diterapkan di dunia nyata? Ingatlah bahwa kami ingin model kami memprediksi apakah kandidat akan ditempatkan atau tidak, dan kami ingin model kami membuat prediksi tersebut sebelum perekrutan terjadi. Jadi kami tidak ingin memberikan informasi apa pun tentang kandidat ini setelah perekrutan.

Jadi, cukup jelas bahwa fitur `salary` ini memberikan informasi tentang gaji yang ditawarkan oleh perusahaan. Dan karena gaji ini untuk yang diterima, fitur ini di sini merupakan kebocoran, dan kami harus membatalkannya.

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

Hal kedua yang ingin saya lihat adalah tipe data untuk berbagai fitur ini. Jadi, melihat tipe data ini, kami memiliki delapan fitur kategorikal dengan target kami dan tujuh fitur numerik, dan semuanya benar. Jadi, sekarang setelah kita memiliki ide-ide ini, mari luangkan waktu untuk menjelajahinya lebih dalam.

Kami tahu bahwa target kami memiliki dua kelas. Kami telah menempatkan kandidat dan tidak menempatkan kandidat. Pertanyaannya, berapa proporsi relatif dari kedua kelas tersebut? Apakah mereka tentang keseimbangan yang sama? Atau apakah yang satu lebih banyak dari yang lain? Itu adalah sesuatu yang perlu Anda perhatikan saat mengerjakan soal klasifikasi. Jadi ini adalah langkah penting dalam EDA kami.

# Plot class balance
df["status"].value_counts(normalize=True).plot( kind="bar", xlabel="Class", ylabel="Relative Frequency", title="Class Balance"
);
Ketidakseimbangan kelas untuk Regresi Logistik

Kelas positif kami 'ditempatkan' dihitung lebih dari 65% dari pengamatan kami, dan kelas negatif kami 'Tidak Ditempatkan' sekitar 30%. Sekarang, jika ini sangat tidak seimbang, seperti, jika lebih dari 80 atau bahkan lebih dari itu, saya akan mengatakan ini adalah kelas yang tidak seimbang. Dan kami harus melakukan beberapa pekerjaan untuk memastikan model kami akan berfungsi dengan cara yang benar. Tapi ini keseimbangan yang oke.

Mari buat visualisasi lain untuk melihat hubungan antara fitur kita dan target. Mari kita mulai dengan fitur numerik.

Pertama, kita akan melihat distribusi individual dari fitur menggunakan plot distribusi, dan kita juga akan melihat hubungan antara fitur numerik dan target kita dengan menggunakan plot kotak.

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]);
"Regresi logistik

Di kolom pertama dari plot kami, kami dapat melihat bahwa semua distribusi mengikuti distribusi normal, dan sebagian besar kinerja pendidikan kandidat berkisar antara 60-80%.

Di kolom kedua, kita memiliki petak kotak ganda dengan kelas 'Ditempatkan' di sebelah kanan dan kemudian kelas 'Tidak Ditempatkan' di sebelah kiri. Untuk fitur 'etest_p' dan 'mba_p', tidak banyak perbedaan pada kedua distro ini dari perspektif pembangunan model. Ada tumpang tindih yang signifikan dalam distribusi kelas, jadi fitur ini tidak akan menjadi prediktor yang baik untuk target kami. Adapun fitur lainnya, ada cukup berbeda untuk menjadikannya sebagai prediktor potensial yang baik dari target kami. Mari beralih ke fitur kategorikal. Dan untuk menjelajahinya, kita akan menggunakan plot hitungan.

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")
"Regresi logistik

Melihat plotnya, kami melihat bahwa kami memiliki lebih banyak kandidat pria daripada wanita. Dan sebagian besar kandidat kami tidak memiliki pengalaman kerja, tetapi kandidat ini lebih banyak dipekerjakan daripada yang memiliki. Kami memiliki kandidat yang melakukan perdagangan sebagai kursus 'hsc' mereka, dan juga seorang sarjana, kandidat dengan latar belakang sains adalah yang tertinggi kedua dalam kedua kasus tersebut.

Sedikit catatan tentang model regresi logistik, meskipun untuk klasifikasi, mereka berada dalam kelompok yang sama dengan model linier lainnya seperti regresi linier, dan karena alasan itu, karena keduanya adalah model linier. Kita juga perlu khawatir tentang masalah multikolinearitas. Jadi kita perlu membuat matriks korelasi, lalu kita perlu memplotnya dalam peta panas. Kami tidak ingin melihat semua fitur di sini, kami hanya ingin melihat fitur numerik, dan kami tidak ingin memasukkan target kami. Karena jika target kami berkorelasi dengan beberapa fitur kami, itu sangat bagus.

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');
matriks korelasi

Berikut adalah biru muda, yang berarti sedikit atau tidak ada korelasi, dan biru tua, yang memiliki korelasi lebih tinggi. Jadi kami ingin mencari warna biru tua itu. Kita bisa melihat garis biru tua, garis diagonal di tengah plot ini. Itu adalah fitur-fitur yang berkorelasi dengan diri mereka sendiri. Dan kemudian, kita melihat beberapa kotak gelap. Itu berarti kami memiliki banyak korelasi antar fitur.

Pada langkah terakhir EDA kami, kami perlu memeriksa kardinalitas tinggi-rendah dalam fitur kategorikal. Kardinalitas mengacu pada jumlah nilai unik dalam variabel kategorikal. Kardinalitas tinggi berarti bahwa fitur kategorikal memiliki sejumlah besar nilai unik. Tidak ada jumlah pasti dari nilai unik yang membuat sebuah fitur berkardinalitas tinggi. Tetapi jika nilai fitur kategori unik untuk hampir semua pengamatan, biasanya dapat dihilangkan.

# 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

Saya tidak melihat kolom mana pun yang jumlah nilai uniknya satu atau apa pun yang sangat tinggi. Tapi saya pikir ada satu kolom tipe kategorikal yang kita lewatkan di sini. Dan alasannya adalah itu tidak dikodekan sebagai objek tetapi sebagai bilangan bulat. Kolom 'sl_no' bukanlah bilangan bulat seperti yang kita ketahui. Kandidat ini diberi peringkat dalam beberapa urutan. Cuma name tag yang unik, dan namanya kayak kategori ya? Jadi ini adalah variabel kategori. Dan itu tidak memiliki informasi apa pun, jadi kami harus menghapusnya.

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

Fitur Pengkodean

Kami menyelesaikan analisis kami, dan hal berikutnya yang perlu kami lakukan adalah menyandikan fitur kategorikal kami, saya akan menggunakan 'LabelEncoder'. Label Encoding adalah teknik pengkodean yang populer untuk menangani variabel kategori. Dengan menggunakan teknik ini, setiap label diberi bilangan bulat unik berdasarkan urutan abjad.

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()
keluaran kode

Split

Kami mengimpor dan membersihkan data kami. Kami telah melakukan sedikit analisis data eksplorasi, dan sekarang kami perlu membagi data kami. Kami memiliki dua jenis pemisahan: pemisahan vertikal atau fitur-target dan pemisahan horizontal atau rangkaian uji coba. Mari kita mulai dengan yang vertikal. Kami akan membuat matriks fitur kami 'X' dan vektor target 'y'. Target kami adalah "status". Fitur kami harus berupa semua kolom yang tersisa di 'df.'

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

Model umumnya bekerja lebih baik ketika mereka memiliki data yang dinormalisasi untuk dilatih, jadi apa itu normalisasi? Normalisasi adalah mengubah nilai beberapa variabel menjadi rentang yang serupa. Target kami adalah menormalkan variabel kami. Jadi rentang nilainya adalah dari 0 hingga 1. Ayo lakukan itu, dan saya akan menggunakan `StandardScaler.`

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

Sekarang mari kita lakukan set horizontal split atau train-test. Kita perlu membagi data kita (X dan y) menjadi set pelatihan dan pengujian menggunakan pemisahan uji-kereta secara acak. set pengujian kami harus 20% dari total data kami. Dan kami tidak lupa menyetel random_state untuk reproduktifitas.

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

Bangun Model Regresi Logistik

Dasar

Jadi sekarang kita harus mulai membangun model kita, dan kita harus mulai memesan untuk menetapkan garis dasar kita. Ingatlah bahwa jenis masalah yang sedang kita hadapi adalah masalah klasifikasi, dan terdapat metrik yang berbeda untuk mengevaluasi model klasifikasi. Yang ingin saya fokuskan adalah skor akurasi.

Sekarang, berapa skor akurasinya? Skor akurasi dalam pembelajaran mesin adalah metrik evaluasi yang mengukur jumlah prediksi benar yang dibuat oleh suatu model terhadap jumlah total prediksi yang dibuat. Kami menghitungnya dengan membagi jumlah prediksi yang benar dengan jumlah total prediksi. Artinya, skor akurasi berkisar antara 0 dan 1. Nol tidak bagus. Di situlah Anda tidak ingin menjadi, dan satu sempurna. Jadi, mari kita ingat dan ingat bahwa baseline adalah model yang memberikan satu prediksi berulang kali, terlepas dari pengamatan apa, hanya satu tebakan untuk kita.

Dalam kasus kami, kami memiliki dua kelas, ditempatkan atau tidak. Jadi, jika kita hanya dapat membuat satu prediksi, tebakan apa yang akan kita buat? Jika Anda mengatakan kelas mayoritas. Saya pikir itu masuk akal, bukan? Jika kita hanya dapat memiliki satu prediksi, kita mungkin harus memilih prediksi dengan pengamatan tertinggi dalam kumpulan data kita. Jadi, baseline kami akan menggunakan persentase kelas mayoritas yang muncul dalam data pelatihan. Jika model tidak mengalahkan garis dasar ini, fitur tidak menambahkan informasi berharga untuk mengklasifikasikan pengamatan kami.

Kita dapat menggunakan metode 'value_counts' dengan argumen `normalize = True` untuk menghitung akurasi baseline:

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

Kita dapat melihat bahwa akurasi dasar kami adalah 68% atau 0.68 sebagai suatu proporsi. Jadi untuk menambah nilai guna, kami ingin berada di atas angka itu dan mendekati satu. Itulah tujuan kita, dan sekarang mari kita mulai membangun model kita.

Pengulangan

Sekarang saatnya membangun model kita menggunakan Logistic Regression. Kita akan menggunakan regresi logistik, tetapi sebelum melakukannya, mari kita bicara sedikit tentang apa itu regresi logistik dan cara kerjanya, lalu kita bisa melakukan pengkodean. Dan untuk itu, di sini kita punya kisi-kisi kecil.

Sepanjang sumbu x, katakanlah saya memiliki p_degrees kandidat dalam kumpulan data kami. Dan saat saya bergerak dari kanan ke kiri, derajatnya semakin tinggi, dan kemudian di sepanjang sumbu Y, saya memiliki kemungkinan kelas untuk penempatan: nol dan satu.

grafik untuk Regresi Logistik

Jadi jika kita memplot titik data kita, seperti apa bentuknya? Analisis kami menunjukkan bahwa kandidat `p_degree` tinggi lebih mungkin untuk dipekerjakan. Jadi, mungkin akan terlihat seperti ini, di mana kandidat dengan `p_degree` kecil akan turun menjadi nol. Dan kandidat dengan `p_degree` tinggi akan berada di peringkat satu.

p-gelar untuk Regresi Logistik

Sekarang katakanlah kita ingin melakukan regresi linier dengan ini. Katakanlah kita ingin membuat garis.
Sekarang, jika kita melakukan itu, yang akan terjadi adalah garis itu akan diplot sedemikian rupa sehingga akan berusaha sedekat mungkin dengan semua titik. Jadi kita mungkin akan berakhir dengan garis yang terlihat seperti ini. Apakah ini akan menjadi model yang baik?

pengulangan

Tidak terlalu. Apa yang akan terjadi adalah terlepas dari p_degree kandidat, kami akan selalu mendapatkan semacam nilai. Dan itu tidak akan membantu kita karena angkanya, dalam konteks ini, tidak berarti apa-apa. Masalah klasifikasi ini harus nol atau satu. Jadi, itu tidak akan bekerja seperti itu.

Di sisi lain, karena ini adalah garis, bagaimana jika kita memiliki kandidat dengan gelar_p_sangat rendah? Nah, tiba-tiba, perkiraan kami adalah angka negatif. Dan lagi, ini tidak masuk akal. Tidak ada angka negatif baik harus nol atau satu. Dan dengan cara yang sama, jika kita memiliki kandidat dengan gelar yang sangat tinggi, saya mungkin memiliki sesuatu yang positif, di atas satu. Dan lagi, itu tidak masuk akal. Kita harus memiliki nol atau satu.

ramalan

Jadi yang kita lihat di sini adalah beberapa batasan serius dalam menggunakan regresi linier untuk klasifikasi. Jadi apa yang perlu kita lakukan? Kita perlu membuat model yang nomor satu: tidak di bawah nol atau di atas satu, sehingga harus terikat antara nol dan satu. Dan nomor dua, apa pun yang dihasilkan dari fungsi itu, persamaan yang kita buat itu, kita mungkin tidak boleh memperlakukannya sebagai prediksi itu sendiri tetapi sebagai langkah untuk membuat prediksi akhir kita.

Sekarang, izinkan saya membongkar apa yang baru saja saya katakan, dan mari kita ingatkan diri kita sendiri bahwa ketika kita melakukan model regresi linier kita, kita berakhir dengan persamaan linier ini, yang merupakan bentuk paling sederhana. Dan inilah persamaan atau fungsi yang memberi kita garis lurus itu.

img

Ada cara untuk mengikat garis itu antara 0 dan 1. Dan yang bisa kita lakukan adalah mengambil fungsi yang baru saja kita buat ini dan memasukkannya ke dalam fungsi lain, yang disebut fungsi sigmoid.

fungsi untuk Regresi Logistik

Jadi, saya akan mengambil persamaan linier yang baru saja kita miliki, dan saya akan mengecilkannya ke dalam fungsi sigmoid dan meletakkannya sebagai eksponensial.

fungsi untuk Regresi Logistik

Apa yang terjadi adalah alih-alih mendapatkan garis lurus, kita mendapatkan garis yang terlihat seperti ini. Itu macet di satu. Itu masuk dan berlekuk-lekuk. Kemudian macet di nol.

regresi logistik

Benar, seperti itulah garisnya, dan kita dapat melihat bahwa kita telah memecahkan masalah pertama kita. Apa pun yang kita dapatkan dari fungsi ini akan berada di antara 0 dan 1. Pada langkah kedua, kita tidak akan memperlakukan apa pun yang keluar dari persamaan ini sebagai prediksi akhir. Sebaliknya, kami akan memperlakukannya sebagai probabilitas.

regresi logistik

Apa yang saya maksud? Itu berarti ketika saya membuat prediksi, saya akan mendapatkan beberapa nilai floating point antara 0 dan 1. Dan yang akan saya lakukan adalah memperlakukannya sebagai probabilitas bahwa prediksi saya termasuk dalam kelas positif.

Jadi saya mendapatkan nilai di 0.9999. Saya akan mengatakan kemungkinan bahwa kandidat ini termasuk dalam kelas positif dan ditempatkan kami adalah 99%. Jadi saya hampir yakin itu milik kelas positif. Sebaliknya, jika turun di titik 0.001 atau berapa pun, saya akan mengatakan angka ini rendah. Probabilitas bahwa pengamatan khusus ini milik positif, kelas yang ditempatkan hampir nol. Jadi, saya akan mengatakan itu milik kelas nol.

Jadi masuk akal untuk angka yang mendekati satu atau mendekati nol. Tapi Anda mungkin bertanya pada diri sendiri, apa yang saya lakukan dengan nilai-nilai lain di antaranya? Cara kerjanya adalah kita menempatkan garis potong tepat di 0.5, jadi berapapun nilai yang saya dapatkan di bawah garis itu, saya akan meletakkannya di nol, jadi prediksi saya tidak, dan jika di atas garis itu, jika di atas titik lima , ini saya taruh di kelas positif, prediksi saya satu.

derajat-p

Jadi, sekarang saya memiliki fungsi yang memberi saya prediksi antara nol dan satu, dan saya memperlakukannya sebagai probabilitas. Dan jika probabilitas itu di atas 0.5 atau 50%, saya katakan, oke, positif kelas satu. Dan kalau di bawah 50%, saya katakan, itu kelas negatif, nol. Jadi begitulah cara kerja regresi logistik. Dan sekarang kita mengerti itu, mari kita kodekan dan paskan. Saya akan menyetel hyperparameter 'max_iter' ke 1000. Parameter ini mengacu pada jumlah maksimum iterasi untuk konvergensi pemecah.

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

Mengevaluasi

Sekarang saatnya untuk melihat bagaimana model kita bekerja. Saatnya mengevaluasi model Regresi Logistik. Jadi, ingatlah bahwa saat ini, metrik kinerja yang kami minati adalah skor akurasi, dan kami menginginkan yang akurat. Dan kami ingin mengalahkan baseline 0.68. Akurasi model dapat dihitung dengan menggunakan fungsi akurasi_skor. Fungsi membutuhkan dua argumen, label yang sebenarnya dan label yang diprediksi.

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

Kami dapat melihat akurasi pelatihan kami di 90%. Ini mengalahkan garis dasar. Akurasi pengujian kami sedikit lebih rendah pada 88%. Itu juga mengalahkan baseline dan sangat dekat dengan akurasi pelatihan kami. Jadi itu kabar baik karena itu berarti model kita tidak overfitting atau apapun.

Hasil Model Regresi Logistik

Ingatlah bahwa dengan regresi logistik, kita berakhir dengan prediksi akhir nol atau satu ini. Namun di balik prediksi itu, ada kemungkinan angka floating point antara nol atau satu, dan terkadang akan sangat membantu untuk melihat perkiraan probabilitas tersebut. Mari kita lihat prediksi latihan kita, dan mari kita lihat lima yang pertama. Metode 'memprediksi' memprediksi target pengamatan yang tidak berlabel.

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

Jadi itu adalah prediksi terakhir, tapi apa probabilitas di baliknya? Untuk mendapatkannya, kita perlu melakukan kode yang sedikit berbeda. Alih-alih menggunakan metode `predict` dengan model kami, saya akan menggunakan 'predict_proba' dengan data pelatihan kami.

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

Kita bisa melihat semacam nested list dengan dua kolom berbeda di dalamnya. Kolom di sebelah kiri mewakili probabilitas bahwa seorang kandidat tidak ditempatkan atau kelas negatif kita 'Tidak Ditempatkan'. Kolom lainnya mewakili kelas positif `Ditempatkan` atau probabilitas kandidat ditempatkan. Kami akan fokus pada kolom kedua. Jika kita melihat perkiraan probabilitas pertama dengan benar, kita dapat melihat bahwa ini adalah 0.07. Jadi karena itu di bawah 50%, menurut model kami, prediksi saya adalah nol. Dan untuk prediksi berikut, kita dapat melihat bahwa semuanya di atas 0.5, dan itulah mengapa model kita memprediksi satu pada akhirnya.

Sekarang kami ingin mengekstrak nama fitur dan pentingnya dan menempatkannya dalam satu seri. Dan karena kita perlu menampilkan kepentingan fitur sebagai rasio odds, kita perlu melakukan sedikit transformasi matematis dengan mengambil eksponensial kepentingan kita.

# 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

Sebelum membahas rasio peluang dan apa itu, mari kita buat grafik batang horizontal. Mari gunakan panda untuk membuat plot, dan ingat bahwa kita akan mencari lima koefisien terbesar. Dan kami tidak ingin menggunakan semua rasio peluang. Jadi kami ingin menggunakan ekornya.

# Horizontal bar chart, five largest coefficients
odds_ratios.tail().plot(kind="barh")
plt.xlabel("Odds Ratio")
plt.ylabel("Feature")
plt.title("High Importance Features");
# Bagan batang horizontal, lima koefisien terbesar odds_ratios.tail().plot(kind=

Sekarang saya ingin Anda membayangkan garis vertikal tepat di angka 5, dan saya ingin memulai dengan melihatnya. Mari kita bicarakan masing-masing secara individu atau hanya pasangan pertama. Jadi, mari kita mulai di sini dengan 'ssc_p', yang mengacu pada 'persentase Pendidikan Menengah โ€“ Kelas 10'. Dan kita dapat melihat bahwa odds ratio adalah 30. Sekarang, apa artinya? Artinya, jika seorang kandidat memiliki 'ssc_p' yang tinggi, peluang penempatan mereka enam kali lebih besar daripada kandidat lainnya, semuanya dianggap sama. Jadi cara lain untuk memikirkannya adalah ketika kandidat memiliki `ssc_p,` peluang rekrutmen kandidat meningkat enam kali lipat.

Jadi setiap rasio odds lebih dari lima meningkatkan peluang kandidat ditempatkan. Dan itulah mengapa kita memiliki garis vertikal di angka lima. Dan kelima macam fitur ini merupakan karakteristik yang paling terkait dengan peningkatan rekrutmen. Jadi, itulah rasio peluang kami. Sekarang, kita telah melihat fitur yang paling terkait dengan peningkatan perekrutan. Mari kita lihat fitur-fitur yang terkait dengannya, penurunan perekrutan. Jadi sekarang saatnya untuk melihat yang terkecil. Jadi daripada melihat ekornya, kita akan melihatnya.

odds_ratios.head().plot(kind="barh")
plt.xlabel("Odds Ratio")
plt.xlabel("Odds Ratio")
plt.ylabel("Feature")
plt.title("Low Importance Features");
fitur penting rendah

Hal pertama yang perlu kita lihat di sini adalah pemberitahuan pada sumbu x semuanya satu atau lebih rendah. Sekarang, apa artinya itu? Jadi mari kita lihat rasio peluang terkecil kita di sini. Ini mba_p yang mengacu pada persentase MBA. Kita dapat melihat bahwa itu siap sekitar 0.45. Sekarang, apa artinya itu? Nah, selisih antara 0.45 dan 1 adalah 0.55. Baiklah? Dan apa arti angka itu? Kandidat dengan MBA cenderung tidak direkrut sebesar 55%, Semua hal lain dianggap sama. Baiklah? Jadi itu menurunkan peluang rekrutmen dengan faktor 0.55 atau 55%. Dan itu benar untuk semuanya di sini.

Kesimpulan

Jadi apa yang kita pelajari? Pertama, pada fase data yang disiapkan, kami mempelajari bahwa kami bekerja dengan klasifikasi, khususnya klasifikasi biner, menggunakan Regresi Logistik. Dalam hal mengeksplorasi data, kami melakukan banyak hal, tetapi dalam hal sorotan, kami melihat keseimbangan kelas, bukan? Proporsi kelas positif dan negatif kita. Kemudian kami membagi data kami.

Karena Regresi Logistik adalah model klasifikasi, kami belajar tentang metrik kinerja baru, skor akurasi. Sekarang, skor akurasi berkisar antara 0 dan 1. Nol berarti buruk, dan satu baik. Saat kami mengulang, kami belajar tentang regresi logistik. Itu adalah cara ajaib, di mana Anda dapat mengambil persamaan linier, garis lurus, dan memasukkannya ke dalam fungsi lain, fungsi sigmoid, dan fungsi aktivasi, dan mendapatkan estimasi probabilitas darinya dan mengubah estimasi probabilitas tersebut menjadi prediksi.

Terakhir, kami belajar tentang odds ratio dan cara kami menginterpretasikan koefisien untuk melihat apakah fitur yang diberikan akan meningkatkan peluang bahwa kami telah merekrut seorang kandidat atau tidak.

Kode sumber proyek: https://github.com/SawsanYusuf/Campus-Recruitment.git

Media yang ditampilkan dalam artikel ini bukan milik Analytics Vidhya dan digunakan atas kebijaksanaan Penulis. 

Stempel Waktu:

Lebih dari Analisis Vidhya