Bài 7: Giới thiệu về Phân tích Biệt thức Tuyến tính (Linear Discriminant Analysis)


Khi chúng ta có một tập hợp các biến dự báo và chúng ta muốn phân loại biến phản hồi thành một trong hai lớp, chúng ta thường sử dụng hồi quy logistic.

Ví dụ: chúng ta có thể sử dụng hồi quy logistic trong trường hợp sau:

  • Sử  dụng điểm tín dụng  và  số dư ngân hàng  để dự đoán liệu một khách hàng nhất định có vỡ nợ hay không. (Biến phản hồi = “Có” hoặc “Không”)

Tuy nhiên, khi một biến phản hồi có nhiều hơn hai lớp khả dĩ thì chúng ta thường sử dụng một phương pháp được gọi là  phân tích biệt  số tuyến tính, thường được gọi là LDA.

Ví dụ: chúng ta có thể sử dụng LDA trong trường hợp sau:

  • Sử dụng  điểm mỗi trận đấu và số lần ném bóng bật bảng mỗi trận để dự đoán liệu một cầu thủ bóng rổ có được nhận vào một trong ba đội ở 3 mức: Mức 1, Mức 2 hay Mức 3 hay không.

Mặc dù LDA và mô hình hồi quy logistic đều được sử dụng để phân lớp , nhưng  LDA ổn định hơn nhiều so với hồi quy logistic khi đưa ra dự đoán cho nhiều lớp và do đó là thuật toán được ưu tiên sử dụng khi biến phản hồi có thể có nhiều hơn hai lớp.

LDA cũng hoạt động tốt hơn khi kích thước mẫu nhỏ so với hồi quy logistic, điều này làm cho nó trở thành một phương pháp được ưu tiên sử dụng khi chúng ta không thể thu thập các mẫu lớn.

Cách xây dựng mô hình LDA

LDA dựa trên các giả định sau về một tập dữ liệu nhất định:

(1) Các giá trị của mỗi biến dự báo có phân phối chuẩn.

(2) Các biến dự báo có cùng một phương sai . Điều này hầu như không bao giờ xảy ra trong dữ liệu thế giới thực, vì vậy chúng ta thường chia tỷ lệ mỗi biến để chúng có cùng phương sai và giá trị trung bình trước khi thực sự phù hợp với mô hình LDA.

Khi các giả định này được đáp ứng, mô hình LDA ước tính các giá trị sau:

  • μ k : Giá trị trung bình của tất cả các quan sát huấn luyện từ lớp thứ .
  • σ 2 : Giá trị trung bình có trọng số của các phương sai mẫu đối với mỗi lớp trong số  k lớp.
  • πk : Tỷ lệ của các quan sát huấn luyện thuộc lớp thứ k.

Sau đó, mô hình LDA sẽ đưa các hệ số này vào công thức sau và gán mỗi quan sát X = x cho mỗi lớp:

k (x) = x * (μk / σ 2 ) - (μ2 / 2σ 2 ) + log (πk )

Lưu ý rằng LDA được gọi là tuyến tính vì giá trị được tạo ra bởi hàm trên đến từ kết quả của các  hàm tuyến tính theo x.

Chuẩn bị dữ liệu cho LDA

Để thực hiện mô hình LDA, dữ liệu cần đáp ứng các yêu cầu sau, trước khi áp dụng mô hình này:

1. Biến phản hồi có tính phân loạiCác mô hình LDA được thiết kế để sử dụng cho các bài toán phân loại, tức là biến phản hồi có thể được phân hoạch vào các lớp.

2. Các biến dự báo tuân theo phân phối chuẩn . Trước tiên, cần kiểm tra xem mỗi biến dự báo là có phân phối chuẩn. Nếu không đúng như vậy, trước tiên ta cần chuyển đổi dữ liệu để làm cho chúng có phân phối chuẩn.

3. Mỗi biến dự báo có cùng một phương sai . Như đã đề cập ở trên, LDA giả định rằng mỗi biến dự báo có cùng phương sai. Vì điều này hiếm khi xảy ra trong thực tế, nên chúng ta cần chia tỷ lệ từng biến trong tập dữ liệu sao cho nó có giá trị trung bình là 0 và độ lệch chuẩn là 1.

4. Giải thích cho các trường hợp ngoại lệ cực đoan. Đảm bảo kiểm tra các giá trị ngoại lai cực đoan trong tập dữ liệu trước khi áp dụng LDA. Thông thường, ta có thể kiểm tra các điểm ngoại lệ một cách trực quan bằng cách vẽ biểu đồ boxplot hay scatter.

Ví dụ về việc sử dụng phân tích phân biệt tuyến tính

Các mô hình LDA được ứng dụng trong rất nhiều lĩnh vực trong đời sống thực tế. 

Ví dụ:

1. Tiếp thị . Các công ty bán lẻ thường sử dụng mô hình LDA để phân hoạch người mua sắm thành các lớp. Chẳng hạn, có thể xây dựng mô hình LDA để dự đoán xem một người mua sắm sẽ là người chi tiêu thấp, người chi tiêu trung bình hay người chi tiêu cao bằng cách sử dụng các biến số dự đoán như  thu nhậptổng chi tiêu hàng năm và quy mô hộ gia đình .

2. Y tế . Các bệnh viện và nhóm nghiên cứu y tế thường sử dụng LDA để dự đoán liệu một nhóm tế bào bất thường nhất định có khả năng dẫn đến bệnh nhẹ, trung bình hoặc nặng hay không.

