ক্যাম্পাস নিয়োগ: লজিস্টিক রিগ্রেশনের সাথে একটি শ্রেণিবিন্যাস সমস্যা

ক্যাম্পাস নিয়োগ: লজিস্টিক রিগ্রেশনের সাথে একটি শ্রেণিবিন্যাস সমস্যা

উত্স নোড: 1996810

ভূমিকা

এই প্রকল্পে, আমরা ভারতের তথ্যের উপর ফোকাস করব। এবং আমাদের লক্ষ্য একটি তৈরি করা হয় ভবিষ্যদ্বাণীমূলক মডেল, যেমন লজিস্টিক রিগ্রেশন, ইত্যাদি যাতে আমরা যখন একজন প্রার্থীর বৈশিষ্ট্যগুলি দিই, তখন মডেলটি ভবিষ্যদ্বাণী করতে পারে যে তারা নিয়োগ করবে কিনা।

সার্জারির  ডেটা সেটটি ভারতের একটি বিজনেস স্কুলের প্লেসমেন্ট সিজনের চারপাশে আবর্তিত হয়। ডেটাসেটে প্রার্থীদের উপর বিভিন্ন বিষয় রয়েছে, যেমন কাজের অভিজ্ঞতা, পরীক্ষার শতাংশ ইত্যাদি। অবশেষে, এতে নিয়োগের অবস্থা এবং পারিশ্রমিকের বিবরণ রয়েছে।

লজিস্টিক রিগ্রেশনের সাথে ডেটা বিজ্ঞানের সমস্যা

ক্যাম্পাস নিয়োগ হল ইন্টার্নশিপ এবং এন্ট্রি-লেভেল পজিশনের জন্য তরুণ মেধাবীদের সোর্সিং, আকর্ষক এবং নিয়োগের কৌশল। এটি প্রায়শই বিশ্ববিদ্যালয়ের কর্মজীবন পরিষেবা কেন্দ্রগুলির সাথে কাজ করে এবং কলেজের ছাত্র এবং সাম্প্রতিক স্নাতকদের সাথে ব্যক্তিগতভাবে দেখা করার জন্য ক্যারিয়ার মেলায় যোগদান করে।

এই নিবন্ধটি একটি অংশ হিসাবে প্রকাশিত হয়েছিল ডেটা সায়েন্স ব্লগাথন।

সুচিপত্র

  1. সমস্যা সমাধানে জড়িত পদক্ষেপ
  2. ডেটা প্রস্তুত করুন
  3. একটি লজিস্টিক রিগ্রেশন মডেল তৈরি করুন
  4. লজিস্টিক রিগ্রেশন মডেলের ফলাফল
  5. উপসংহার

সমস্যা সমাধানে জড়িত পদক্ষেপ

এই নিবন্ধে, আমরা সেই ডেটাসেটটি আমদানি করব, এটি পরিষ্কার করব এবং তারপর একটি লজিস্টিক রিগ্রেশন মডেল তৈরি করতে প্রস্তুত করব। এখানে আমাদের লক্ষ্য নিম্নরূপ:

প্রথমত, আমরা আমাদের ডেটা সেট প্রস্তুত করতে যাচ্ছি বাইনারি শ্রেণীবিভাগ. এখন, আমি কি বলতে চাই? যখন আমরা একটি অ্যাপার্টমেন্টের দামের মতো একটি অবিচ্ছিন্ন মূল্য ভবিষ্যদ্বাণী করার চেষ্টা করি, তখন এটি শূন্য থেকে অনেক মিলিয়ন ডলারের মধ্যে যেকোনো সংখ্যা হতে পারে। আমরা একে রিগ্রেশন সমস্যা বলি।

কিন্তু এই প্রকল্পে, জিনিসগুলি একটু ভিন্ন। একটি অবিচ্ছিন্ন মান ভবিষ্যদ্বাণী করার পরিবর্তে, আমাদের বিচ্ছিন্ন গোষ্ঠী বা শ্রেণি রয়েছে যা আমরা তাদের মধ্যে ভবিষ্যদ্বাণী করার চেষ্টা করছি। তাই এটিকে একটি শ্রেণিবিন্যাস সমস্যা বলা হয়, এবং কারণ আমাদের প্রকল্পে, আমাদের কেবল দুটি গ্রুপ থাকবে যেগুলির মধ্যে আমরা বেছে নেওয়ার চেষ্টা করছি, যা এটিকে একটি বাইনারি শ্রেণিবিন্যাস করে তোলে।

দ্বিতীয় লক্ষ্য হল নিয়োগের পূর্বাভাস দেওয়ার জন্য একটি লজিস্টিক রিগ্রেশন মডেল তৈরি করা। এবং আমাদের তৃতীয় লক্ষ্য হল প্রতিকূল অনুপাত ব্যবহার করে আমাদের মডেলের ভবিষ্যদ্বাণী ব্যাখ্যা করা।

এখন মেশিন লার্নিং কর্মপ্রবাহের পরিপ্রেক্ষিতে, আমরা যে পদক্ষেপগুলি অনুসরণ করব এবং কিছু নতুন জিনিস, আমরা পথ ধরে শিখব। তাই আমদানি পর্যায়ে, আমরা একটি বাইনারি টার্গেটের সাথে কাজ করার জন্য আমাদের ডেটা প্রস্তুত করব। অন্বেষণ পর্বে, আমরা শ্রেণী ভারসাম্য দেখব। তাই মূলত, প্রার্থীদের কোন অনুপাত হির্ড ছিল, এবং কোন অনুপাত ছিল না? এবং বৈশিষ্ট্য এনকোডিং পর্যায়ে, আমরা আমাদের স্বতন্ত্র বৈশিষ্ট্যগুলিতে এনকোডিং করব। বিভক্ত অংশে, আমরা একটি এলোমেলো ট্রেন পরীক্ষা বিভক্ত করব।

মডেল-বিল্ডিং পর্বের জন্য, প্রথমত, আমরা আমাদের বেসলাইন সেট করব, এবং যেহেতু আমরা নির্ভুলতা স্কোর ব্যবহার করব, আমরা একটি নির্ভুলতা স্কোর কী এবং কীভাবে একটি বেসলাইন তৈরি করা যায় সে সম্পর্কে আরও কথা বলব যখন আমরা সেই মেট্রিকটিতে আগ্রহী। দ্বিতীয়ত, আমরা লজিস্টিক রিগ্রেশন করব। এবং তারপর শেষ কিন্তু অন্তত না, আমরা মূল্যায়ন পর্ব হবে. আমরা আবার সঠিকতা স্কোরের উপর ফোকাস করব। অবশেষে, ফলাফলের সাথে যোগাযোগ করতে, আমরা প্রতিকূল অনুপাত দেখব।

