Logistic Regression จัดกลุ่มแบบ Binary Classification ใน Machine Learning ด้วย Python 

Logistic Regression เป็นอัลกอริทึมหนึ่งใน Machine Learning ที่ใช้สำหรับปัญหาการจัดกลุ่มแบบ Binary Classification ซึ่งคือการทำนายว่าข้อมูลจะอยู่ในกลุ่มใดระหว่างสองกลุ่ม (โดยที่กลุ่มนี้มีความหมายตรงกับแต่ละปัญหาที่ต้องการแก้ไข)

โดย Logistic Regression จะใช้ประโยชน์จากการคำนวณค่าความน่าจะเป็น (probability) ว่าข้อมูลนั้นจะอยู่ในกลุ่มใด โดยทำการแปลงค่า linear regression output โดยใช้ฟังก์ชัน logistic function หรือ sigmoid function เพื่อให้ค่า output ของ Logistic Regression อยู่ในช่วง 0-1 (ซึ่งค่าอยู่ในช่วง 0.5 แสดงว่าความน่าจะเป็นเท่ากับ 50:50)

การใช้ Logistic Regression จะเหมาะสำหรับการจัดกลุ่มแบบ binary classification โดยที่ต้องการดูว่า ข้อมูลมีความเกี่ยวข้องกับกลุ่มที่หนึ่งหรือไม่ และมีความน่าจะเป็นเท่าไหร่ว่าข้อมูลจะอยู่ในกลุ่มนั้น ๆ และความน่าจะเป็นเท่าไหร่ว่าข้อมูลจะไม่อยู่ในกลุ่มนั้น ๆ

โดยที่การทำงานของ Logistic Regression จะแบ่งเป็น 3 ขั้นตอนหลัก ๆ คือ

  1. การเตรียมข้อมูล (Data Preparation)  ต้องแปลงข้อมูลให้อยู่ในรูปแบบที่เหมาะสมเพื่อให้ Logistic Regression สามารถใช้งานได้ กำหนดโมเดลโดยเลือกฟีเจอร์ที่เหมาะสมและกำหนดว่าตัวแปรตามฟีเจอร์จะมีผลต่อตัวแปรตามเป้าหมายอย่างไร
  2. การสร้างโมเดล (Model Building)  สร้างโมเดล Logistic Regression และทำการเทรนโมเดลด้วยข้อมูล training data เพื่อให้โมเดลสามารถทำนายความน่าจะเป็นได้ โมเดลจะถูกเทรนโดยใช้ชุดข้อมูลการเรียนรู้ เพื่อให้โมเดลมีความสามารถในการทำนายผลลัพธ์ที่แม่นยำ
  3. การใช้โมเดลทำนาย (Model Prediction)  ใช้โมเดล Logistic Regression ที่ได้สร้างและเทรนขึ้นมาแล้ว ในการทำนายความน่าจะเป็นของตัวแปรตามที่กำหนด โดยใช้ข้อมูล test data เพื่อวัดประสิทธิภาพของโมเดล โมเดลที่เทรนเสร็จสมบูรณ์แล้วจะถูกนำไปใช้ในการทำนายผลลัพธ์ของข้อมูลที่ไม่เคยเห็นมาก่อนโดยใช้ฟังก์ชันโพสเทอร์เชียล (sigmoid function) เพื่อแปลงค่าผลลัพธ์เป็นความน่าจะเป็นในการเป็นคลาสแต่ละคลาส

Logistic Regression เป็นอัลกอริทึมสำหรับการจำแนกประเภท (classification algorithm) ที่ใช้สำหรับการทำนายความน่าจะเป็นของผลลัพธ์เป็นค่า discrete ซึ่งจะมีค่าอยู่ในช่วง 0 ถึง 1 โดยทั่วไปจะใช้ในการจำแนกเป็น 2 กลุ่ม คือ positive class (1) และ negative class (0)

โดย Logistic Regression จะใช้สมการ logistic function (หรือ sigmoid function) เพื่อคำนวณค่าความน่าจะเป็น และนำไปใช้ในการจำแนกประเภท สมการ logistic function มีลักษณะดังนี้

    \[\sigma(z) = \frac{1}{1 + e^{-z}}\]

