কম্পিউটার টিউটোরিয়াল

পাইথনে লজিস্টিক রিগ্রেশন: বাইনারি আউটকাম প্রেডিকশনের গাইড

লজিস্টিক রিগ্রেশন একটি Σταтистиকল টেকনিক যা বাইনারি আউটকাম প্রেডিক্ট করতে ব্যবহৃত হয়। এটি নতুন নয়—বর্তমানে ফাইন্যান্স, মেডিসিন, ক্রিমিনোলজি এবং অন্যান্য সোশ্যাল সায়েন্সে ব্যবহৃত হচ্ছে।

এই সেকশনে পাইথন দিয়ে লজিস্টিক রিগ্রেশন ইমপ্লিমেন্ট করা দেখানো হলো (R-ও দিয়ে করা যায়)।

ইনস্টলেশন

নিচের লাইব্রেরিগুলো ব্যবহার করা হবে:

  • NumPy: न्यুমেরিক্যাল অ্যারে ও ম্যাট্রিক্স ডিফাইন করতে।
  • Pandas: ডেটা হ্যান্ডল ও অপারেশনের জন্য।
  • Statsmodels: প‍্যারামিটার এস্টিমেশন ও স্ট্যাটিস্টিক্যাল টেস্টিংয়ের জন্য।
  • Pylab: প্লট জেনারেট করতে।

CLI-তে নিচের কমান্ড রান করে ইনস্টল করুন:

>pip install numpy pandas statsmodels

লজিস্টিক রিগ্রেশনের উদাহরণ ইউজ কেস

UCLA-এর (Institute for Digital Research and Education) লজিট রিগ্রেশন ডেটা ব্যবহার করব। CSV ফরম্যাটে ডেটা: binary.csv

এই ডেটা দিয়ে গ্রেজুয়েট স্কুলে অ্যাডমিশনকে প্রভাবিত করার ফ্যাক্টরগুলো বের করব।

প্রয়োজনীয় লাইব্রেরি ইম্পোর্ট ও ডেটাসেট লোড

import pandas as pd
import statsmodels.api as sm
import pylab as pl
import numpy as np

df = pd.read_csv('binary.csv')
# সরাসরি লিংক থেকে পড়তে চাইলে:
# df = pd.read_csv('https://stats.idre.ucla.edu/stat/data/binary.csv')
print(df.head())

আউটপুট

   admit  gre  gpa  rank
0      0  380 3.61     3
1      1  660 3.67     3
2      1  800 4.00     1
3      1  640 3.19     4
4      0  520 2.93     4

rank কলাম নেম pandas-এ মেথড নামের সাথে конфликт করতে পারে, তাই এটিকে prestige করে রিনেম করি:

df.columns = ["admit", "gre", "gpa", "prestige"]
print(df.columns)

আউটপুট

Index(['admit', 'gre', 'gpa', 'prestige'], dtype='object')

ডেটা সারমারাইজ করা

print(df.describe())

আউটপুট

           admit       gre        gpa    prestige
count   400.000000  400.000000  400.000000  400.00000
mean      0.317500  587.700000    3.389900    2.48500
std       0.466087  115.516536    0.380567    0.94446
min       0.000000  220.000000    2.260000    1.00000
25%       0.000000  520.000000    3.130000    2.00000
50%       0.000000  580.000000    3.395000    2.00000
75%       1.000000  660.000000    3.670000    3.00000
max       1.000000  800.000000    4.000000    4.00000

স্ট্যান্ডার্ড ডেভিয়েশন এবং ফ্রিকোয়েন্সি টেবিল

print(df.std())
admit      0.466087
gre      115.516536
gpa        0.380567
prestige   0.944460
dtype: float64
print(pd.crosstab(df['admit'], df['prestige'], rownames=['admit']))
prestige   1   2   3   4
admit                  
0         28  97  93  55
1         33  54  28  12

হিস্টোগ্রাম প্লট