পরিশেষে, কাজের মধ্যে ডুব দেওয়ার আগে, আসুন আমরা থ্রো দ্য প্রজেক্ট ব্যবহার করব এমন লাইব্রেরির সাথে পরিচয় করিয়ে দেই। প্রথমে, আমরা io লাইব্রেরিতে Google Colabe notebook-এ আমাদের ডেটা আমদানি করব। তারপর, আমরা একটি লজিস্টিক রিগ্রেশন মডেল ব্যবহার করব, আমরা scikit-learn থেকে এটি আমদানি করব। এর পর থেকেও scikit-শিখতে, আমরা আমাদের কর্মক্ষমতা মেট্রিক্স, নির্ভুলতা স্কোর এবং ট্রেন-পরীক্ষা-বিভক্ত আমদানি করব।

আমরা ব্যবহার করবো ম্যাটপ্ল্লোব এবং আমাদের ভিজ্যুয়ালাইজেশন জন্য seaborn, এবং নম্র  শুধুমাত্র সামান্য গণিত জন্য হবে.
আমাদের দরকার পান্ডাস আমাদের ডেটা ম্যানিপুলেট করার জন্য, আমাদের ক্যাটাগরিকাল ভেরিয়েবলগুলিকে এনকোড করতে লেবেলেনকোডার এবং ডেটা স্বাভাবিক করার জন্য স্ট্যান্ডার্ড স্কেলার। যে আমাদের প্রয়োজন যে লাইব্রেরি হবে.

এর তথ্য প্রস্তুত করা যাক.

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

ডেটা প্রস্তুত করুন

আমদানি