เมื่อ $z$ เป็นสมการเชิงเส้น (linear equation) ซึ่งสามารถเขียนได้เป็น

    \[z = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + ... + \beta_n x_n\]

โดยที่ $\beta_0, \beta_1, \beta_2, ..., \beta_n$ คือค่าสัมประสิทธิ์ (coefficients) ของโมเดล Logistic Regression และ $x_1, x_2, ..., x_n$ คือ feature ของข้อมูล

จากสมการ logistic function ข้างต้น จะได้ว่า ค่าความน่าจะเป็นของ positive class จะเท่ากับ

    \[P(y=1|x_1,x_2,...,x_n) = \sigma(\beta_0 + \beta_1 x_1 + \beta_2 x_2 + ... + \beta_n x_n)\]

ส่วน ค่าความน่าจะเป็นของ negative class จะเท่ากับ

    \[P(y=0|x_1,x_2,...,x_n) = 1 - \sigma(\beta_0 + \beta_1 x_1 + \beta_2 x_2 + ... + \beta_n x_n)\]

โดยที่ $y$ คือค่า target (ค่า output ที่ต้องการจะทำนาย) และ $x_1, x_2, ..., x_n$ คือ feature ของข้อมูล

จากสมการข้างต้นจะเห็นได้ว่า ค่าความน่าจะเป็นของ positive class และ negative class จะรวมกัน


ตัวอย่าง
การใช้ Logistic Regression ในการแยกกลุ่ม

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report

# สร้าง dataset ขึ้นมา
np.random.seed(0)
mean1 = np.array([0, 0])
cov1 = np.array([[1, 0.75], [0.75, 1]])
x1, y1 = np.random.multivariate_normal(mean1, cov1, 100).T
mean2 = np.array([2, 2])
cov2 = np.array([[1, -0.5], [-0.5, 1]])
x2, y2 = np.random.multivariate_normal(mean2, cov2, 100).T
X = np.vstack((np.vstack((x1, y1)).T, np.vstack((x2, y2)).T))
y = np.hstack((np.zeros(100), np.ones(100)))

# แบ่งข้อมูลเป็น training data และ testing data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# สร้างโมเดล Logistic Regression
logreg = LogisticRegression(penalty='l2', C=1.0, solver='lbfgs')

# เทรนโมเดลด้วยข้อมูล training data
logreg.fit(X_train, y_train)

# ทำนายค่าด้วยข้อมูล testing data
y_pred = logreg.predict(X_test)

# วัดประสิทธิภาพของโมเดล
print('Confusion matrix:')
print(confusion_matrix(y_test, y_pred))
print('Classification report:')
print(classification_report(y_test, y_pred))

# แสดงกราฟผลลัพธ์การทำนาย
colors = ['blue' if label == 0 else 'red' for label in y_pred]
plt.scatter(X_test[:,0], X_test[:,1], c=colors)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Prediction Result')
plt.show()

ผลลัพธ์ที่ได้ คือ

Confusion matrix:
[[26  3]
 [ 2 29]]
Classification report:
             precision    recall  f1-score   support

        0.0       0.93      0.90      0.91        29
        1.0       0.91      0.94      0.92        31

avg / total       0.92      0.92      0.92        60

จากตัวอย่าง เป็นการสร้างและเทรนโมเดล Logistic Regression ด้วยข้อมูลที่สร้างขึ้นมาเอง โดยมี features 2 ตัว คือ Feature 1 และ Feature 2 และมี label 2 คลาส คือ 0 และ 1

หลังจากแบ่งข้อมูลออกเป็น training data และ testing data ด้วยฟังก์ชัน train_test_split โมเดล Logistic Regression ถูกสร้างขึ้นด้วยการเลือกใช้ penalty=’l2′, C=1.0, solver=’lbfgs’ โดย penalty และ C ใช้เพื่อกำหนด regularization และ solver เป็นวิธีการเรียนรู้ของโมเดล

