อัลกอริทึมการจำแนกประเภท - การถดถอยโลจิสติก

ความรู้เบื้องต้นเกี่ยวกับ Logistic Regression

การถดถอยโลจิสติกเป็นอัลกอริธึมการจำแนกประเภทการเรียนรู้ภายใต้การดูแลที่ใช้ในการทำนายความน่าจะเป็นของตัวแปรเป้าหมาย ลักษณะของเป้าหมายหรือตัวแปรตามเป็นแบบ dichotomous ซึ่งหมายความว่าจะมีคลาสที่เป็นไปได้เพียงสองคลาส

กล่าวง่ายๆคือตัวแปรตามเป็นไบนารีโดยมีรหัสข้อมูลเป็น 1 (ย่อมาจากความสำเร็จ / ใช่) หรือ 0 (ย่อมาจากความล้มเหลว / ไม่ใช่)

ในทางคณิตศาสตร์แบบจำลองการถดถอยโลจิสติกส์คาดการณ์ว่า P (Y = 1) เป็นฟังก์ชันของ X เป็นหนึ่งในอัลกอริทึม ML ที่ง่ายที่สุดที่สามารถใช้สำหรับปัญหาการจำแนกประเภทต่างๆเช่นการตรวจจับสแปมการทำนายโรคเบาหวานการตรวจหามะเร็งเป็นต้น

ประเภทของ Logistic Regression

โดยทั่วไปการถดถอยโลจิสติกหมายถึงการถดถอยโลจิสติกแบบไบนารีที่มีตัวแปรเป้าหมายแบบไบนารี แต่ตัวแปรเป้าหมายยังมีอีกสองประเภทที่สามารถทำนายได้ ตามจำนวนประเภทเหล่านั้นการถดถอยโลจิสติกสามารถแบ่งออกเป็นประเภทต่อไปนี้ -

ไบนารีหรือทวินาม

ในการจำแนกประเภทดังกล่าวตัวแปรตามจะมีเพียง 2 ประเภทที่เป็นไปได้คือ 1 และ 0 ตัวอย่างเช่นตัวแปรเหล่านี้อาจแสดงถึงความสำเร็จหรือความล้มเหลวใช่หรือไม่ใช่ชนะหรือแพ้เป็นต้น

พหุนาม

ในการจำแนกประเภทดังกล่าวตัวแปรตามสามารถมีได้ 3 ประเภทหรือมากกว่าที่ไม่ได้เรียงลำดับหรือประเภทที่ไม่มีนัยสำคัญเชิงปริมาณ ตัวอย่างเช่นตัวแปรเหล่านี้อาจแสดงถึง“ ประเภท A” หรือ“ ประเภท B” หรือ“ ประเภท C”

ลำดับ

ในการจำแนกประเภทดังกล่าวตัวแปรตามสามารถมีประเภทลำดับที่เป็นไปได้ 3 ประเภทขึ้นไปหรือประเภทที่มีนัยสำคัญเชิงปริมาณ ตัวอย่างเช่นตัวแปรเหล่านี้อาจแสดงถึง "ไม่ดี" หรือ "ดี" "ดีมาก" "ดีเยี่ยม" และแต่ละหมวดหมู่สามารถมีคะแนนได้เช่น 0,1,2,3

สมมติฐานการถดถอยโลจิสติก

ก่อนที่จะดำดิ่งสู่การใช้การถดถอยโลจิสติกส์เราต้องตระหนักถึงสมมติฐานต่อไปนี้เกี่ยวกับสิ่งเดียวกัน -

  • ในกรณีของการถดถอยโลจิสติกแบบไบนารีตัวแปรเป้าหมายจะต้องเป็นไบนารีเสมอและผลลัพธ์ที่ต้องการจะแสดงด้วยปัจจัยระดับ 1

  • แบบจำลองไม่ควรมีหลาย collinearity ซึ่งหมายความว่าตัวแปรอิสระจะต้องเป็นอิสระจากกัน

  • เราต้องรวมตัวแปรที่มีความหมายไว้ในแบบจำลองของเรา

  • เราควรเลือกขนาดตัวอย่างที่ใหญ่สำหรับการถดถอยโลจิสติกส์

แบบจำลองการถดถอยโลจิสติกแบบไบนารี

