[DA-DS] Triển khai mô hình dự báo đơn giản (Chương 1/2)

Chào các member Mì AI, hôm nay chúng ta sẽ cùng tìm hiểu cách triển khai mô hình dự báo đơn giản bằng Python. Chú ý đây hoàn toàn là ghi chép trong thực tế làm việc nên nếu có gì sai, các cao thủ góp ý giúp để hoàn thiện nhé.

Trong bài viết số 4 chúng ta sẽ tiếp cận việc triển khai một mô hình dự báo tuyến tính Linear Regression. Đây là mô hình được sử dụng nhiều, có tính ứng dụng cao. Trước khi vào bài viết số 4, mình tóm tắt qua một chút về các nội dung chúng ta đã đi qua trong 3 bài trước đây:

Bây giờ chúng ta bước sang bài số 4 để trải nghiệm việc xây dựng một mô hình dự báo tuyến tính. Đầu tiên chúng ta cùng xem qua định nghĩa của Hồi quy tuyến tính xem nó là gì?

Data của bài này các bạn tải tại đây.

Phần 1 – Hồi quy tuyến tính là gì?

Hồi quy tuyến tính là một phương pháp để dự đoán biến phụ thuộc (Y) dựa trên giá trị của 1 hoặc nhiều biến độc lập (X), thông qua hàm tuyến tính (linear).

hồi quy tuyến tính

Được biểu diễn bằng biểu thức: Y = β₀ + β₁x + β₂x + … + βᵢx + Ɛ

Trong đó:

  • Y: là biến phụ thuộc chịu ảnh hưởng bởi X
  • X: là biến độc lập tác động lên biến phụ thuộc Y
  • β₀ + β₁x + β₂x + … + βᵢx: Là hàm hồi quy nhiều biến số, số lượng biến X sẽ phụ thuộc vào hàm hồi quy ta xây dựng
  • β₀: là giá trị ước lượng của Y khi X đạt giá trị = 0
  • βᵢ: thể hiện độ dốc của đường hồi quy tuyến tính, đo mức độ thay đổi của Y khi X thay đổi 1 đơn vị.
  • Ɛ: là phần dư, là sai số, do các yếu tố khác không tính toán được tác động lên giá trị của Y

Phần 2 – Các bước triển khai mô hình dự báo

Nào bây giờ chúng ta bắt đầu vào làm mô hình, hãy xem qua các bước triển khai một mô hình. Với mình nó gồm có 5 bước triển khai kỹ thuật như sau:

xây dựng mô hình, mô hình dự báo

Trong Chương 1 này chúng ta cùng xem một số các kỹ thuật về liên quan đến làm việc với BIẾN để chuẩn bị trước khi xây dựng mô hình. Đây là bước làm việc mất nhiều thời gian nhất trong việc xây dựng mô hình, chiếm đến 80% thời lượng thực hiện, lý do bởi vì chất lượng của mô hình phụ thuộc rất nhiều vào chất lượng của dữ liệu đầu vào, thông thường việc này có thể phải làm đi làm lại nhiều lần.

Phần 3 – Chuẩn bị dữ liệu, biến cho mô hình dự báo

Như nội dung trong Biểu thức toán học bên trên chúng ta cần xác định các biến X, Y để xây dựng mô hình.

Trong bài ví dụ này chúng ta cùng thử phân tích tác động của yếu tố kinh tế vĩ mô lên vấn đề nợ xấu trong ngân hàng. File mẫu dữ liệu để triển khai mô hình hôm nay mình sử dụng là file csv gồm các biến:

  • Inflation: Tỷ lệ lạm phát
  • Lending Interest Rate: Tỷ lệ biến động lãi suất
  • Unemployment: Tỷ lệ biến động thất nghiệp
  • GDP: Tỷ lệ biến động GPD
  • NPL: Tỷ lệ nợ xấu của Ngân hàng

Như vậy chúng ta có các biến:

  • Biến độc lập X là Inflation, Lending Interest Rate, Unemployment, GDP
  • Biến phụ thuộc Y là NPL