df.hist()
pl.show()

ডামি ভেরিয়েবল তৈরি (One-Hot Encoding)

dummy_ranks = pd.get_dummies(df['prestige'], prefix='prestige')
print(dummy_ranks.head())

আউটপুট

   prestige_1  prestige_2  prestige_3  prestige_4
0           0           0           1           0
1           0           0           1           0
2           1           0           0           0
3           0           0           0           1
4           0           0           0           1

ক্লিন ডেটাফ্রেম তৈরি

cols_to_keep = ['admit', 'gre', 'gpa']
data = df[cols_to_keep].join(dummy_ranks.ix[:, 'prestige_2':])
print(data.head())

আউটপুট

   admit  gre   gpa  prestige_2  prestige_3  prestige_4
0      0  380  3.61           0           1           0
1      1  660  3.67           0           1           0
2      1  800  4.00           0           0           0
3      1  640  3.19           0           0           1
4      0  520  2.93           0           0           1

রিগ্রেশন পারফর্ম করা

train_cols = data.columns[1:]  # Index(['gre', 'gpa', 'prestige_2', 'prestige_3', 'prestige_4'], dtype=object)
logit = sm.Logit(data['admit'], data[train_cols])
result = logit.fit()

আউটপুট

Optimization terminated successfully.
Current function value: 0.573147
Iterations 6

রেজাল্ট ইন্টারপ্রিটেশন

print(result.summary2())

আউটপুট (সারাংশ)

Results: Logit
===============================================================
Model:              Logit              No. Iterations: 6.0000
Dependent Variable: admit              Pseudo R-squared: 0.083
Date:               2019-03-03 14:16   AIC: 470.5175
No. Observations:   400                BIC: 494.4663
Df Model:           5                  Log-Likelihood: -229.26
Df Residuals:       394                LL-Null: -249.99
Converged:          1.0000             Scale: 1.0000
----------------------------------------------------------------
            Coef.  Std.Err.    z    P>|z|   [0.025  0.975]
----------------------------------------------------------------
gre         0.0023  0.0011   2.0699  0.0385   0.0001  0.0044
gpa         0.8040  0.3318   2.4231  0.0154   0.1537  1.4544
prestige_2 -0.6754  0.3165  -2.1342  0.0328  -1.2958 -0.0551
prestige_3 -1.3402  0.3453  -3.8812  0.0001  -2.0170 -0.6634
prestige_4 -1.5515  0.4178  -3.7131  0.0002  -2.3704 -0.7325
intercept  -3.9900  1.1400  -3.5001  0.0005  -6.2242 -1.7557
============================================================

কনফিডেন্স ইন্টারভাল:

print(result.conf_int())
                   0         1
gre          0.000120   0.004409
gpa          0.153684   1.454391
prestige_2  -1.295751  -0.055135
prestige_3  -2.016992  -0.663416
prestige_4  -2.370399  -0.732529
intercept   -6.224242  -1.755716

ফলাফল থেকে দেখা যায়, অ্যাডমিশন প্রোব্যাবিলিটি এবং আন্ডারগ্রেজুয়েট স্কুলের প্রেস্টিজের মধ্যে ইনভার্স রিলেশনশিপ রয়েছে। টপ র‍্যাঙ্কড কালেজের (prestige_1=True) ছাত্রদের গ্রেজুয়েট প্রোগ্রামে নেওয়ার সম্ভাবনা নিম্ন র‍্যাঙ্কড স্কুলের (prestige_3 বা prestige_4) ছাত্রদের চেয়ে বেশি।

  1. পাইথন - পলিনোমিয়াল রিগ্রেশন ইমপ্লিমেন্টেশন (scikit-learn)

  2. পাইথনে কোরিলেশন এবং রিগ্রেশন

  3. পাইথনে issuperset() ফাংশন

  4. পাইথনে PyTorch দিয়ে হস্তলিখিত অঙ্ক চেনা (Logistic Regression / CNN)