หลังจากเทรนโมเดลแล้ว โมเดลถูกนำไปใช้ทำนายค่าด้วยข้อมูล testing data โดยการเรียกใช้ฟังก์ชัน predict และผลลัพธ์ที่ได้จะถูกใช้วัดประสิทธิภาพของโมเดลด้วย confusion matrix และ classification report

โดยเมื่อได้ผลลัพธ์การทำนายจากโมเดลแล้ว ผลลัพธ์นั้นถูกนำมาแสดงบนกราฟ โดยใช้ scatter plot โดยจุดสีฟ้าแทนคลาส 0 และจุดสีแดงแทนคลาส 1

ทำการสร้าง dataset ขึ้นมาจากการสุ่มค่าจาก distribution สองแบบ ซึ่งแต่ละแบบมีจำนวน 100 ตัว และมี feature สองตัวคือ feature 1 และ feature 2 โดยแบ่งเป็นกลุ่มหนึ่ง โดยกำหนดให้กลุ่มแรกมีค่าเป็น 0 และกลุ่มที่สองมีค่าเป็น 1

จากที่ได้ทำการแบ่งข้อมูลออกเป็น training data และ testing data โดยกำหนดให้ขนาดของ testing data เป็น 30% ของข้อมูลทั้งหมด และใช้ random state เพื่อให้ผลการสุ่มของแบ่งข้อมูลเหมือนกันทุกครั้งที่เรียกใช้

จากนั้นเราสร้างโมเดล Logistic Regression ด้วยค่าพารามิเตอร์ penalty=’l2′, C=1.0, solver=’lbfgs’ และเทรนโมเดลด้วยข้อมูล training data

เมื่อเทรนโมเดลเสร็จสิ้น เราทำนายค่าด้วยข้อมูล testing data และวัดประสิทธิภาพของโมเดลด้วย confusion matrix และ classification report

สุดท้าย เราแสดงผลลัพธ์การทำนายด้วยการพล็อตกราฟ feature 1 และ feature 2 ของข้อมูล testing data โดยใช้สีเขียวแทนกลุ่มที่พยายามทำนายถูกต้อง และสีแดงแทนกลุ่มที่พยายามทำนายผิด

ตัวอย่าง การใช้ Logistic Regression ใน Machine Learning และแสดงกราฟผลลัพธ์

โดย dataset ที่สร้างขึ้นมาเป็นข้อมูลลูกค้าในร้านค้าออนไลน์ โดยมี feature ดังนี้

  • รายได้ (Income): ข้อมูลเป็นตัวเลขจำนวนเต็ม โดยมีค่าตั้งแต่ 20,000 บาท ถึง 200,000 บาท
  • อายุ (Age): ข้อมูลเป็นตัวเลขจำนวนเต็ม โดยมีค่าตั้งแต่ 18 ถึง 70 ปี
  • เพศ (Gender): ข้อมูลเป็น binary (0 = หญิง, 1 = ชาย)
  • สถานะการมีบัตรเครดิต (Credit): ข้อมูลเป็น binary (0 = ไม่มีบัตรเครดิต, 1 = มีบัตรเครดิต)

โดยข้อมูลลูกค้านี้จะถูกใช้ในการวิเคราะห์ว่าลูกค้าที่มีอายุเยอะและรายได้สูงจะมีความน่าจะเป็นที่จะซื้อสินค้ามากกว่าลูกค้าที่มีอายุน้อยและรายได้ต่ำ และเพศของลูกค้าจะส่งผลต่อการซื้อสินค้าหรือไม่

import numpy as np
import pandas as pd

np.random.seed(0)

# สร้างข้อมูลรายได้และอายุ
income = np.random.randint(20000, 200000, 1000)
age = np.random.randint(18, 70, 1000)

# สร้างข้อมูลเพศ
gender = np.random.randint(0, 2, 1000)

# สร้างข้อมูลสถานะการมีบัตรเครดิต
credit = np.random.randint(0, 2, 1000)