3. Phát triển sản phẩmCác công ty có thể xây dựng mô hình LDA để dự đoán liệu một người tiêu dùng nhất định sẽ sử dụng sản phẩm của công ty hàng ngày, hàng tuần, hàng tháng hoặc hàng năm dựa trên nhiều biến số dự báo như  giới tínhthu nhập hàng năm và  tần suất sử dụng sản phẩm tương tự.

4. Hệ sinh thái. Các nhà nghiên cứu có thể xây dựng các mô hình LDA để dự đoán xem một rạn san hô sẽ có sức sống nhìn chung là tốt, trung bình, xấu hoặc có nguy cơ tuyệt chủng hay không dựa trên nhiều biến số dự báo như kích thước, độ ô nhiễm hàng năm và tuổi tác của rạn san hô đó.

Phân tích biệt thức tuyến tính với Python 

Bước 1: Tải các thư viện cần thiết

Đầu tiên, chúng ta sẽ tải các chức năng và thư viện cần thiết:

from sklearn.model_selection import train_test_split
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.model_selection import cross_val_score
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis 
from sklearn import datasets
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

Bước 2: Tải dữ liệu

Dưới đây, chúng ta sẽ sử dụng tập dữ liệu iris từ thư viện sklearn. Đoạn mã sau đây cho thấy cách tải tập dữ liệu này và chuyển đổi nó thành DataFrame để dễ dàng làm việc hơn:

#load iris dataset
iris = datasets.load_iris()

#convert dataset to pandas DataFrame
df = pd.DataFrame(data = np.c_[iris['data'], iris['target']],
                 columns = iris['feature_names'] + ['target'])
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)
df.columns = ['s_length', 's_width', 'p_length', 'p_width', 'target', 'species']

#view first six rows of DataFrame
df.head()

   s_length  s_width  p_length  p_width  target species
0       5.1      3.5       1.4      0.2     0.0  setosa
1       4.9      3.0       1.4      0.2     0.0  setosa
2       4.7      3.2       1.3      0.2     0.0  setosa
3       4.6      3.1       1.5      0.2     0.0  setosa
4       5.0      3.6       1.4      0.2     0.0  setosa

#find how many total observations are in dataset
len(df.index)

150

Tập dữ liệu trên có 150 đối tượng.

Đối với ví dụ này, chúng ta sẽ xây dựng một mô hình phân tích biệt thức  tuyến tính để phân lớp các bông hoa nhất định thuộc về loài nào.

Chúng ta sẽ sử dụng các biến dự báo sau trong mô hình:

  • Chiều dài của đài hoa
  • Chiều rộng của đài hoa
  • Chiều dài cánh hoa
  • Chiều rộng cánh hoa

Và chúng ta sẽ sử dụng chúng để dự đoán biến phản hồi Speciesbiến này sử dụng ba lớp tiềm năng sau:

  • setosa
  • versicolor
  • virginica

Bước 3: Tinh chỉnh mô hình LDA

Tiếp theo, chúng ta sẽ tin chỉnh mô hình LDA cho dữ liệu, bằng cách sử dụng hàm LinearDiscriminantAnalsyis  từ thư viện sklearn:

#define predictor and response variables
X = df[['s_length', 's_width', 'p_length', 'p_width']]
y = df['species']

#Fit the LDA model
model = LinearDiscriminantAnalysis()
model.fit(X, y)

Bước 4: Sử dụng mô hình để đưa ra dự đoán

Sau khi tinh chỉnh mô hình, chúng ta có thể đánh giá mô hình hoạt động như thế nào bằng cách sử dụng xác thực chéo k-lần phân tầng lặp lại.

Đối với ví dụ trên, chúng ta sử dụng 10 lần gấp và 3 lần lặp lại như sau:

#Define method to evaluate model
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)

#evaluate model
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
print(np.mean(scores))   

0.9777777777777779

Có thể thấy rằng mô hình có độ chính xác trung bình là  97,78% .

Sử dụng mô hình để dự đoán 1 bông hoa thuộc lớp nào, dựa trên các giá trị đầu vào như sau:

#define new observation
new = [5, 3, 1, .4]

#predict which class the new observation belongs to
model.predict([new])

array(['setosa'], dtype='<U10')

Có thể thấy rằng mô hình dự đoán cho giá trị của biến quan sát cho trong đoạn code trên thuộc về loài setosa .

Bước 5: Mô tả kết quả

Cuối cùng, chúng ta sẽ tạo một biểu đồ LDA, để xem xét các biệt số tuyến tính của mô hình và minh hoạ nó đã phân tách ba loài khác nhau trong tập dữ liệu của chúng ta như thế nào:

#define data to plot
X = iris.data
y = iris.target
model = LinearDiscriminantAnalysis()
data_plot = model.fit(X, y).transform(X)
target_names = iris.target_names

#create LDA plot
plt.figure()
colors = ['red', 'green', 'blue']
lw = 2
for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(data_plot[y == i, 0], data_plot[y == i, 1], alpha=.8, color=color,
                label=target_name)

#add legend to plot
plt.legend(loc='best', shadow=False, scatterpoints=1)

#display LDA plot
plt.show()

Có thể tìm thấy đoạn mã Python hoàn chỉnh, được nói trong bài  này ở [https://github.com/Statology/Python-Guides/blob/main/linear_discriminant_analysis]





Nhận xét

Bài đăng phổ biến từ blog này

Hướng Dẫn: TẠO GIA SƯ AI HỖ TRỢ HỌC TIN HỌC

10 CÁCH ĐẶT CÂU HỎI/HƯỚNG DẪN CHO HỌC SINH ĐỂ HỌC TẬP TỐT HƠN

AI chatbot hỗ trợ cho GV lên kế hoạch dạy học STEAM theo quy trinh 5E (GV mầm non và GV Tiểu học)