รูปแบบที่ง่ายที่สุดของการถดถอยโลจิสติกส์คือการถดถอยโลจิสติกแบบไบนารีหรือทวินามซึ่งเป้าหมายหรือตัวแปรตามสามารถมีได้เพียง 2 ประเภทคือ 1 หรือ 0 ช่วยให้เราสามารถจำลองความสัมพันธ์ระหว่างตัวแปรทำนายหลายตัวและตัวแปรเป้าหมายไบนารี / ทวินาม ในกรณีของการถดถอยโลจิสติกโดยทั่วไปแล้วฟังก์ชันเชิงเส้นจะใช้เป็นอินพุตไปยังฟังก์ชันอื่นเช่นในความสัมพันธ์ต่อไปนี้ -

$$ h _ {\ theta} {(x)} = g (\ theta ^ {T} x) ℎ0≤h _ {\ theta} ≤1 $$

นี่คือฟังก์ชันโลจิสติกส์หรือซิกมอยด์ซึ่งสามารถระบุได้ดังนี้ -

$$ g (z) = \ frac {1} {1 + e ^ {- z}} ℎ = \ theta ^ {T} $$

เส้นโค้งซิกมอยด์สามารถแสดงด้วยความช่วยเหลือของกราฟต่อไปนี้ เราสามารถดูค่าของแกน y อยู่ระหว่าง 0 ถึง 1 และข้ามแกนที่ 0.5

ชั้นเรียนสามารถแบ่งออกเป็นบวกหรือลบ ผลลัพธ์จะอยู่ภายใต้ความน่าจะเป็นของคลาสบวกหากอยู่ระหว่าง 0 ถึง 1 สำหรับการนำไปใช้งานของเราเรากำลังตีความผลลัพธ์ของฟังก์ชันสมมติฐานเป็นค่าบวกหากเป็น≥0.5หรือเป็นลบ

นอกจากนี้เรายังต้องกำหนดฟังก์ชันการสูญเสียเพื่อวัดว่าอัลกอริทึมทำงานได้ดีเพียงใดโดยใช้น้ำหนักของฟังก์ชันซึ่งแสดงโดยทีต้าดังนี้ -

ℎ = ()

$$ J (\ theta) = \ frac {1} {m} (- y ^ {T} log (h) - (1 -y) ^ Tlog (1-h)) $$

ตอนนี้หลังจากกำหนดฟังก์ชันการสูญเสียเป้าหมายหลักของเราคือการลดฟังก์ชันการสูญเสียให้น้อยที่สุด สามารถทำได้ด้วยความช่วยเหลือของการปรับน้ำหนักซึ่งหมายถึงการเพิ่มหรือลดน้ำหนัก ด้วยความช่วยเหลือของอนุพันธ์ของฟังก์ชันการสูญเสียเขียนแต่ละน้ำหนักเราจะสามารถรู้ได้ว่าพารามิเตอร์ใดควรมีน้ำหนักสูงและสิ่งที่ควรมีน้ำหนักน้อยกว่า

สมการการไล่ระดับสีต่อไปนี้บอกเราว่าการสูญเสียจะเปลี่ยนไปอย่างไรหากเราแก้ไขพารามิเตอร์ -

$$ \ frac {()} {\ theta_ {j}} = \ frac {1} {m} X ^ {T} (() -) $$

การใช้งานใน Python

ตอนนี้เราจะใช้แนวคิดข้างต้นของการถดถอยโลจิสติกแบบทวินามใน Python เพื่อจุดประสงค์นี้เราใช้ชุดข้อมูลดอกไม้หลายตัวแปรชื่อ 'ไอริส' ซึ่งมี 3 คลาสละ 50 อินสแตนซ์ แต่เราจะใช้คอลัมน์คุณลักษณะสองคอลัมน์แรก ทุกชั้นเป็นตัวแทนของดอกไอริสชนิดหนึ่ง

ขั้นแรกเราต้องนำเข้าไลบรารีที่จำเป็นดังนี้ -

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets

จากนั้นโหลดชุดข้อมูลม่านตาดังต่อไปนี้ -

iris = datasets.load_iris()
X = iris.data[:, :2]
y = (iris.target != 0) * 1

เราสามารถลงจุดข้อมูลการฝึกของเราได้ดังนี้ -

