messenger_logo
Liên hệ qua Messenger
SciEco

Tích hợp stata và python: ứng dụng máy học với support vector machines

I
IEFPA
Ngày viết: 23/03/2026

Machine learning, deep learning và trí tuệ nhân tạo là tập hợp các thuật toán dùng để nhận diện các mẫu trong dữ liệu. Các thuật toán này thường có tên gọi khá đặc biệt như random forests, neural networks hay spectral clustering. Bài viết này trình bày cách sử dụng một trong những thuật toán phổ biến mang tên Support Vector Machines hay còn được gọi tắt là SVM. Mục tiêu là ứng dụng mô hình SVM để phân biệt những người có khả năng mắc bệnh tiểu đường và những người không mắc bệnh thông qua hai biến số là tuổi và mức HbA1c. Tuổi được tính bằng năm, còn HbA1c là chỉ số xét nghiệm máu đo lường mức độ kiểm soát đường huyết. Mô hình SVM sẽ dự đoán rằng những người lớn tuổi với mức HbA1c cao có nguy cơ mắc bệnh tiểu đường cao hơn, trong khi những người trẻ tuổi với mức HbA1c thấp ít có nguy cơ mắc bệnh hơn.

Tải, gộp và làm sạch dữ liệu bằng Stata

Dữ liệu được sử dụng lấy từ Khảo sát Kiểm tra Sức khỏe và Dinh dưỡng Quốc gia Hoa Kỳ. Cụ thể, biến số tuổi trích xuất từ tập dữ liệu nhân khẩu học, chỉ số HbA1c từ dữ liệu hemoglobin và trạng thái bệnh từ dữ liệu tiểu đường. Quá trình bắt đầu bằng việc tải các tệp gốc từ trang web, lưu thành các tập dữ liệu Stata cục bộ và tiến hành gộp chúng lại với nhau. Sau khi gộp, các biến số sẽ được đổi tên và mã hóa lại cho đồng nhất. Những quan sát có giá trị bị khuyết sẽ được loại bỏ hoàn toàn để đảm bảo chất lượng cho bước huấn luyện mô hình.

1import sasxport5 "https://wwwn.cdc.gov/Nchs/Nhanes/2015-2016/DEMO_I.XPT", clear
2save age.dta, replace
3import sasxport5 "https://wwwn.cdc.gov/Nchs/Nhanes/2015-2016/GHB_I.XPT", clear
4save glucose.dta, replace
5import sasxport5 "https://wwwn.cdc.gov/Nchs/Nhanes/2015-2016/DIQ_I.XPT", clear
6save diabetes, replace
7merge 1:1 seqn using "glucose.dta"
8drop _merge
9merge 1:1 seqn using "age.dta"
10rename ridageyr age
11rename lbxgh HbA1c
12rename diq010 diabetes
13recode diabetes (1 = 1) (2/3 = 0) (9=.)
14keep diabetes age HbA1c
15drop if missing(diabetes, age, HbA1c)
16save diabetes, replace
17erase age.dta
18erase glucose.dta

Mở và trực quan hóa dữ liệu gốc bằng Python

Sau khi dữ liệu được làm sạch bằng Stata, bước tiếp theo là nạp tập dữ liệu này vào một data frame thông qua thư viện pandas. Phương thức đọc dữ liệu được cấu hình để nhận diện các biến số phân loại dưới dạng số học thay vì chuyển đổi chúng thành nhãn văn bản, đồng thời duy trì nguyên vẹn kiểu dữ liệu gốc. Trong thuật ngữ máy học, biến số tuổi và HbA1c được nhóm vào một ma trận tính năng độc lập, trong khi trạng thái bệnh tiểu đường đóng vai trò là biến số mục tiêu phụ thuộc.

Biểu đồ phân tán được tạo ra bằng matplotlib sẽ ánh xạ biến số tuổi lên trục hoành và biến số HbA1c lên trục tung. Điểm dữ liệu của những người không mắc bệnh được biểu diễn bằng màu xanh dương, trong khi những người mắc bệnh được hiển thị bằng màu đỏ sẫm.

1import pandas as pd
2import matplotlib.pyplot as plt
3import matplotlib.colors as mcolors
4data = pd.read_stata('diabetes.dta',
5convert_categoricals=False,
6preserve_dtypes=True,
7convert_missing=False)
8X = data[['age','HbA1c']]
9y = data['diabetes']
10plt.scatter(X['age'], X['HbA1c'],
11c=y,
12cmap = mcolors.ListedColormap(["navy", "darkred"]))
13plt.xlabel('Age (years)')
14plt.ylabel('HbA1c')
15plt.xticks((12,20,30,40,50,60,70,80))
16plt.yticks((4,6,8,10,12,14,16))
17plt.title('Diabetes status by Age and HbA1c')
18plt.savefig("scatterplot.png")