আমাদের ডেটা প্রস্তুত করা শুরু করতে, আসুন আমাদের গুরুত্বপূর্ণ কাজটি করি। প্রথমে, আমরা আমাদের ডেটা ফাইল লোড করি এবং তারপরে আমাদের একটি ডেটাফ্রেম `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()
লজিস্টিক রিগ্রেশনের জন্য ডেটাসেট

আমরা আমাদের সুন্দর ডেটাফ্রেম দেখতে পাচ্ছি, এবং আমাদের কাছে 215টি রেকর্ড এবং 15টি কলাম রয়েছে যা আমাদের লক্ষ্য 'স্থিতি' বৈশিষ্ট্য অন্তর্ভুক্ত করে। এই সমস্ত বৈশিষ্ট্য জন্য বর্ণনা.

পণ্য সরবরাহ সংশ্লেষণ

Explore

এখন আমাদের কাছে এই সমস্ত বৈশিষ্ট্য রয়েছে যা আমরা অন্বেষণ করতে যাচ্ছি। তাই আমাদের শুরু করা যাক অনুসন্ধানমূলক তথ্য বিশ্লেষণ. প্রথমে, আসুন এই ডেটাফ্রেমের তথ্যটি একবার দেখে নেওয়া যাক এবং দেখুন যে তাদের মধ্যে কোনটি আমাদের রাখতে হবে বা আমাদের বাদ দিতে হবে কিনা।

# 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

এখন যখন আমরা `df` তথ্য দেখি, সেখানে কয়েকটি জিনিস আছে যা আমরা খুঁজছি, আমাদের ডেটাফ্রেমে 215টি সারি আছে, এবং আমরা নিজেদেরকে যে প্রশ্নটি জিজ্ঞাসা করতে চাই তা হল, কোনো ডেটা হারিয়ে গেছে কি? এবং যদি আমরা এখানে তাকাই, মনে হয় আমাদের কাছে বেতন কলাম ব্যতীত অনুপস্থিত ডেটা নেই, আশানুরূপ, প্রার্থীদের নিয়োগ দেওয়া হয়নি।

এখানে আমাদের জন্য আরেকটি উদ্বেগের বিষয় হল, এমন কোন ফাঁস বৈশিষ্ট্য আছে যা আমাদের মডেলকে এমন তথ্য দেবে যা বাস্তব জগতে স্থাপন করা হলে এটি থাকবে না? মনে রাখবেন যে আমরা আমাদের মডেল ভবিষ্যদ্বাণী করতে চাই যে একজন প্রার্থী স্থান দেবে কি না, এবং আমরা চাই যে নিয়োগ হওয়ার আগে আমাদের মডেল সেই ভবিষ্যদ্বাণীগুলি তৈরি করুক। তাই আমরা নিয়োগের পর এই প্রার্থীদের সম্পর্কে কোনো তথ্য দিতে চাই না।

সুতরাং, এটা বেশ পরিষ্কার যে এই `বেতন` বৈশিষ্ট্যটি কর্পোরেট দ্বারা প্রদত্ত বেতন সম্পর্কে তথ্য দেয়। এবং যেহেতু এই বেতন গৃহীত তাদের জন্য, এই বৈশিষ্ট্যটি এখানে ফুটো গঠন করে, এবং আমাদের এটি বাদ দিতে হবে।

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

দ্বিতীয় জিনিসটি আমি দেখতে চাই এই বিভিন্ন বৈশিষ্ট্যগুলির জন্য ডেটা প্রকারগুলি। সুতরাং, এই ডেটা টাইপের দিকে তাকালে, আমাদের লক্ষ্য এবং সাতটি সংখ্যাসূচক বৈশিষ্ট্য সহ আমাদের আটটি শ্রেণীবদ্ধ বৈশিষ্ট্য রয়েছে এবং সবকিছুই সঠিক। সুতরাং, এখন যেহেতু আমাদের কাছে এই ধারণাগুলি রয়েছে আসুন সেগুলিকে আরও গভীরভাবে অন্বেষণ করতে কিছু সময় নেওয়া যাক।

আমরা জানি যে আমাদের লক্ষ্য দুটি শ্রেণী আছে. আমরা প্রার্থী দিয়েছি, প্রার্থী রাখিনি। প্রশ্ন হল, ওই দুই শ্রেণীর আপেক্ষিক অনুপাত কত? তারা কি একই ভারসাম্য সম্পর্কে? নাকি একটি অন্যটির চেয়ে অনেক বেশি? এটি এমন কিছু যা আপনি যখন শ্রেণীবিভাগের সমস্যাগুলি করছেন তখন আপনাকে একবার দেখে নেওয়া দরকার। সুতরাং এটি আমাদের EDA-তে একটি উল্লেখযোগ্য পদক্ষেপ।

# Plot class balance
df["status"].value_counts(normalize=True).plot( kind="bar", xlabel="Class", ylabel="Relative Frequency", title="Class Balance"
);
লজিস্টিক রিগ্রেশনের জন্য ক্লাস ভারসাম্যহীনতা

আমাদের ইতিবাচক শ্রেণী 'স্থাপিত' আমাদের পর্যবেক্ষণের 65% এরও বেশি জন্য গণনা করে এবং আমাদের নেতিবাচক শ্রেণী 'স্থাপিত হয়নি' প্রায় 30%। এখন, যদি এইগুলি সুপার ভারসাম্যহীন হয়, যেমন, যদি এটি 80 এর মতো বা তার চেয়েও বেশি হয়, আমি বলব এইগুলি ভারসাম্যহীন শ্রেণী। এবং আমাদের মডেলটি সঠিকভাবে কাজ করছে তা নিশ্চিত করার জন্য আমাদের কিছু কাজ করতে হবে। কিন্তু এটি একটি ঠিক ভারসাম্য.

আমাদের বৈশিষ্ট্য এবং লক্ষ্যের মধ্যে সংযোগ লক্ষ্য করার জন্য আরেকটি দৃশ্যায়ন করা যাক। সংখ্যাসূচক বৈশিষ্ট্য দিয়ে শুরু করা যাক।

প্রথমত, আমরা একটি ডিস্ট্রিবিউশন প্লট ব্যবহার করে বৈশিষ্ট্যগুলির পৃথক বন্টন দেখতে পাব, এবং আমরা একটি বক্স প্লট ব্যবহার করে সংখ্যাসূচক বৈশিষ্ট্য এবং আমাদের লক্ষ্যের মধ্যে সম্পর্কও দেখতে পাব।

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]);
"পণ্য সরবরাহ সংশ্লেষণ

আমাদের প্লট থেকে প্রথম কলামে, আমরা দেখতে পাচ্ছি যে সমস্ত বিতরণ একটি স্বাভাবিক বন্টন অনুসরণ করে এবং বেশিরভাগ প্রার্থীর শিক্ষাগত পারফরম্যান্স 60-80% এর মধ্যে।

দ্বিতীয় কলামে, আমাদের ডানদিকে 'স্থাপিত' শ্রেণী সহ একটি ডাবল বক্স প্লট রয়েছে এবং তারপরে বাম দিকে 'স্থাপিত নয়' শ্রেণী রয়েছে। 'etest_p' এবং 'mba_p' বৈশিষ্ট্যগুলির জন্য, মডেল-বিল্ডিং দৃষ্টিকোণ থেকে এই দুটি বিতরণে খুব বেশি পার্থক্য নেই। ক্লাসে বিতরণে একটি উল্লেখযোগ্য ওভারল্যাপ রয়েছে, তাই এই বৈশিষ্ট্যগুলি আমাদের লক্ষ্যের একটি ভাল ভবিষ্যদ্বাণী করবে না। বাকি বৈশিষ্ট্যগুলির জন্য, আমাদের লক্ষ্যের সম্ভাব্য ভাল ভবিষ্যদ্বাণী হিসাবে তাদের গ্রহণ করার জন্য যথেষ্ট স্বতন্ত্র রয়েছে। আসুন শ্রেণীবদ্ধ বৈশিষ্ট্যগুলিতে এগিয়ে যাই। এবং তাদের অন্বেষণ করতে, আমরা একটি গণনা প্লট ব্যবহার করব।

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")
"পণ্য সরবরাহ সংশ্লেষণ

প্লটের দিকে তাকালে আমরা দেখতে পাচ্ছি যে নারীদের তুলনায় আমাদের পুরুষ প্রার্থী বেশি। এবং আমাদের বেশিরভাগ প্রার্থীর কোন কাজের অভিজ্ঞতা নেই, কিন্তু এই প্রার্থীরা তাদের চেয়ে বেশি নিয়োগ পেয়েছেন। আমাদের কাছে এমন প্রার্থী আছে যারা তাদের 'এইচএসসি' কোর্স হিসেবে বাণিজ্য করেছেন, এবং সেইসাথে একজন আন্ডারগ্র্যাড, বিজ্ঞানের পটভূমি সহ প্রার্থীরা উভয় ক্ষেত্রেই দ্বিতীয় সর্বোচ্চ।

লজিস্টিক রিগ্রেশন মডেলগুলির উপর একটি ছোট নোট, যদিও সেগুলি শ্রেণীবিভাগের জন্য, তারা রৈখিক রিগ্রেশনের মতো অন্যান্য লিনিয়ার মডেলগুলির মতো একই গ্রুপে রয়েছে এবং সেই কারণে, যেহেতু তারা উভয়ই রৈখিক মডেল। আমাদের মাল্টিকোলিনিয়ারিটির বিষয়েও চিন্তা করতে হবে। তাই আমাদের একটি পারস্পরিক সম্পর্ক ম্যাট্রিক্স তৈরি করতে হবে, এবং তারপরে আমাদের এটি একটি হিটম্যাপে প্লট করতে হবে। আমরা এখানে সমস্ত বৈশিষ্ট্য দেখতে চাই না, আমরা কেবল সংখ্যাগত বৈশিষ্ট্যগুলি দেখতে চাই এবং আমরা আমাদের লক্ষ্য অন্তর্ভুক্ত করতে চাই না। যেহেতু আমাদের লক্ষ্য যদি আমাদের কিছু বৈশিষ্ট্যের সাথে সম্পর্কযুক্ত হয়, তবে এটি খুব ভাল।

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');
পারস্পরিক সম্পর্ক ম্যাট্রিক্স

এখানে হালকা নীল, যার অর্থ সামান্য থেকে কোন সম্পর্ক নেই, এবং গাঢ় নীল, যার সাথে আমাদের উচ্চতর সম্পর্ক রয়েছে। তাই আমরা সেই গাঢ় নীলের সন্ধানে থাকতে চাই। আমরা একটি গাঢ় নীল রেখা দেখতে পাচ্ছি, একটি তির্যক রেখা এই প্লটের মাঝখানে যাচ্ছে। তারা নিজেদের সাথে সম্পর্কযুক্ত যে বৈশিষ্ট্য. এবং তারপর, আমরা কিছু অন্ধকার বর্গক্ষেত্র দেখতে. তার মানে আমাদের বৈশিষ্ট্যগুলির মধ্যে একগুচ্ছ পারস্পরিক সম্পর্ক রয়েছে।

আমাদের EDA-এর চূড়ান্ত ধাপে, আমাদের শ্রেণীবদ্ধ বৈশিষ্ট্যগুলিতে উচ্চ-নিম্ন কার্ডিনালিটি পরীক্ষা করতে হবে। কার্ডিনালিটি একটি শ্রেণীগত ভেরিয়েবলের অনন্য মানের সংখ্যাকে বোঝায়। উচ্চ কার্ডিনালিটির অর্থ হল শ্রেণীবদ্ধ বৈশিষ্ট্যগুলির বিপুল সংখ্যক অনন্য মান রয়েছে। অনন্য মানগুলির কোনও সঠিক সংখ্যা নেই যা একটি বৈশিষ্ট্যকে উচ্চ-কার্ডিনালিটি করে তোলে। কিন্তু যদি শ্রেণীবদ্ধ বৈশিষ্ট্যের মান প্রায় সব পর্যবেক্ষণের জন্য অনন্য হয়, তবে এটি সাধারণত বাদ দেওয়া যেতে পারে।

# 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

আমি এমন কোনো কলাম দেখতে পাচ্ছি না যেখানে অনন্য মানগুলির সংখ্যা এক বা উচ্চতর কিছু। কিন্তু আমি মনে করি একটি শ্রেণীবদ্ধ টাইপ কলাম আমরা এখানে অনুপস্থিত করছি. এবং কারণ এটি একটি বস্তু হিসাবে এনকোড করা হয় না কিন্তু একটি পূর্ণসংখ্যা হিসাবে. 'sl_no' কলামটি আমরা যে অর্থে জানি সেই অর্থে একটি পূর্ণসংখ্যা নয়। এই প্রার্থীদের কিছু ক্রমে স্থান দেওয়া হয়. শুধু একটি অনন্য নাম ট্যাগ, এবং নাম একটি বিভাগের মত, তাই না? তাই এটি একটি শ্রেণীগত পরিবর্তনশীল. এবং এটিতে কোন তথ্য নেই, তাই আমাদের এটি বাদ দেওয়া দরকার।

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

বৈশিষ্ট্য এনকোডিং

আমরা আমাদের বিশ্লেষণ শেষ করেছি, এবং পরবর্তী জিনিসটি আমাদের করতে হবে আমাদের শ্রেণীবদ্ধ বৈশিষ্ট্যগুলিকে এনকোড করা, আমি 'লেবেলএনকোডার' ব্যবহার করব। লেবেল এনকোডিং হল শ্রেণীগত ভেরিয়েবল পরিচালনার জন্য একটি জনপ্রিয় এনকোডিং কৌশল। এই কৌশলটি ব্যবহার করে, প্রতিটি লেবেলকে বর্ণানুক্রমিক ক্রম অনুসারে একটি অনন্য পূর্ণসংখ্যা বরাদ্দ করা হয়।

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()
কোড আউটপুট

বিভক্ত করা

আমরা আমাদের ডেটা আমদানি এবং পরিষ্কার করেছি। আমরা কিছু অনুসন্ধানমূলক ডেটা বিশ্লেষণ করেছি, এবং এখন আমাদের ডেটা বিভক্ত করতে হবে। আমাদের দুই ধরনের বিভাজন রয়েছে: উল্লম্ব বিভাজন বা বৈশিষ্ট্য-লক্ষ্য এবং অনুভূমিক বিভক্ত বা ট্রেন-পরীক্ষা সেট। আসুন উল্লম্ব দিয়ে শুরু করা যাক। আমরা আমাদের বৈশিষ্ট্য ম্যাট্রিক্স 'X' এবং লক্ষ্য ভেক্টর 'y' তৈরি করব। আমাদের লক্ষ্য "স্থিতি"। আমাদের বৈশিষ্ট্যগুলি 'df'-এ থাকা সমস্ত কলাম হওয়া উচিত।

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

মডেলগুলি সাধারণত ভাল পারফর্ম করে যখন তাদের প্রশিক্ষণের জন্য ডেটা স্বাভাবিক করা হয়, তাহলে স্বাভাবিককরণ কী? সাধারণীকরণ বেশ কয়েকটি ভেরিয়েবলের মানকে একই পরিসরে রূপান্তরিত করছে। আমাদের লক্ষ্য আমাদের ভেরিয়েবল স্বাভাবিক করা. সুতরাং তাদের মান পরিসীমা 0 থেকে 1 পর্যন্ত হবে। চলুন এটি করি, এবং আমি `StandardScaler` ব্যবহার করব।

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

এখন অনুভূমিক বিভক্ত বা ট্রেন-পরীক্ষা সেট করা যাক। আমাদের একটি এলোমেলো ট্রেন-টেস্ট স্প্লিট ব্যবহার করে ট্রেনিং এবং টেস্ট সেটে আমাদের ডেটা (X এবং y) ভাগ করতে হবে। আমাদের পরীক্ষার সেটটি আমাদের মোট ডেটার 20% হওয়া উচিত। এবং আমরা প্রজননযোগ্যতার জন্য একটি র্যান্ডম_স্টেট সেট করতে ভুলবেন না।

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

একটি লজিস্টিক রিগ্রেশন মডেল তৈরি করুন

বেসলাইন

তাই এখন আমাদের মডেল তৈরি করা শুরু করতে হবে, এবং আমাদের বেসলাইন সেট করার জন্য অর্ডার দেওয়া শুরু করতে হবে। মনে রাখবেন যে আমরা যে ধরণের সমস্যার সাথে মোকাবিলা করছি তা হল একটি শ্রেণীবিভাগ সমস্যা, এবং শ্রেণীবিভাগের মডেলগুলি মূল্যায়ন করার জন্য বিভিন্ন মেট্রিক্স রয়েছে৷ আমি যেটির উপর ফোকাস করতে চাই তা হল নির্ভুলতা স্কোর।

এখন, নির্ভুলতা স্কোর কি? মেশিন লার্নিংয়ে নির্ভুলতা স্কোর হল একটি মূল্যায়ন মেট্রিক যা একটি মডেলের দ্বারা করা সঠিক ভবিষ্যদ্বাণীর সংখ্যা এবং মোট ভবিষ্যদ্বাণীর সংখ্যা পরিমাপ করে। আমরা সঠিক ভবিষ্যদ্বাণীর সংখ্যাকে মোট ভবিষ্যদ্বাণীর সংখ্যা দিয়ে ভাগ করে এটি গণনা করি। তাহলে এর মানে হল যে নির্ভুলতা স্কোর 0 এবং 1 এর মধ্যে যায়। শূন্য ভাল নয়। যে যেখানে আপনি হতে চান না, এবং একটি নিখুঁত. সুতরাং আসুন এটি মনে রাখি এবং মনে রাখি যে বেসলাইন হল একটি মডেল যা একটি ভবিষ্যদ্বাণী বারবার দেয়, পর্যবেক্ষণ যাই হোক না কেন, আমাদের জন্য শুধুমাত্র একটি অনুমান।

আমাদের ক্ষেত্রে, আমরা দুটি শ্রেণী আছে, স্থাপন বা না. তাই যদি আমরা শুধুমাত্র একটি ভবিষ্যদ্বাণী করতে পারি, তাহলে আমাদের অনুমান কী হবে? বললে মেজরিটি ক্লাস। আমি মনে করি যে জ্ঞান করে তোলে, তাই না? যদি আমরা শুধুমাত্র একটি ভবিষ্যদ্বাণী করতে পারি, তাহলে আমাদের সম্ভবত আমাদের ডেটাসেটে সর্বোচ্চ পর্যবেক্ষণ সহ একটি বেছে নেওয়া উচিত। সুতরাং, আমাদের বেসলাইন সেই শতাংশ ব্যবহার করবে যা সংখ্যাগরিষ্ঠ শ্রেণী প্রশিক্ষণের ডেটাতে দেখায়। যদি মডেলটি এই বেসলাইনটিকে মারধর না করে, তবে বৈশিষ্ট্যগুলি আমাদের পর্যবেক্ষণগুলিকে শ্রেণীবদ্ধ করার জন্য মূল্যবান তথ্য যোগ করছে না।

আমরা বেসলাইন নির্ভুলতা গণনা করতে `নরমালাইজ = ট্রু` আর্গুমেন্টের সাথে 'value_counts' পদ্ধতি ব্যবহার করতে পারি:

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

আমরা দেখতে পাচ্ছি যে আমাদের বেসলাইন নির্ভুলতা একটি অনুপাত হিসাবে 68% বা 0.68। কাজেই মান যোগ করার জন্য, আমরা সেই সংখ্যার উপরে যেতে চাই এবং একটির কাছাকাছি যেতে চাই। এটাই আমাদের লক্ষ্য, এবং এখন আমাদের মডেল তৈরি করা শুরু করা যাক।

পুনরাবৃত্তি করা

এখন লজিস্টিক রিগ্রেশন ব্যবহার করে আমাদের মডেল তৈরি করার সময়। আমরা লজিস্টিক রিগ্রেশন ব্যবহার করব, কিন্তু আমরা করার আগে, আসুন লজিস্টিক রিগ্রেশন কী এবং এটি কীভাবে কাজ করে সে সম্পর্কে একটু কথা বলি এবং তারপরে আমরা কোডিং জিনিসগুলি করতে পারি। এবং যে জন্য, এখানে আমরা একটি সামান্য গ্রিড আছে.

x অক্ষ বরাবর, ধরা যাক আমাদের ডেটা সেটে প্রার্থীদের p_degrees আছে। এবং আমি ডান থেকে বাম দিকে সরানোর সাথে সাথে ডিগ্রীগুলি উচ্চতর হতে থাকে এবং তারপর Y অক্ষ বরাবর, আমার কাছে স্থান নির্ধারণের জন্য সম্ভাব্য ক্লাস রয়েছে: শূন্য এবং এক।

লজিস্টিক রিগ্রেশনের জন্য গ্রাফ

তাই যদি আমরা আমাদের তথ্য পয়েন্ট আউট প্লট ছিল, এটা দেখতে কেমন হবে? আমাদের বিশ্লেষণ দেখায় যে একজন উচ্চ `p_degree` প্রার্থীর নিয়োগ পাওয়ার সম্ভাবনা বেশি। সুতরাং, এটি সম্ভবত এরকম কিছু দেখাবে, যেখানে একটি ছোট `p_degree` সহ প্রার্থী শূন্যে নিচে থাকবে। এবং উচ্চ `p_degree` সহ প্রার্থী এক সময়ে উঠে যাবে।

লজিস্টিক রিগ্রেশনের জন্য পি-ডিগ্রী

এখন বলা যাক যে আমরা এটি দিয়ে লিনিয়ার রিগ্রেশন করতে চেয়েছিলাম। ধরা যাক আমরা একটি লাইন প্লট করতে চেয়েছিলাম।
এখন, যদি আমরা এটি করি, তাহলে কী হবে সেই লাইনটি এমনভাবে প্লট করা হবে যে এটি যতটা সম্ভব সমস্ত পয়েন্টের কাছাকাছি হওয়ার চেষ্টা করবে। এবং তাই আমরা সম্ভবত এই মত কিছু লাগছিল যে একটি লাইন সঙ্গে শেষ হবে. এই একটি ভাল মডেল হবে?

পুনরাবৃত্তি

আসলে তা না. প্রার্থীর p_degree নির্বিশেষে যা ঘটবে, আমরা সর্বদা এক ধরণের মান পেতে পারি। এবং এটি আমাদের সাহায্য করবে না কারণ সংখ্যা, এই প্রসঙ্গে, কিছু মানে না। এই শ্রেণীবিন্যাস সমস্যা হয় শূন্য বা এক হতে হবে। সুতরাং, এটা যে ভাবে কাজ করা যাচ্ছে না.

অন্যদিকে, কারণ এটি একটি লাইন, যদি আমাদের খুব কম p_degree সহ একজন প্রার্থী থাকে? ঠিক আছে, হঠাৎ করেই, আমাদের অনুমান একটি ঋণাত্মক সংখ্যা। এবং আবার, এই কোন মানে না. কোন ঋণাত্মক সংখ্যা নেই শূন্য বা এক হতে হবে। এবং একই ভাবে, যদি আমরা একটি খুব উচ্চ p_degree সঙ্গে একটি প্রার্থী আছে, আমি একটি ইতিবাচক হতে পারে, এক উপরে কিছু. এবং আবার, যে কোন মানে না. আমাদের হয় একটি শূন্য বা এক থাকতে হবে।

ভবিষ্যদ্বাণী

সুতরাং আমরা এখানে যা দেখি তা হল শ্রেণিবিন্যাসের জন্য লিনিয়ার রিগ্রেশন ব্যবহার করার কিছু গুরুতর সীমাবদ্ধতা। তাই আমাদের কি করতে হবে? আমাদের এমন একটি মডেল তৈরি করতে হবে যা এক নম্বর: শূন্যের নিচে বা একের উপরে না যায়, তাই এটিকে শূন্য এবং একের মধ্যে আবদ্ধ করতে হবে। এবং দুই নম্বর, সেই ফাংশন থেকে যাই হোক না কেন, আমরা যে সমীকরণটি তৈরি করি, আমাদের হয়তো এটিকে ভবিষ্যদ্বাণী হিসাবে বিবেচনা করা উচিত নয় বরং আমাদের চূড়ান্ত ভবিষ্যদ্বাণী করার দিকে একটি পদক্ষেপ হিসাবে বিবেচনা করা উচিত।

এখন, আমি এইমাত্র যা বলেছি তা খুলে ফেলুন, এবং আসুন আমরা নিজেদেরকে মনে করিয়ে দিই যে যখন আমরা আমাদের রৈখিক রিগ্রেশন মডেলগুলি করি, তখন আমরা এই রৈখিক সমীকরণটি দিয়ে শেষ করি, যা সবচেয়ে সহজ ফর্ম। এবং এটি সেই সমীকরণ বা ফাংশন যা আমাদের সেই সরল রেখা দেয়।

চিত্র

0 এবং 1 এর মধ্যে সেই লাইনটি বাঁধার একটি উপায় আছে। এবং আমরা যা করতে পারি তা হল এই ফাংশনটি যা আমরা এইমাত্র তৈরি করেছি এবং এটিকে অন্য একটি ফাংশনে আবদ্ধ করি, যাকে সিগমায়েড ফাংশন বলা হয়।

লজিস্টিক রিগ্রেশনের জন্য ফাংশন

সুতরাং, আমি রৈখিক সমীকরণটি নিতে যাচ্ছি যা আমরা এইমাত্র পেয়েছি, এবং আমি এটিকে সিগমায়েড ফাংশনে সঙ্কুচিত করব এবং এটিকে সূচক হিসাবে রাখব।

লজিস্টিক রিগ্রেশনের জন্য ফাংশন

একটি সরল রেখা পাওয়ার পরিবর্তে কি হয়, আমরা এমন একটি রেখা পাই যা এইরকম দেখায়। এটা একটাতে আটকে আছে। এটা আসে এবং নিচে squiggles. তারপর শূন্যে আটকে যায়।

পণ্য সরবরাহ সংশ্লেষণ

ঠিক আছে, এই লাইনটি দেখতে কেমন, এবং আমরা দেখতে পাচ্ছি যে আমরা আমাদের প্রথম সমস্যাটি সমাধান করেছি। এই ফাংশন থেকে আমরা যা কিছু বের করব তা হবে 0 এবং 1 এর মধ্যে। দ্বিতীয় ধাপে, আমরা এই সমীকরণ থেকে যা আসে তা চূড়ান্ত ভবিষ্যদ্বাণী হিসাবে বিবেচনা করব না। পরিবর্তে, আমরা এটিকে সম্ভাব্যতা হিসাবে বিবেচনা করব।

পণ্য সরবরাহ সংশ্লেষণ

আমি কি বলতে চাই? তার মানে যখন আমি একটি ভবিষ্যদ্বাণী করব, আমি 0 এবং 1 এর মধ্যে কিছু ফ্লোটিং পয়েন্ট মান পাব। এবং আমি যা করব তা হল আমার ভবিষ্যদ্বাণীটি ইতিবাচক শ্রেণীর অন্তর্গত হওয়ার সম্ভাবনা হিসাবে বিবেচনা করা।

তাই আমি 0.9999 এ একটি মান পেতে. আমি বলব যে এই প্রার্থীটি আমাদের ইতিবাচক, স্থাপন করা শ্রেণীর অন্তর্গত হওয়ার সম্ভাবনা 99%। তাই আমি প্রায় নিশ্চিত যে এটি ইতিবাচক শ্রেণীর অন্তর্গত। বিপরীতভাবে, যদি এটি 0.001 পয়েন্টে বা যাই হোক না কেন, আমি বলব এই সংখ্যাটি কম। সম্ভাব্যতা যে এই বিশেষ পর্যবেক্ষণ ধনাত্মক অন্তর্গত, স্থাপন করা বর্গ প্রায় শূন্য. এবং তাই, আমি বলতে যাচ্ছি এটা ক্লাস জিরোর অন্তর্গত।

সুতরাং যে সংখ্যার জন্য অর্থে তোলে যে এক কাছাকাছি বা শূন্য কাছাকাছি. কিন্তু আপনি নিজেকে জিজ্ঞাসা করতে পারেন, আমি এর মধ্যে অন্যান্য মান দিয়ে কী করব? যেভাবে কাজ করে তা হল আমরা একটি কাট অফ লাইন ঠিক 0.5-এ রাখি, তাই আমি সেই লাইনের নীচে যে কোনও মান পাই, আমি এটিকে শূন্যে রাখব, তাই আমার ভবিষ্যদ্বাণী নেই, এবং যদি এটি সেই লাইনের উপরে হয়, যদি এটি পয়েন্ট পাঁচের উপরে হয় , আমি এটিকে ইতিবাচক শ্রেণিতে রাখব, আমার ভবিষ্যদ্বাণী এক।

পি-ডিগ্রী

সুতরাং, এখন আমার কাছে একটি ফাংশন রয়েছে যা আমাকে শূন্য এবং একের মধ্যে একটি ভবিষ্যদ্বাণী দেয় এবং আমি এটিকে সম্ভাব্যতা হিসাবে বিবেচনা করি। এবং যদি সেই সম্ভাবনা 0.5 বা 50% এর উপরে হয়, আমি বলি, ঠিক আছে, পজিটিভ ক্লাস ওয়ান। এবং যদি এটি 50% এর নিচে হয়, আমি বলি, এটি নেতিবাচক শ্রেণী, শূন্য। সুতরাং যে উপায় যে লজিস্টিক রিগ্রেশন কাজ করে. এবং এখন আমরা বুঝতে পারি যে, আসুন এটি কোড করি এবং এটি ফিট করি। আমি হাইপারপ্যারামিটার 'max_iter' কে 1000 এ সেট করব। এই প্যারামিটারটি সমাধানকারীদের একত্রিত হওয়ার জন্য সর্বাধিক সংখ্যক পুনরাবৃত্তিকে নির্দেশ করে।

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

মূল্যনির্ধারণ

এখন দেখার সময় আমাদের মডেল কেমন করে। লজিস্টিক রিগ্রেশন মডেলের মূল্যায়ন করার সময় এসেছে। সুতরাং, আসুন মনে রাখবেন যে এইবার, আমরা যে পারফরম্যান্স মেট্রিকটিতে আগ্রহী তা হল নির্ভুলতা স্কোর, এবং আমরা একটি সঠিক স্কোর চাই। এবং আমরা 0.68 এর বেসলাইন বীট করতে চাই। accuracy_score ফাংশন ব্যবহার করে মডেলের নির্ভুলতা গণনা করা যেতে পারে। ফাংশনের জন্য দুটি আর্গুমেন্টের প্রয়োজন, সত্য লেবেল এবং পূর্বাভাসিত লেবেল।

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% এ দেখতে পারি। এটা বেসলাইন মারছে. আমাদের পরীক্ষার নির্ভুলতা 88% এ একটু কম ছিল। এটি বেসলাইনকেও হার মানায় এবং আমাদের প্রশিক্ষণের সঠিকতার খুব কাছাকাছি ছিল। সুতরাং এটি ভাল খবর কারণ এর মানে হল যে আমাদের মডেল অতিরিক্ত ফিটিং বা অন্য কিছু নয়।

লজিস্টিক রিগ্রেশন মডেলের ফলাফল

মনে রাখবেন যে লজিস্টিক রিগ্রেশনের সাথে, আমরা শূন্য বা একের এই চূড়ান্ত ভবিষ্যদ্বাণীগুলি দিয়ে শেষ করি। কিন্তু সেই ভবিষ্যদ্বাণীর নীচে, শূন্য বা একের মধ্যে একটি ফ্লোটিং পয়েন্ট সংখ্যার সম্ভাবনা রয়েছে এবং কখনও কখনও সেই সম্ভাব্যতা অনুমানগুলি কী তা দেখতে সহায়ক হতে পারে। আসুন আমাদের প্রশিক্ষণের ভবিষ্যদ্বাণী দেখি, এবং প্রথম পাঁচটি দেখি। 'ভবিষ্যদ্বাণী' পদ্ধতি একটি লেবেলবিহীন পর্যবেক্ষণের লক্ষ্যের পূর্বাভাস দেয়।

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

সুতরাং তারা চূড়ান্ত ভবিষ্যদ্বাণী ছিল, কিন্তু তাদের পিছনে সম্ভাব্যতা কি? সেগুলি পেতে, আমাদের একটি সামান্য ভিন্ন কোড করতে হবে। আমাদের মডেলের সাথে `ভবিষ্যদ্বাণী` পদ্ধতি ব্যবহার করার পরিবর্তে, আমি আমাদের প্রশিক্ষণ ডেটার সাথে 'ভবিষ্যদ্বাণী_প্রোবা' ব্যবহার করব।

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

আমরা দুইটি ভিন্ন কলাম সহ এক ধরণের নেস্টেড তালিকা দেখতে পাচ্ছি। বাম দিকের কলামটি সম্ভাব্যতার প্রতিনিধিত্ব করে যে একজন প্রার্থী রাখা হয়নি বা আমাদের নেতিবাচক শ্রেণি 'নট প্লেসড'। অন্য কলামটি ধনাত্মক শ্রেণী `স্থাপিত` বা একজন প্রার্থীকে রাখা হয়েছে এমন সম্ভাবনার প্রতিনিধিত্ব করে। আমরা দ্বিতীয় কলামে ফোকাস করব। যদি আমরা প্রথম সম্ভাব্যতা অনুমানটি সঠিকভাবে দেখি, আমরা দেখতে পাব যে এটি 0.07। তাই যেহেতু এটি 50% এর নিচে, আমাদের মডেল বলছে, আমার ভবিষ্যদ্বাণী শূন্য। এবং নিম্নলিখিত ভবিষ্যদ্বাণীগুলির জন্য, আমরা দেখতে পাচ্ছি যে সেগুলি 0.5-এর উপরে, এবং সেই কারণেই আমাদের মডেল শেষ পর্যন্ত একটি ভবিষ্যদ্বাণী করেছে৷

এখন আমরা বৈশিষ্ট্যের নাম এবং গুরুত্ব বের করতে চাই এবং সেগুলিকে একটি সিরিজে রাখতে চাই। এবং যেহেতু আমাদের বৈশিষ্টের গুরুত্বকে বৈষম্যের অনুপাত হিসাবে প্রদর্শন করতে হবে, তাই আমাদের গুরুত্বের সূচকটি গ্রহণ করে আমাদেরকে সামান্য গাণিতিক রূপান্তর করতে হবে।

# 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

মতভেদ অনুপাত এবং সেগুলি কী তা নিয়ে আলোচনা করার আগে, আসুন একটি অনুভূমিক বার চার্টে সেগুলি নিয়ে আসি। আসুন প্লট তৈরি করতে পান্ডা ব্যবহার করি, এবং মনে রাখবেন যে আমরা পাঁচটি বৃহত্তম সহগ খুঁজব। এবং আমরা সব মতভেদ অনুপাত ব্যবহার করতে চাই না. তাই আমরা লেজ ব্যবহার করতে চাই.

# Horizontal bar chart, five largest coefficients
odds_ratios.tail().plot(kind="barh")
plt.xlabel("Odds Ratio")
plt.ylabel("Feature")
plt.title("High Importance Features");
# অনুভূমিক বার চার্ট, পাঁচটি বৃহত্তম সহগ odds_ratios.tail().plot(kind=

এখন আমি চাই আপনি 5 এ একটি উল্লম্ব রেখা কল্পনা করুন, এবং আমি এটি দেখে শুরু করতে চাই। আসুন এই প্রতিটি সম্পর্কে পৃথকভাবে বা শুধুমাত্র প্রথম দম্পতি সম্পর্কে কথা বলা যাক। তাহলে আসুন এখানে 'ssc_p' দিয়ে শুরু করা যাক, যা 'মাধ্যমিক শিক্ষা শতাংশ - 10 তম গ্রেড' বোঝায়। এবং আমরা দেখতে পাচ্ছি যে অডস রেশিও 30 এ। এখন, এর মানে কি? এর মানে হল যদি একজন প্রার্থীর উচ্চ 'ssc_p' থাকে, তাহলে তাদের নিয়োগের সম্ভাবনা অন্য প্রার্থীদের তুলনায় ছয় গুণ বেশি, সব জিনিস সমান। সুতরাং এটি ভাবার আরেকটি উপায় হল যখন প্রার্থীর `ssc_p` থাকে, প্রার্থীর নিয়োগের সম্ভাবনা ছয় গুণ বেড়ে যায়।

সুতরাং পাঁচের উপরে যেকোন প্রতিকূল অনুপাত প্রার্থীদের যে মতভেদ স্থাপন করা হয়েছে তা বাড়িয়ে দেয়। এবং তাই আমরা পাঁচ এ যে উল্লম্ব লাইন আছে কেন. এবং এই পাঁচ ধরনের বৈশিষ্ট্য হল এমন বৈশিষ্ট্য যা বর্ধিত নিয়োগের সাথে সবচেয়ে বেশি যুক্ত। সুতরাং, যে আমাদের মতভেদ অনুপাত কি. এখন, আমরা সেই বৈশিষ্ট্যগুলি দেখেছি যা নিয়োগ বৃদ্ধির সাথে সবচেয়ে বেশি যুক্ত। এর সাথে যুক্ত থাকা বৈশিষ্ট্যগুলো দেখে নেওয়া যাক, নিয়োগ কমেছে। তাই এখন সবচেয়ে ছোটগুলো দেখার পালা। তাই লেজের দিকে না তাকিয়ে আমরা তা দেখব।

odds_ratios.head().plot(kind="barh")
plt.xlabel("Odds Ratio")
plt.xlabel("Odds Ratio")
plt.ylabel("Feature")
plt.title("Low Importance Features");
কম গুরুত্ব বৈশিষ্ট্য

আমাদের এখানে প্রথম যে জিনিসটি দেখতে হবে তা হল x-অক্ষের উপর নোটিশ সবকিছু এক বা নীচে। এখন ওটার মানে কি? সুতরাং আসুন এখানে আমাদের ক্ষুদ্রতম প্রতিকূল অনুপাতটি একবার দেখে নেওয়া যাক। এটি mba_p যা MBA শতাংশ বোঝায়। আমরা দেখতে পাচ্ছি যে এটি প্রায় 0.45 এ প্রস্তুত। এখন ওটার মানে কি? আচ্ছা, 0.45 এবং 1 এর মধ্যে পার্থক্য হল 0.55। ঠিক আছে? এবং যে সংখ্যা মানে কি? এমবিএ সহ প্রার্থীদের 55% দ্বারা নিয়োগের সম্ভাবনা কম, অন্যান্য সমস্ত জিনিস সমান। ঠিক আছে? সুতরাং এটি 0.55 বা 55% এর একটি ফ্যাক্টর দ্বারা নিয়োগের সম্ভাবনা হ্রাস করেছে। এবং যে এখানে সবকিছু জন্য সত্য.

উপসংহার

তাহলে আমরা কি শিখেছিলাম? প্রথমত, প্রস্তুত ডেটা পর্বে, আমরা শিখেছি যে আমরা লজিস্টিক রিগ্রেশন ব্যবহার করে শ্রেণীবিভাগ, বিশেষ করে বাইনারি শ্রেণীবিভাগের সাথে কাজ করছি। ডেটা অন্বেষণের ক্ষেত্রে, আমরা প্রচুর পরিমাণে কাজ করেছি, কিন্তু হাইলাইটের পরিপ্রেক্ষিতে, আমরা শ্রেণির ভারসাম্যের দিকে তাকিয়েছি, তাই না? আমাদের ইতিবাচক এবং নেতিবাচক শ্রেণীর অনুপাত। তারপর আমরা আমাদের তথ্য বিভক্ত.

যেহেতু লজিস্টিক রিগ্রেশন একটি শ্রেণিবিন্যাস মডেল, আমরা একটি নতুন কর্মক্ষমতা মেট্রিক, নির্ভুলতা স্কোর সম্পর্কে শিখেছি। এখন, নির্ভুলতা স্কোর 0 এবং 1 এর মধ্যে যায়। শূন্য খারাপ, এবং একটি ভাল। যখন আমরা পুনরাবৃত্তি করছিলাম, আমরা লজিস্টিক রিগ্রেশন সম্পর্কে শিখেছি। এটি একটি জাদুকরী উপায়, যেখানে আপনি একটি রৈখিক সমীকরণ, একটি সরল রেখা নিতে পারেন এবং এটিকে অন্য একটি ফাংশন, একটি সিগমায়েড ফাংশন এবং একটি অ্যাক্টিভেশন ফাংশনের ভিতরে রাখতে পারেন এবং এটি থেকে একটি সম্ভাব্যতা অনুমান পেতে পারেন এবং সেই সম্ভাব্যতা অনুমানটিকে ভবিষ্যদ্বাণীতে পরিণত করতে পারেন৷

পরিশেষে, আমরা প্রতিকূল অনুপাত সম্পর্কে শিখেছি এবং আমরা যেভাবে সহগগুলিকে ব্যাখ্যা করতে পারি তা দেখতে একটি প্রদত্ত বৈশিষ্ট্য আমাদের প্রার্থী নিয়োগ করেছি বা না করার মত প্রতিকূলতা বাড়াবে কিনা।

প্রকল্প সোর্স কোড: https://github.com/SawsanYusuf/Campus-Recruitment.git

এই নিবন্ধে দেখানো মিডিয়া Analytics বিদ্যার মালিকানাধীন নয় এবং লেখকের বিবেচনার ভিত্তিতে ব্যবহার করা হয়। 

সময় স্ট্যাম্প:

থেকে আরো বিশ্লেষণ বিদ্যা