plt.figure(figsize=(6, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='g', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='y', label='1')
plt.legend();

ต่อไปเราจะกำหนดฟังก์ชัน sigmoid ฟังก์ชันการสูญเสียและการไล่ระดับสีลงดังนี้ -

class LogisticRegression:
   def __init__(self, lr=0.01, num_iter=100000, fit_intercept=True, verbose=False):
      self.lr = lr
      self.num_iter = num_iter
      self.fit_intercept = fit_intercept
      self.verbose = verbose
   def __add_intercept(self, X):
      intercept = np.ones((X.shape[0], 1))
      return np.concatenate((intercept, X), axis=1)
   def __sigmoid(self, z):
      return 1 / (1 + np.exp(-z))
   def __loss(self, h, y):
      return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
   def fit(self, X, y):
      if self.fit_intercept:
         X = self.__add_intercept(X)

ตอนนี้เริ่มต้นน้ำหนักดังต่อไปนี้ -

self.theta = np.zeros(X.shape[1])
   for i in range(self.num_iter):
      z = np.dot(X, self.theta)
      h = self.__sigmoid(z)
      gradient = np.dot(X.T, (h - y)) / y.size
      self.theta -= self.lr * gradient
      z = np.dot(X, self.theta)
      h = self.__sigmoid(z)
      loss = self.__loss(h, y)
      if(self.verbose ==True and i % 10000 == 0):
         print(f'loss: {loss} \t')

ด้วยความช่วยเหลือของสคริปต์ต่อไปนี้เราสามารถทำนายความน่าจะเป็นของผลลัพธ์ -

def predict_prob(self, X):
   if self.fit_intercept:
      X = self.__add_intercept(X)
   return self.__sigmoid(np.dot(X, self.theta))
def predict(self, X):
   return self.predict_prob(X).round()

ต่อไปเราสามารถประเมินโมเดลและพล็อตได้ดังนี้ -

model = LogisticRegression(lr=0.1, num_iter=300000)
preds = model.predict(X)
(preds == y).mean()

plt.figure(figsize=(10, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='g', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='y', label='1')
plt.legend()
x1_min, x1_max = X[:,0].min(), X[:,0].max(),
x2_min, x2_max = X[:,1].min(), X[:,1].max(),
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = model.predict_prob(grid).reshape(xx1.shape)
plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='red');

Multinomial Logistic Regression Model

รูปแบบการถดถอยโลจิสติกที่มีประโยชน์อีกรูปแบบหนึ่งคือการถดถอยโลจิสติกแบบพหุนามซึ่งเป้าหมายหรือตัวแปรตามสามารถมีได้ 3 ประเภทขึ้นไปโดยไม่เรียงลำดับ ได้แก่ ประเภทที่ไม่มีนัยสำคัญเชิงปริมาณ

การใช้งานใน Python

ตอนนี้เราจะใช้แนวคิดข้างต้นเกี่ยวกับการถดถอยโลจิสติกแบบพหุนามใน Python เพื่อจุดประสงค์นี้เรากำลังใช้ชุดข้อมูลจาก sklearn ชื่อหลัก

ขั้นแรกเราต้องนำเข้าไลบรารีที่จำเป็นดังนี้ -

Import sklearn
from sklearn import datasets
from sklearn import linear_model
from sklearn import metrics
from sklearn.model_selection import train_test_split

ต่อไปเราต้องโหลดชุดข้อมูลหลัก -

digits = datasets.load_digits()

ตอนนี้กำหนดคุณสมบัติเมทริกซ์ (X) และเวกเตอร์การตอบสนอง (y) ดังนี้ -

X = digits.data
y = digits.target

ด้วยความช่วยเหลือของโค้ดบรรทัดถัดไปเราสามารถแยก X และ y ออกเป็นชุดการฝึกอบรมและการทดสอบ -

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=1)

ตอนนี้สร้างวัตถุของการถดถอยโลจิสติกดังนี้ -

digreg = linear_model.LogisticRegression()

ตอนนี้ต้องฝึกโมเดลโดยใช้ชุดฝึกดังนี้ -

digreg.fit(X_train, y_train)

จากนั้นทำการคาดคะเนชุดการทดสอบดังนี้ -

y_pred = digreg.predict(X_test)

ถัดไปพิมพ์ความถูกต้องของแบบจำลองดังต่อไปนี้ -

print("Accuracy of Logistic Regression model is:",
metrics.accuracy_score(y_test, y_pred)*100)

เอาต์พุต

Accuracy of Logistic Regression model is: 95.6884561891516

จากผลลัพธ์ข้างต้นเราจะเห็นความแม่นยำของแบบจำลองของเราอยู่ที่ประมาณ 96 เปอร์เซ็นต์