Phân chia dữ liệu và tìm kiếm tham số tối ưu

Một nguyên tắc cốt lõi trong xây dựng mô hình là phân chia tập dữ liệu hiện có thành tập huấn luyện và tập kiểm tra. Việc sử dụng sáu mươi phần trăm dữ liệu để huấn luyện và giữ lại bốn mươi phần trăm để kiểm tra giúp ngăn chặn hiện tượng quá khớp, đảm bảo mô hình có khả năng tổng quát hóa trên các tập dữ liệu mới.

Sau khi chia dữ liệu, quá trình thiết lập mô hình SVC bắt đầu. Để chọn ra các tham số tối ưu cho hàm hạt nhân đa thức, phương pháp tìm kiếm lưới kết hợp với kiểm chứng chéo mười thư mục được áp dụng. Kỹ thuật này tự động thử nghiệm nhiều tổ hợp tham số khác nhau, chia nhỏ tập huấn luyện để đánh giá chéo và tính toán điểm chính xác trung bình. Kết quả tìm kiếm chỉ ra rằng mô hình đạt độ khớp hoàn hảo nhất khi tham số điều chuẩn bằng ba và bậc của đa thức cũng bằng ba.

1from sklearn.model_selection import train_test_split
2from sklearn import svm
3from sklearn.model_selection import cross_val_score
4from sklearn.model_selection import GridSearchCV
5X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4,
6random_state=0)
7model = svm.SVC(kernel='poly')
8parameters = {'degree':[1,2,3], 'C':[1,2,3]}
9poly_svc = GridSearchCV(model,
10parameters,
11cv=10,
12scoring='accuracy').fit(X_train, y_train)
13poly_svc.fit(X_train,y_train)
14print(poly_svc.best_params_)

Đánh giá mô hình và vẽ đường ranh giới quyết định

Sử dụng tập tham số tối ưu vừa tìm được, mô hình SVM chính thức được huấn luyện và đưa vào thử nghiệm trên tập dữ liệu kiểm tra. Kết quả trả về cho thấy bộ phân loại đạt độ chính xác lên đến chín mươi ba phần trăm trong việc dự đoán trạng thái mắc bệnh tiểu đường.

Để cung cấp cái nhìn trực quan về cách mô hình hoạt động, một biểu đồ đường viền được xây dựng dựa trên lưới tọa độ hai chiều. Phương thức dự đoán quét qua từng điểm trên không gian lưới và phân loại chúng vào vùng nguy cơ hoặc vùng an toàn. Các điểm dữ liệu gốc sau đó được phủ lên trên ranh giới quyết định này, minh họa rõ ràng cách thuật toán phân chia không gian không tuyến tính thành các khu vực phân loại rành mạch.

1import numpy as np
2poly_svc = svm.SVC(kernel='poly', degree=3, C=3).fit(X_train, y_train)
3scores = cross_val_score(poly_svc, X_test, y_test, cv=10, scoring='accuracy')
4h = 0.1
5x_min, x_max = X['age'].min() - 1, X['age'].max() + 1
6y_min, y_max = X['HbA1c'].min() - 1, X['HbA1c'].max() + 1
7xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
8np.arange(y_min, y_max, h))
9Z = poly_svc.predict(np.c_[xx.ravel(), yy.ravel()])
10Z = Z.reshape(xx.shape)
11plt.contourf(xx, yy, Z,
12cmap = mcolors.ListedColormap(["dodgerblue", "red"]),
13alpha=0.8)
14plt.scatter(X['age'], X['HbA1c'],
15c=y,
16cmap = mcolors.ListedColormap(["navy", "darkred"]))
17plt.xlabel('Age (years)')
18plt.ylabel('HbA1c')
19plt.xlim(xx.min(), xx.max())
20plt.ylim(yy.min(), yy.max())
21plt.xticks((12,20,30,40,50,60,70,80))
22plt.yticks((4,6,8,10,12,14,16))
23plt.title('Diabetes status by Age and HbA1c')
24plt.savefig("contourplot.png")

✨ Giá trị cốt lõi: Sự kết hợp giữa khả năng xử lý dữ liệu mạnh mẽ của Stata và hệ sinh thái thuật toán tiên tiến của Python mở ra một quy trình làm việc liền mạch. Kỹ thuật kiểm chứng chéo giúp loại bỏ rủi ro lệch mô hình do sự phân bổ ngẫu nhiên của dữ liệu, tạo ra một ranh giới quyết định không tuyến tính phản ánh sát thực tế lâm sàng của tập dữ liệu y tế.

