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ứ k .
- σ 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:
D k (x) = x * (μk / σ 2 ) - (μk 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ại. Cá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ập, tổ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ẩm. Cá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ính, thu 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 npBướ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 Species, biế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.9777777777777779Có 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()
Nhận xét
Đăng nhận xét