Độ dài dữ liệu mình đã chuẩn bị ở đây là 14 năm. Dữ liệu được chuẩn bị theo từng năm. Ngoài ra mình có lưu ý không phải là vấn đề về kỹ thuật nhưng điều này rất quan trọng trong việc xây dựng mô hình đó là bạn xác định được nguồn dữ liệu thu thập là nguồn dữ liệu đúng đắn, tin cậy. 

Phần 4 – Kiểm tra và lựa chọn biến cho mô hình dự báo

Mục tiêu các biến được lựa chọn và đưa vào mô hình phải đáp ứng các tiêu chuẩn như sau:

  • Biến phụ thuộc (Y) trong mô hình phải là biến liên tục
  • Có mối quan hệ tuyến tính giữa biến phụ thuộc Y với các biến độc lập X
  • Dữ liệu không có chứa các điểm dị biệt/ outliers
  • Không có sự đa cộng tuyến giữa các biến độc lập X. Điều đó có nghĩa các biến độc lập trong mô hình không có sự tương quan cao với nhau.

Để kiểm tra biến có đáp ứng được các mục tiêu trên, hôm nay chúng ta cùng làm quen và sử dụng một số kỹ thuật như sau:

Thế nào là Biến rời rạc và Biến liên tục?

Biến liên tục (continuous variable) là biến số có thể nhận bất kỳ giá trị nào trong một khoảng nhất định. Ví dụ các biến trong bài tập này đều là biến liên tục.

Biến rời rạc (discrete variable) là biến số chỉ nhận các giá trị nguyên. Ví dụ biến trình độ học vấn thì chỉ nhận các giá trị Đại học, hoặc Trung cấp,… chứ không có các giá trị giữa của Đại học và Trung cấp.

Trong bài tập này biến Y xác định tỷ lệ nợ xấu là Biến liên tục, nó có thể nhận bất cứ giá trị nào à do đó nó đáp ứng yêu cầu để làm mô hình.

Một số các kỹ thuật để kiểm tra dữ liệu thống kê

Trong bài viết trước mình đã đưa ra một số kỹ thuật trong Pandas, hữu hiệu gồm có dùng kỹ thuật Describe: thống kê mô tả chuỗi giá trị để chúng ta sử dụng kiểm tra biến và xử lý các biến lỗi như biến bị Null, dữ liệu phi lý. Trong bài này chúng ta cùng xem thêm một số kỹ thuật mới liên quan đến kiểm định biến.

Boxplots

Biểu đồ phân tích từng biến chia chuỗi dữ liệu của biến thành các khoảng phần tư (quartiles) từ đó phát hiện xem phân phối của biến có tốt không, cũng như xem được các điểm dị biệt để xử lý. Cũng như kỹ thuật thống kê mô tả ở Describe, nhưng Boxplots biểu diễn mỗi chuỗi giá trị thành một hình hộp thể hiện 5 giá trị thống kê của chuỗi dữ liệu:

  • Giá trị bé nhất Minimum trên râu whiskers
  • Tứ phân vị thứ nhất Q1 = điểm phân vị 25%
  • Tứ phân vị thứ hai = medians = điểm phân vị 50%
  • Tứ phân vị thứ ba Q3 = điểm phân vị 75%
  • Giá trị lớn nhất Maximum trên râu whiskers
  • IQR = Q3 – Q1 được gọi khoảng bên trong phân vị. IQR sẽ quyết định độ dài của 2 râu Min và Max do đó hai giá trị này không phải ới giá trị Minimum hoặc Maximum của cả chuỗi giá trị. Lý do người ta xác định hai ria ngoài để đánh dấu các điểm nằm ngoài ria được tính là điểm nghi ngờ có dị biệt outliers.

Biểu diễn của nó như sau:

biểu đồ hộp, mô hình dự báo

Source code thực hiện:

# LOAD DỮ LIỆU
df = pd.read_csv(path + '\\Economic_S5.csv')

# 1. Kiểm tra thông số thống kê của mỗi biến
print("--------------------------")
print(df['Inflation'].describe())
print("--------------------------")
print(df['Unemployment'].describe())
print("--------------------------")
print(df['Lending_Interest_Rate'].describe())
print("--------------------------")
print(df['GDP'].describe())
print("--------------------------")
print(df['NPL'].describe())
print("--------------------------")

