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 ขั้นตอนหลัก ๆ คือ
- การเตรียมข้อมูล (Data Preparation) ต้องแปลงข้อมูลให้อยู่ในรูปแบบที่เหมาะสมเพื่อให้ Logistic Regression สามารถใช้งานได้ กำหนดโมเดลโดยเลือกฟีเจอร์ที่เหมาะสมและกำหนดว่าตัวแปรตามฟีเจอร์จะมีผลต่อตัวแปรตามเป้าหมายอย่างไร
- การสร้างโมเดล (Model Building) สร้างโมเดล Logistic Regression และทำการเทรนโมเดลด้วยข้อมูล training data เพื่อให้โมเดลสามารถทำนายความน่าจะเป็นได้ โมเดลจะถูกเทรนโดยใช้ชุดข้อมูลการเรียนรู้ เพื่อให้โมเดลมีความสามารถในการทำนายผลลัพธ์ที่แม่นยำ
- การใช้โมเดลทำนาย (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 มีลักษณะดังนี้
เมื่อ เป็นสมการเชิงเส้น (linear equation) ซึ่งสามารถเขียนได้เป็น
โดยที่ คือค่าสัมประสิทธิ์ (coefficients) ของโมเดล Logistic Regression และ คือ feature ของข้อมูล
จากสมการ logistic function ข้างต้น จะได้ว่า ค่าความน่าจะเป็นของ positive class จะเท่ากับ
ส่วน ค่าความน่าจะเป็นของ negative class จะเท่ากับ
โดยที่ คือค่า target (ค่า output ที่ต้องการจะทำนาย) และ คือ 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 เพื่อแสดงแผนภูมิแบบกราฟิกที่แสดงความสัมพันธ์ระหว่างรายได้กับอายุของลูกค้า โดยจะมีจุดสีน้ำเงินและแดงแทนกลุ่มลูกค้าที่ไม่เหมาะสมและเหมาะสมตามลำดับ