# รวมข้อมูลเข้าด้วยกัน
data = pd.DataFrame({'income': income, 'age': age, 'gender': gender, 'credit': credit})

# สร้างคอลัมน์ target โดยกำหนดให้ ถ้า income > 100000 และมีบัตรเครดิตจะเป็น 1 ถ้าไม่จะเป็น 0
data['target'] = np.where((data['income'] > 100000) & (data['credit'] == 1), 1, 0)

# แสดงตัวอย่างข้อมูล
print(data.head())


from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# ใช้ train_test_split เพื่อแบ่งข้อมูลเป็น train set และ test set
X = data[['income', 'age', 'gender', 'credit']]
y = data['target']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# สร้างโมเดล logistic regression และ fit กับ train set
logreg = LogisticRegression()
logreg.fit(X_train, y_train)

# ทำการทำนายค่า target บน test set 
y_pred = logreg.predict(X_test)

# วัดประสิทธิภาพของโมเดล
from sklearn.metrics import confusion_matrix, classification_report
print('Confusion matrix:')
print(confusion_matrix(y_test, y_pred))
print('Classification report:')
print(classification_report(y_test, y_pred))

# แสดงกราฟผลลัพธ์การทำนาย
import matplotlib.pyplot as plt
colors = ['blue' if label == 0 else 'red' for label in y_test]
plt.scatter(X_test['income'], X_test['age'], c=colors)
plt.xlabel('Income')
plt.ylabel('Age')
plt.title('Customer Targeting')
plt.show()

ผลลัพธ์ที่ได้ คือ

   age  credit  gender  income  target
0   47       1       0   63567       0
1   32       0       1  193685       0
2   29       1       1  137952       1
3   27       0       1  196963       0
4   29       0       0  172315       0

Confusion matrix:
[[177  36]
 [ 56  31]]
 
Classification report:
             precision    recall  f1-score   support

          0       0.76      0.83      0.79       213
          1       0.46      0.36      0.40        87

avg / total       0.67      0.69      0.68       300

จากตัวอย่าง เป็นการสร้างข้อมูลสำหรับการวิเคราะห์การเป้าหมายลูกค้า โดยมีการสร้างข้อมูลเงินเดือน, อายุ, เพศ และสถานะการมีบัตรเครดิตของลูกค้า จากนั้นกำหนดคอลัมน์ target โดยถ้าลูกค้ามีรายได้มากกว่า 100000 และมีบัตรเครดิต จะเป็น 1 ถ้าไม่มีจะเป็น 0

หลังจากนั้นใช้ train_test_split เพื่อแบ่งข้อมูลเป็น train set และ test set โดยใช้โมเดล Logistic Regression เพื่อสร้างแบบจำลอง และทำนายค่า target บน test set โดยใช้ confusion matrix และ classification report เพื่อวัดประสิทธิภาพของโมเดล และสุดท้ายใช้ matplotlib เพื่อแสดงผลการวิเคราะห์บนกราฟ โดยจุดสีน้ำเงินและแดงแทนลูกค้าที่ target เป็น 0 และ 1 ตามลำดับ ในแกน x แสดงข้อมูลเงินเดือน และแกน y แสดงข้อมูลอายุ ชื่อกราฟเรียกว่า Customer Targeting

การสร้างและใช้โมเดล Logistic Regression เพื่อทำนายว่าลูกค้าจะเป็นกลุ่มที่เหมาะสมกับการโฆษณาสินค้าหรือไม่ โดยใช้ข้อมูลเกี่ยวกับรายได้, อายุ, เพศและสถานะการมีบัตรเครดิตของลูกค้า เพื่อทำนายค่า target ซึ่งเป็น binary classification โดยใช้ confusion matrix และ classification report เพื่อวัดประสิทธิภาพของโมเดล และใช้ scatter plot เพื่อแสดงแผนภูมิแบบกราฟิกที่แสดงความสัมพันธ์ระหว่างรายได้กับอายุของลูกค้า โดยจะมีจุดสีน้ำเงินและแดงแทนกลุ่มลูกค้าที่ไม่เหมาะสมและเหมาะสมตามลำดับ