# 2. Vẽ phân phối dữ liệu dạng box plots
# Tạo DF mới loại bỏ Biến Year và NPL trong DF gốc sau đó vẽ các biểu đồ box với từng biến
df_box = df[['Inflation', 'Lending_Interest_Rate', 'Unemployment', 'GDP']]

# Chạy hàm boxplot để vẽ biểu đồ Box và lấy các giá trị của box. Hàm này trả về 2 giá trị ax và bp.
# Ý nghĩa tham số return type:
# 1. ‘axes’ returns the matplotlib axes the boxplot is drawn on
# 2. ‘dict’ returns a dictionary whose values are the matplotlib Lines of the boxplot.
# 3. ‘both’ returns a namedtuple with the axes and dict.
ax, bp = pd.DataFrame.boxplot(df_box, return_type='both')

# In dữ liệu của box và viết giá trị của các điểm này vào biểu đồ box
# outliner: trả về mảng giá trị nằm bên ngoài. Mảng chưa mỗi giá trị của chuỗi outliner
# boxes: trả về mảng gồm 5 giá trị của box sẽ nối thành hình box gồm cận trên cận dưới box
# medians: trả về mảng gồm 2 giá trị nối 2 điểm nằm ở giữa đường line mầu xanh lá cây
# whiskers: trả về 2 mảng mỗi mảng gồm 2 giá trị vẽ từ cạnh box đến ria 2 đầu
outliers = [flier.get_ydata() for flier in bp["fliers"]]
boxes = [box.get_ydata() for box in bp["boxes"]]
medians = [median.get_ydata() for median in bp["medians"]]
whiskers = [whiskers.get_ydata() for whiskers in bp["whiskers"]]
print("outliers:")
print(outliers)
for i in range(4):
    for j in range(len(outliers[i])):
        ax.text(i+1, outliers[i][j], "{:.4f}".format(outliers[i][j]))
print("boxes:")
print(boxes)
pad = 0.2
for i in range(4):
    ax.text(i+1+pad, boxes[i][1], "{:.4f}".format(boxes[i][1]))
    ax.text(i+1+pad, boxes[i][2], "{:.4f}".format(boxes[i][2]))
print("medians:")
print(medians)
#print(medians[0][0], medians[0][1])
for i in range(4):
    ax.text(i+1, medians[i][0], "{:.2f}".format(medians[i][0]))
print("whiskers:")
print(whiskers)
for i in range(4): #[0,3]
    for j in range(2): #[0,1]
        ax.text(i + 1, whiskers[i*2+j][1], "{:.2f}".format(whiskers[i*2+j][1]))
    # ax.text(i + 1, whiskers[i][1], "{:.2f}".format(whiskers[i][1]))

plt.show()
Code language: PHP (php)

Kết quả thu được:

mô hình dự báo
mô hình dự báo

Kết luận:

  • Có thể sử dụng biểu đồ box này để phân tích dữ liệu biến, xác định các có chứa các điểm dị biệt/ outliers hay không
  • Biểu đồ cũng thể hiện được hình thái phân phối dữ liệu.Trong trường hợp ví dụ trên ta thấy biến độc lập X – Inflation và GDP có giá trị dị biệt, ngoại trừ điểm dị biệt thì biến GDP cũng có phân phối cân đối
Quantiles

Ngoài cách vẽ biểu đồ Box bên trên, bạn cũng có thể in các giá trị phân phối tại từng quãng dữ liệu để phân tích:

# In quantiles theo các quãng 1%, 25%, 50%, 75%, 99%
quantiles = df_box.quantile([0.01, 0.25, 0.5, 0.75, 0.99])
print(quantiles)Code language: PHP (php)

Mẫu kết quả xuất ra từ đoạn lệnh:

quantiles
Histogram