Bài tập ứng dụng: Nếu bạn muốn thay đổi mô hình SVM từ việc sử dụng hàm hạt nhân đa thức sang hàm hạt nhân cơ sở xuyên tâm, bạn sẽ phải thay đổi tham số cấu hình nào trong không gian tìm kiếm lưới và điều này sẽ tác động ra sao đến độ cong của ranh giới quyết định trên không gian hai chiều?


Bài viết khác
Chúng ta đã làm quen với các khái niệm cơ bản về dược động học và dược lực học. Hôm nay, chúng ta sẽ ứng dụng những kiến thức đó vào bộ đôi kháng sinh piperacillin/tazobactam và vi khuẩn Pseudomonas. Gần đây, một tuyên bố của FDA vào tháng hai năm 2024 đã chỉ ra rằng đối với điểm gãy phụ thuộc liều nhạy cảm là 16 mcg/mL, chúng ta nên sử dụng liều 4.5g mỗi sáu giờ truyền kéo dài trong ba giờ. Lý do là vì phác đồ chuẩn 4.5g truyền tĩnh mạch mỗi sáu giờ trong vòng nửa giờ không đủ để đạt PTA lớn hơn 90 phần trăm. Tuyên bố này cũng đề cập đến một hạn chế khi sử dụng chỉ số thời gian nồng độ thuốc tự do lớn hơn mic đạt 50 phần trăm để tính toán PTA, một chỉ số chưa được kiểm chứng đầy đủ cho Pseudomonas. Đây là cơ hội tuyệt vời để chúng ta tự mình kiểm chứng điều này thông qua dữ liệu. Xây dựng mô hình dược động học quần thể Đầu tiên, chúng ta cần thu thập các thông số popPK, xây dựng mô hình, thực hiện mô phỏng và trực quan hóa PTA. Chúng ta sẽ dựa trên một phân tích gộp về dược động học cho piperacillin/tazobactam trên nhiều nhóm bệnh nhân khác nhau, từ trẻ sinh non đến người cao tuổi. Mô hình gộp này phức tạp và tinh vi hơn rất nhiều so với các mô hình đơn lẻ. Dưới đây là đoạn mã khởi tạo mô hình cơ bản sử dụng ngôn ngữ R và gói mrgsolve.
Chúng ta sẽ cùng tìm hiểu cách ước lượng tác động can thiệp trung bình cho mô hình trung bình mũ với một biến can thiệp nội sinh. Đây là một bài toán ước lượng hai bước, trong đó bước thứ nhất tương ứng với mô hình can thiệp và bước thứ hai là mô hình kết quả. Khác với các mô hình có hàm hợp lý tách rời, do biến can thiệp mang tính nội sinh, hàm hợp lý của mô hình này không thể tách rời. Chúng ta sẽ sử dụng phương pháp mô men tổng quát thông qua lệnh gmm để giải quyết bài toán này và thu được sai số chuẩn cùng các tác động cận biên chính xác nhất. Mô hình khung kết quả tiềm năng Bắt đầu với khung kết quả tiềm năng để xác định tác động can thiệp trung bình. Đối với mỗi mức độ can thiệp, sẽ có một kết quả mà chúng ta quan sát được nếu một đối tượng nhận mức can thiệp đó. Khi có một kết quả tuân theo phân phối trung bình mũ và có hai mức độ can thiệp, chúng ta có thể chỉ định cách các giá trị trung bình của kết quả tiềm năng được tạo ra từ các biến độc lập và phần dư. Các tham số bao gồm các hệ số chặn không đổi và hệ số hồi quy của biến độc lập. Cần lưu ý rằng phân phối của kết quả tiềm năng có thể là Poisson, lognormal hoặc một phân phối bất kỳ khác có trung bình mũ. Biến can thiệp được quan sát dưới hai trạng thái: được can thiệp hoặc không được can thiệp. Sai số của kết quả tiềm năng có tương quan với việc chỉ định can thiệp. Việc can thiệp được xác định bởi các biến độc lập trong một hồi quy probit, với sai số tuân theo phân phối chuẩn tắc. Chúng ta coi biến can thiệp là nội sinh bằng cách cho phép sai số của kết quả tiềm năng tương quan với sai số của mô hình can thiệp. Giả định rằng phương sai của các sai số không quan sát được là như nhau cho cả nhóm đối chứng và nhóm can thiệp, đồng thời mức độ tương quan của chúng với sai số can thiệp cũng bằng nhau.
SciEco
Science for Economics
Định hướng đào tạo phân tích dữ liệu, xây dựng chính sách, tối ưu hoá danh mục tài chính cá nhân và dự báo thị trường.
Liên hệ
Địa chỉ: Số 60, ngõ 41, Phố Thái Hà, Trung Liệt, Đống Đa, Hà Nội (Google Map)
Email: science.for.economics@gmail.com
Hotline: 03.57.94.7680 (Mrs. Hà)
Mạng xã hội