Triển khai thuật toán Hồi quy tuyến tính, chỉ sử dụng các mô-đun Python và numpy tích hợp sẵn, đồng thời tìm hiểu về phép toán đằng sau thuật toán ML phổ biến này
Patrick Loeber · · · · · Ngày 11 tháng 9 năm 2019 · 3 phút đọc
Máy học gọn gàngTrong Hướng dẫn Machine Learning from Scratch này, chúng ta sẽ triển khai thuật toán Hồi quy tuyến tính, chỉ sử dụng các mô-đun Python tích hợp sẵn và numpy. Chúng ta cũng sẽ tìm hiểu về khái niệm và toán học đằng sau thuật toán ML phổ biến này
Việc sử dụng các mô hình máy học trong các dự án của bạn khá đơn giản vì chúng tôi có các mô-đun và thư viện dựng sẵn như sklearn, nhưng điều quan trọng là người ta phải biết thuật toán thực tế hoạt động như thế nào để hiểu rõ hơn về khái niệm cốt lõi. Trong blog này, chúng tôi sẽ triển khai một trong những thuật toán cơ bản nhất trong máy học i. e Hồi quy tuyến tính đơn giản. Các chủ đề sẽ được đề cập trong blog này như sau
- Hồi quy tuyến tính là gì?
- Làm cách nào để triển khai Hồi quy tuyến tính trong Python?
- Làm thế nào để hình dung đường hồi quy?
- Sử dụng số liệu nào để đánh giá mô hình?
Hồi quy tuyến tính là gì?
Hồi quy tuyến tính là một thuật toán Machine Learning được giám sát, nó cũng được coi là loại thuật toán Machine Learning dự đoán đơn giản nhất. Có một số giả định cơ bản mà chúng ta đưa ra để hồi quy tuyến tính hoạt động, chẳng hạn như điều quan trọng là mối quan hệ giữa biến độc lập và biến mục tiêu về bản chất là tuyến tính, nếu không mô hình của chúng ta cuối cùng sẽ đưa ra kết quả không phù hợp
Đường kết nối tới hình ảnh
Từ Tuyến tính trong Hồi quy tuyến tính gợi ý rằng hàm được sử dụng để dự đoán là hàm tuyến tính. Chức năng này có thể được biểu diễn như hình dưới đây
Bây giờ, bạn có thể quen thuộc với phương trình này, trên thực tế, tất cả chúng ta đều đã sử dụng phương trình này, đây là phương trình của một đường thẳng. Về mặt hồi quy tuyến tính, y trong phương trình này là viết tắt của giá trị dự đoán, x có nghĩa là biến độc lập và m & b là các hệ số chúng ta cần tối ưu hóa để đường hồi quy phù hợp với dữ liệu của chúng ta
Tính hệ số của phương trình
Để tính các hệ số, chúng ta cần công thức cho Hiệp phương sai và Phương sai, vì vậy công thức cho các hệ số này là
Để tính hệ số m, chúng ta sẽ sử dụng công thức được đưa ra dưới đây
m = cov[x, y] / var[x] b = mean[y] — m * mean[x]
Làm cách nào để triển khai Hồi quy tuyến tính trong Python?
Bây giờ chúng ta đã biết các công thức tính các hệ số của phương trình, hãy chuyển sang phần thực hiện. Để triển khai mã này, chúng tôi sẽ sử dụng các thư viện tiêu chuẩn như Pandas và Numpy và sau đó để trực quan hóa kết quả của chúng tôi, chúng tôi sẽ sử dụng Matplotlib và Seaborn
Tập dữ liệu được sử dụng trong ví dụ này có sẵn trên kho lưu trữ Github của tôi tại đây. Bộ dữ liệu có 2 cột Tham số 1 và Tham số 2. Vì vậy, x sẽ là Tham số 1 và y sẽ là Tham số 2. Trước tiên chúng ta sẽ bắt đầu bằng cách viết các hàm để tính Giá trị trung bình, Hiệp phương sai và Phương sai
# mean def get_mean[arr]: return np.sum[arr]/len[arr] # variance def get_variance[arr, mean]: return np.sum[[arr-mean]**2] # covariance def get_covariance[arr_x, mean_x, arr_y, mean_y]: final_arr = [arr_x - mean_x]*[arr_y - mean_y] return np.sum[final_arr]
Bây giờ, bước tiếp theo sẽ là tính toán các hệ số và Hàm hồi quy tuyến tính, vì vậy hãy xem mã cho các hàm đó
# Coefficients # m = cov[x, y] / var[x] # b = y - m*x def get_coefficients[x, y]: x_mean = get_mean[x] y_mean = get_mean[y] m = get_covariance[x, x_mean, y, y_mean]/get_variance[x, x_mean] b = y_mean - x_mean*m return m, b # Linear Regression # Train and Test # Train Split 80 % Test Split 20 % def linear_regression[x_train, y_train, x_test, y_test]: prediction = [] m, b = get_coefficients[x_train, y_train] for x in x_test: y = m*x + b prediction.append[y] r2 = r2_score[prediction, y_test] mse = mean_squared_error[prediction, y_test] print["The R2 score of the model is: ", r2] print["The MSE score of the model is: ", mse] return prediction prediction = linear_regression[x[:80], y[:80], x[80:], y[80:]]
Bây giờ chúng ta đã có tất cả các chức năng sẵn sàng để thực hiện hồi quy, điều duy nhất còn lại là trực quan hóa, vì vậy bây giờ chúng ta sẽ viết mã để trực quan hóa đường hồi quy
Làm thế nào để hình dung đường hồi quy?
Để trực quan hóa đường hồi quy, chúng tôi sẽ sử dụng thư viện matplotlib và seaborn. Các điểm sẽ được vẽ bằng biểu đồ phân tán và đường hồi quy sẽ được vẽ bằng các hàm lineplot. Seaborn cũng cung cấp một biểu đồ hồi quy riêng được gọi là regplot [biểu đồ hồi quy] nhưng ở đây chúng ta sẽ sử dụng biểu đồ phân tán và biểu đồ đường để trực quan hóa đường
def plot_reg_line[x, y]: # Calculate predictions for x ranging from 1 to 100 prediction = [] m, c = get_coefficients[x, y] for x0 in range[1,100]: yhat = m*x0 + c prediction.append[yhat] # Scatter plot without regression line fig = plt.figure[figsize=[20,7]] plt.subplot[1,2,1] sns.scatterplot[x=x, y=y] plt.xlabel['X'] plt.ylabel['Y'] plt.title['Scatter Plot between X and Y'] # Scatter plot with regression line plt.subplot[1,2,2] sns.scatterplot[x=x, y=y, color = 'blue'] sns.lineplot[x = [i for i in range[1, 100]], y = prediction, color='red'] plt.xlabel['X'] plt.ylabel['Y'] plt.title['Regression Plot'] plt.show[]
Đoạn mã trên là để hiểu cách hoạt động của trực quan hóa của chúng tôi nhưng để sử dụng thường xuyên, bạn không cần phải viết đoạn mã trên, bạn chỉ cần sử dụng regplot từ seaborn, regplot về cơ bản là sự kết hợp của biểu đồ phân tán và biểu đồ đường, mã cho regplot là
# Regression plot sns.regplot[x, y] plt.xlabel['X'] plt.ylabel['Y'] plt.title["Regression Plot"] plt.show[]
Sử dụng số liệu nào để đánh giá mô hình?
Để đánh giá một mô hình hồi quy, chúng ta thường sử dụng
- r2_score
- có nghĩa là lỗi bình phương
- root_mean_squared_error
- mean_absolute_error
Bạn có thể tìm hiểu về các số liệu này tại đây. Trong blog này, chúng tôi đã sử dụng 2 số liệu từ 3 số liệu được liệt kê ở trên. R2_score và mean_squared_error. R2_score nằm trong khoảng từ 0 đến 1 trong đó 1 biểu thị độ chính xác tuyệt đối và 0 biểu thị hiệu suất kém, mse hoặc lỗi bình phương trung bình về cơ bản là tổng của tất cả các lỗi bình phương và giá trị mse càng nhỏ thì mô hình của chúng tôi càng tốt.
Kết quả và Kết luận
Vì vậy, bây giờ chúng tôi sẽ kết hợp tất cả các mã chúng tôi đã viết ở trên và xem kết quả chúng tôi thu được, chúng tôi sẽ sử dụng cả hai, thuật toán do chúng tôi mã hóa cũng như thư viện sklearn tích hợp. Nếu kết quả của cả hai phương pháp đều giống nhau, điều đó có nghĩa là chúng tôi đã mã hóa thuật toán thành công
Trước tiên hãy xem thuật toán của chúng tôi
# Import necessary Libraries import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.metrics import r2_score, mean_squared_error # Read Data df = pd.read_csv['SampleData.csv'] x = df['Parameter 1'].values y = df['Parameter 2'].values # mean def get_mean[arr]: return np.sum[arr]/len[arr] # variance def get_variance[arr, mean]: return np.sum[[arr-mean]**2] # covariance def get_covariance[arr_x, mean_x, arr_y, mean_y]: final_arr = [arr_x - mean_x]*[arr_y - mean_y] return np.sum[final_arr] # find coeff def get_coefficients[x, y]: x_mean = get_mean[x] y_mean = get_mean[y] m = get_covariance[x, x_mean, y, y_mean]/get_variance[x, x_mean] c = y_mean - x_mean*m return m, c # Regression Function def linear_regression[x_train, y_train, x_test, y_test]: prediction = [] m, c = get_coefficients[x_train, y_train] for x in x_test: y = m*x + c prediction.append[y] r2 = r2_score[prediction, y_test] mse = mean_squared_error[prediction, y_test] print["The R2 score of the model is: ", r2] print["The MSE score of the model is: ", mse] return prediction # There are 100 sample out of which 80 are for training and 20 are for testing linear_regression[x[:80], y[:80], x[80:], y[80:]] # Visualize def plot_reg_line[x, y]: prediction = [] m, c = get_coefficients[x, y] for x0 in range[1,100]: yhat = m*x0 + c prediction.append[yhat] fig = plt.figure[figsize=[20,7]] plt.subplot[1,2,1] sns.scatterplot[x=x, y=y] plt.xlabel['X'] plt.ylabel['Y'] plt.title['Scatter Plot between X and Y'] plt.subplot[1,2,2] sns.scatterplot[x=x, y=y, color = 'blue'] sns.lineplot[x = [i for i in range[1, 100]], y = prediction, color='red'] plt.xlabel['X'] plt.ylabel['Y'] plt.title['Regression Plot'] plt.show[] plot_reg_line[x, y]
Và đầu ra được tạo bởi thuật toán của chúng tôi được hiển thị trong hình bên dưới, đường màu đỏ hiển thị đường hồi quy
Bây giờ hãy xem chức năng Hồi quy tuyến tính tích hợp
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.metrics import r2_score, mean_squared_error from sklearn.linear_model import LinearRegression df = pd.read_csv['SampleData.csv'] x = df['Parameter 1'].values y = df['Parameter 2'].values reg = LinearRegression[] reg.fit[x[:80].reshape[-1, 1], y[:80]] prediction = reg.predict[x[80:].reshape[-1, 1]] r2 = r2_score[prediction, y[80:]] mse = mean_squared_error[prediction, y[80:]] print["The R2 score of the model is: ", r2] print["The MSE score of the model is: ", mse] prediction = reg.predict[np.array[[i for i in range[1, 100]]].reshape[-1, 1]] fig = plt.figure[figsize=[20,7]] plt.subplot[1,2,1] sns.scatterplot[x=x, y=y] plt.xlabel['X'] plt.ylabel['Y'] plt.title['Scatter Plot between X and Y'] plt.subplot[1,2,2] sns.scatterplot[x=x, y=y, color = 'green'] sns.lineplot[x = [i for i in range[1, 100]], y = prediction, color='red'] plt.xlabel['X'] plt.ylabel['Y'] plt.title['Regression Plot'] plt.show[]
Đầu ra của đoạn mã trên
Chúng ta có thể thấy rõ ràng từ cả hai đầu ra rằng chúng ta đã thu được kết quả chính xác giống nhau từ cả hai thuật toán tôi. một cái chúng tôi đã mã hóa và một cái trong sklearn, vì vậy đó là tất cả về việc viết mã của riêng bạn để triển khai Hồi quy tuyến tính trong python. Nếu bạn thích đọc blog, hãy chia sẻ nó với bạn bè của bạn. Nếu bạn có bất kỳ đề xuất hoặc nghi ngờ nào, bạn có thể nhận xét chúng bên dưới. trong các blog trong tương lai, tôi sẽ cố gắng đề cập đến việc triển khai các thuật toán ML khác như KNN, Cây quyết định, v.v. học tập vui vẻ
Kết nối với tôi trên LinkedIn
E-mail. [email được bảo vệ]
Tham khảo các bài viết trước của tôi tại đây
Phương tiện hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định của Tác giả