Hồi quy tuyến tính từ python đầu

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àng

Trong 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

  1. Hồi quy tuyến tính là gì?
  2. Làm cách nào để triển khai Hồi quy tuyến tính trong Python?
  3. Làm thế nào để hình dung đường hồi quy?
  4. 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

Phương Trình Hồi Quy Tuyến Tính Đơn Giản

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à

Công thức tính hiệp phương sai
Công thức tính phương sai

Để 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[]
Đầu ra cho đoạn mã trên

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

  1. r2_score
  2. có nghĩa là lỗi bình phương
  3. root_mean_squared_error
  4. 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.

Công thức cho các số liệu khác nhau

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

Đầu ra theo thuật toán của chúng tôi

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

Đầu ra cho chức năng tích hợp

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ả

Chủ Đề