Histogram là một dạng đồ thị cho phép bạn khám phá, hiển thị dạng phân phối tần suất của một tập dữ liệu liên tục. Nó cho phép chúng ta kiểm tra dạng phân phối (chẳng hạn, phân phối chuẩn), điểm dị biệt, độ trôi, độ nhọn của tập dữ liệu. Một đồ thị dạng histogram của một tập dữ liệu có dạng như hình sau. Trong đó biểu đồ hình chuông (Bell curve) thể hiện chuỗi dữ liệu đạt được phân phối chuẩn:

histogram
  • Số Skewness: được sử dụng để đo lường độ lệch của phân phối về 1 trong 2 phía. Giá trị +: lệch phải, – lệch trái. Giá trị skewness càng lớn thì độ lệch càng lớn
  • Số Kurtorsis: được sử dụng để đo lường độ nhọn hay bẹt của phân phối. Phân phối chuẩn có kurtosis 3.0, hay zero excess kurtosis
kurtosis. mô hình dự báo

Mẫu source code:

# 3. Vẽ phân phối dữ liệu dạng historical, 
# Hàm của Python mặc định chia dữ liệu thành 10 bin, 
# muốn thay đổi có thể điều chỉnh giá trị bin
df_hist = df[['GDP']]
hist = df_hist.hist(bins=10) 
plt.show()Code language: PHP (php)

Mẫu kết quả xuất ra từ đoạn lệnh:

histogram

Kết luận:

  • Mặc dù tôi không tìm được yêu cầu phải lựa chọn các biến độc lập X có phân phối chuẩn để đưa vào mô hình dự báo, song trên thực tế dữ liệu thường có hình dạng phân phối chuẩn. Ví dụ như số lượng học sinh giỏi trong lớp thì ít, số lượng học sinh cá biệt cũng ít, còn lại là những học sinh bình thường. Do vậy biểu đồ này cũng giúp chúng ta nhận xét bộ mẫu dữ liệu (sample data) để xây dựng mô hình của chúng ta có chất lượng tốt không.
  • Biểu đồ này cũng có thể sử dụng để xác định các có chứa các điểm dị biệt/ outliers hay không
  • Đối với trường hợp dữ liệu độc lập X là dữ liệu rời rạc, thì không thể hiện hình dạng là phân phối chuẩn.

Trong trường hợp ví dụ trên ta thấy hình thái phân bố dữ liệu của biến độc lập X – GDP tương đối đồng đều và có hình dạng bell curve.

Một số các kỹ thuật để kiểm tra tính tương quan

Scatter

Đây là biểu đồ phân tán dữ liệu được sử dụng để đánh giá mối tương quan giữa cặp biến. Trong trường hợp của bài tập này chúng ta sẽ sử dụng biểu đồ scatter để phân tích mối tương quan giữa biến phụ thuộc và biến độc lập xem chúng có mối quan hệ tuyến tính hay không bởi mục đích của việc chọn biến để xây dựng mô hình tuyến tính. Dưới đây là hình dạng kết quả của biểu đồ Scatter, trong đó nếu các điểm dữ liệu không đi theo một đường trend line nào thì có thể thấy rằng nó không có mối quan hệ, biểu đồ cũng giúp ta đánh giá xem mối quan hệ này có mạnh hay yếu không.

scatter

Giả sử với tệp dữ liệu ta thử nghiệm vẽ scatter giữa biến X = chỉ số GPD hàng năm và biến Y = tỷ lệ nợ xấu NPL hàng năm tương ứng

Mẫu source code:

df_scatter = df[['GDP','NPL']]

x = df_scatter['GDP'][:13]
y = df_scatter['NPL'][:13]

plt.scatter(x, y)

z = np.polyfit(x, y, 1)
p = np.poly1d(z)
plt.plot(x, p(x), "r--")

plt.show()
Code language: JavaScript (javascript)

Chạy mẫu kết quả trên Python ta có kết quả thu được như sau:

regression, mô hình dự báo

Kết luận:

  • Có thể sử dụng biểu đồ scatter này để phân tích “Có mối quan hệ tuyến tính giữa biến phụ thuộc Y với các biến độc lập X hay không?”
  • Biểu đồ cũng thể hiện được mối quan hệ là mạnh hay yếu, mối quan hệ cùng chiều – đồng biến (positive) hay ngược chiều – nghịch biến (negative). Trong trường hợp ví dụ trên ta thấy NPL và GDP có mối quan hệ tuyến tính nghịch biến và quan hệ mạnh.
Correlation

Kiểm địnhmối quan hệ giữa các biến là “mạnh” hay “yếu”. Khác với so sánh cặp biến trong Scatter, trong phép thử này chúng ta có thể xem xét được giữa các biến độc lập X có mối quan hệ với nhau hay không thông qua phân tích tương quan Pearson. Khi sử dụng Python để chạy ra kết quả phân tích tương quan Pearson, người ta sẽ căn cứ trên hệ số tương quan “r” để đánh giá mối quan hệ tuyến tính của 2 biến mà không phụ thuộc vào đơn vị đo lường. “r” được tính bằng công thức:

correllation, mô hình dự báo

Dựa trên hình vẽ ta có thể thấy nếu hệ số tương quan r > 0.5 thì có nghĩa là cặp biến có mối quan hệ với nhau. Trường hợp cặp biến đều là 2 biến biến độc lập X thì khi xây dựng mô hình, nếu ta kết hợp cặp biến này để đánh giá lên biến phụ thuộc Y nó có thể xẩy ra đa cộng tuyến với mô hình hồi quy tuyến tính, nghĩa là kết quả của mô hình không chính xác.

Mẫu source code mình thể hiện đủ các phương thức khác nhau có thể biểu diễn mối quan hệ trong Python, tuy nhiên khi phân tích mình chỉ tập trung vào phân tích hệ số tương quan r theo Pearson:

# 5. Ma trận tương quan giữa các biến trên 3 method khác nhau
df_corr = df[['Inflation', 'Lending_Interest_Rate', 'Unemployment', 'GDP','NPL']]
print("-----------Kết quả pearson---------------")
print(df_corr.corr(method='pearson', min_periods=1))
print("-----------Kết quả kendall---------------")
print(df_corr.corr(method='kendall'))
print("------------Kết quả spearman--------------")
print(df_corr.corr(method='spearman'))
Code language: PHP (php)

Chạy mẫu kết quả trên Python ta có kết quả thu được như sau:

Kết luận:

  • Có thể sử dụng hàm corr này để phân tích “Có mối quan hệ giữa các cặp biến hay không?” Các cặp biến bao gồm cả các cặp biến độc lập X và giữa biến độc lập X và biến phụ thuộc Y.
  • Biểu đồ cũng thể hiện được mối quan hệ là mạnh hay yếu, mối quan hệ cùng chiều – đồng biến (positive) hay ngược chiều – nghịch biến (negative) giống như scatter. Trong trường hợp ví dụ trên ta thấy biến phụ Y – NPL và biến độc lập X – GDP có mối quan hệ tuyến tính nghịch biến và quan hệ mạnh. Ta cũng thấy cặp biến độc lập X (Inflation và Lending Interest Rate) và cặp (Unemployment và GDP) cũng có mối quan hệ với nhau (r>|0.5|), xét trên thực tế ta thấy tỷ lệ lạm phát và lãi suất cho vay cũng có mối quan hệ thuận với nhau, khi lạm phát cao thì lãi suất vay cũng tăng theo, hay khi GDP giảm thì tỷ lệ thất nghiệp cũng tăng lên. Đối với trường hợp này nếu lựa chọn cặp biến này để xây dựng mô hình cần chú ý đến sự đa cộng tuyến nghĩa là tác động của các X lên nhau có thể làm ảnh hưởng chung đến Y và không phản ánh trung thưc tác động của X đến Y.

Rồi, mình đã đi được 2 phần đầu của bài xây dựng mô hình dự báo, mình sẽ tạm dừng bài này ở đây, trong bài tiếp theo chúng ta sẽ đi các Bước 3,4,5 của triển khai mô hình dự báo đơn giản nhé.

Hãy join cùng cộng đồng Mì AI nhé!

Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Website: https://miai.vn
Youtube: http://bit.ly/miaiyoutube

Related Post

2 Replies to “[DA-DS] Triển khai mô hình dự báo đơn giản (Chương 1/2)”

Leave a Reply

Your email address will not be published. Required fields are marked *