bởi Tirthajyoti Sarkar
Trong bài viết này, chúng tôi thảo luận về 8 cách để thực hiện hồi quy tuyến tính đơn giản bằng mã/gói Python. Chúng tôi đề cập đến những ưu và nhược điểm của chúng, đồng thời chỉ ra thước đo độ phức tạp tính toán tương đối của chúng.
Đối với nhiều nhà khoa học dữ liệu, hồi quy tuyến tính là điểm khởi đầu của nhiều dự án phân tích dự báo và mô hình thống kê. Không thể phóng đại tầm quan trọng của việc khớp (chính xác và nhanh chóng) một mô hình tuyến tính với một tập dữ liệu lớn. Như đã chỉ ra trong bài báo này, ‘TUYẾN TÍNH‘ thuật ngữ trong mô hình hồi quy tuyến tính đề cập đến các hệ số chứ không phải mức độ của các tính năng.
Các tính năng (hoặc các biến độc lập) có thể ở bất kỳ mức độ nào hoặc thậm chí là các hàm siêu việt như hàm mũ, logarit, hình sin. Do đó, một lượng lớn các hiện tượng tự nhiên có thể được mô hình hóa (xấp xỉ) bằng cách sử dụng các phép biến đổi này và mô hình tuyến tính ngay cả khi mối quan hệ chức năng giữa đầu ra và các tính năng là phi tuyến tính cao.
Mặt khác, Python đang nhanh chóng nổi lên như một ngôn ngữ lập trình thực tế được các nhà khoa học dữ liệu lựa chọn. Do đó, điều quan trọng đối với một nhà khoa học dữ liệu là phải nhận thức được tất cả các phương pháp khác nhau mà anh ấy/cô ấy có thể nhanh chóng khớp một mô hình tuyến tính với một tập dữ liệu khá lớn và đánh giá tầm quan trọng tương đối của từng tính năng trong kết quả của quy trình.
Tuy nhiên, có phải chỉ có một cách để thực hiện phân tích hồi quy tuyến tính trong Python? Trong trường hợp có nhiều lựa chọn, làm thế nào để chọn phương pháp hiệu quả nhất?
Do sự phổ biến rộng rãi của thư viện máy học scikit-learning, một cách tiếp cận phổ biến thường là gọi lớp Mô hình tuyến tính từ thư viện đó và điều chỉnh dữ liệu. Mặc dù điều này có thể mang lại những lợi thế bổ sung khi áp dụng các tính năng đường ống khác của máy học (ví dụ: chuẩn hóa dữ liệu, chuẩn hóa hệ số mô hình, cung cấp mô hình tuyến tính cho một mô hình xuôi dòng khác), đây thường không phải là phương pháp nhanh nhất hoặc sạch nhất khi nhà phân tích dữ liệu chỉ cần nhanh chóng và cách dễ dàng để xác định các hệ số hồi quy (và một số thống kê liên quan cơ bản).
Có những phương pháp nhanh hơn và sạch hơn. Nhưng tất cả chúng có thể không cung cấp cùng một lượng thông tin hoặc tính linh hoạt của mô hình.
Mời bạn đọc tiếp.
Toàn bộ mã tấm nồi hơi cho các phương pháp hồi quy tuyến tính khác nhau có sẵn tại đây trên kho lưu trữ GitHub của tôi. Hầu hết chúng đều dựa trên gói SciPy.
SciPy là tập hợp các thuật toán toán học và các hàm tiện lợi được xây dựng trên phần mở rộng Numpy của Python. Nó bổ sung sức mạnh đáng kể cho phiên Python tương tác bằng cách cung cấp cho người dùng các lệnh và lớp cấp cao để thao tác và trực quan hóa dữ liệu.
Hãy để tôi thảo luận ngắn gọn về từng phương pháp,
Phương thức: scipy.polyfit() hoặc numpy.polyfit()

Đây là một hàm phù hợp với đa thức bình phương nhỏ nhất khá chung, chấp nhận tập dữ liệu và hàm đa thức ở bất kỳ mức độ nào (do người dùng chỉ định) và trả về một mảng các hệ số giúp giảm thiểu lỗi bình phương. Mô tả chi tiết của chức năng được đưa ra ở đây. Đối với hồi quy tuyến tính đơn giản, người ta có thể chọn bậc 1. Nếu bạn muốn khớp với mô hình bậc cao hơn, bạn có thể xây dựng các đặc trưng đa thức từ dữ liệu đặc trưng tuyến tính và khớp với mô hình.
Phương pháp: Stats.linregress()

Đây là một hàm hồi quy tuyến tính chuyên dụng cao có sẵn trong mô-đun thống kê của Scipy. Nó khá hạn chế về tính linh hoạt vì nó được tối ưu hóa để tính toán hồi quy bình phương nhỏ nhất tuyến tính chỉ cho hai bộ phép đo. Do đó, bạn không thể điều chỉnh mô hình tuyến tính tổng quát hoặc hồi quy đa biến bằng cách sử dụng mô hình này. Tuy nhiên, do tính chất chuyên biệt của nó, nó là một trong những phương pháp nhanh nhất khi nói đến hồi quy tuyến tính đơn giản. Ngoài hệ số được trang bị và số hạng chặn, nó còn trả về các số liệu thống kê cơ bản như r² hệ số và lỗi tiêu chuẩn.
Phương pháp: Optimize.curve_fit( )

Điều này cũng giống như phương pháp Polyfit, nhưng về bản chất tổng quát hơn. Chức năng mạnh mẽ này từ mô-đun scipy.optimize có thể khớp bất kỳ chức năng nào do người dùng xác định với tập dữ liệu bằng cách thực hiện thu nhỏ bình phương nhỏ nhất.
Đối với hồi quy tuyến tính đơn giản, người ta chỉ cần viết một hàm mx+c tuyến tính và gọi công cụ ước tính này. Không cần phải nói rằng nó cũng hoạt động cho hồi quy đa biến. Nó trả về một mảng các tham số hàm mà số đo bình phương nhỏ nhất được giảm thiểu và ma trận hiệp phương sai liên quan.
Phương thức: numpy.linalg.lstsq

Đây là phương pháp cơ bản để tính toán nghiệm bình phương nhỏ nhất cho một hệ phương trình tuyến tính bằng cách phân tích ma trận thành nhân tử. Nó xuất phát từ mô-đun đại số tuyến tính tiện dụng của gói numpy. Dưới mui xe, nó giải phương trình rìu = b bằng cách tính một véc tơ x tối thiểu hóa định mức 2 Euclide || b — rìu ||².
Phương trình có thể được xác định dưới, tốt hoặc quá xác định (nghĩa là số hàng độc lập tuyến tính của một có thể nhỏ hơn, bằng hoặc lớn hơn số cột độc lập tuyến tính của nó). Nếu một là hình vuông và hạng đầy đủ, sau đó x (nhưng đối với sai số làm tròn số) là nghiệm “chính xác” của phương trình.
Bạn có thể thực hiện hồi quy đơn giản hoặc đa biến với điều này và lấy lại các hệ số và số dư đã tính toán. Một mẹo nhỏ là trước khi gọi hàm này, bạn phải nối thêm một cột 1 vào dữ liệu x để tính số hạng chặn. Hóa ra đó là một trong những phương pháp nhanh hơn để thử các bài toán hồi quy tuyến tính.
Phương pháp: Statsmodels.OLS ( )
Statsmodels là một gói Python nhỏ tuyệt vời cung cấp các lớp và hàm để ước tính nhiều mô hình thống kê khác nhau, cũng như để tiến hành kiểm tra thống kê và khám phá dữ liệu thống kê. Một danh sách đầy đủ các số liệu thống kê kết quả có sẵn cho mỗi công cụ ước tính. Các kết quả được kiểm tra dựa trên các gói thống kê hiện có để đảm bảo tính chính xác.
Đối với hồi quy tuyến tính, người ta có thể sử dụng hàm OLS hoặc hàm Bình phương nhỏ nhất thông thường từ gói này và thu được thông tin thống kê đầy đủ về quy trình ước tính.
Một mẹo nhỏ cần nhớ là bạn phải thêm một hằng số theo cách thủ công vào dữ liệu x để tính hệ số chặn, nếu không, theo mặc định, nó sẽ chỉ báo cáo hệ số. Dưới đây là ảnh chụp tóm tắt kết quả đầy đủ của mô hình OLS. Nó phong phú như bất kỳ ngôn ngữ thống kê chức năng nào như R hay Julia.

Phương pháp: Giải tích bằng phương pháp nghịch đảo ma trận
Đối với các bài toán hồi quy tuyến tính được điều chỉnh tốt (ít nhất là khi # điểm dữ liệu > # tính năng), tồn tại một giải pháp ma trận dạng đóng đơn giản để tính toán các hệ số đảm bảo tối thiểu hóa bình phương nhỏ nhất. Nó được đưa ra bởi,

Dẫn xuất chi tiết và thảo luận về giải pháp này được thảo luận ở đây.
Người ta có hai lựa chọn ở đây:
(a) sử dụng nghịch đảo ma trận nhân đơn giản.
(b) đầu tiên tính toán ma trận nghịch đảo giả tổng quát Moore-Penrose của dữ liệu x, sau đó lấy tích vô hướng với dữ liệu y. Vì quy trình thứ 2 này liên quan đến phân tách giá trị đơn lẻ (SVD), nên quy trình này chậm hơn nhưng có thể hoạt động tốt đối với tập dữ liệu không được điều hòa tốt.
Phương thức: sklearn.linear_model.LinearRegression()
Đây là phương pháp tinh túy được sử dụng bởi phần lớn các kỹ sư máy học và nhà khoa học dữ liệu. Tất nhiên, đối với vấn đề trong thế giới thực, nó có lẽ không bao giờ được sử dụng nhiều và được thay thế bằng các thuật toán được xác thực chéo và chính quy hóa như hồi quy Lasso hoặc hồi quy Ridge. Nhưng cốt lõi thiết yếu của những chức năng nâng cao đó lại nằm ở mô hình này.
Đo tốc độ và độ phức tạp về thời gian của các phương pháp này
Là một nhà khoa học dữ liệu, người ta phải luôn tìm kiếm các phương pháp/chức năng chính xác nhưng nhanh chóng để thực hiện công việc lập mô hình dữ liệu. Nếu phương pháp vốn đã chậm, thì nó sẽ tạo ra nút thắt cổ chai thực thi cho các tập dữ liệu lớn.
Một cách tốt để xác định khả năng mở rộng là chạy các mô hình để tăng kích thước tập dữ liệu, trích xuất thời gian thực hiện cho tất cả các lần chạy và vẽ đồ thị xu hướng.
Đây là mã tấm nồi hơi cho việc này. Và đây là kết quả. Do tính đơn giản của chúng, stats.linregress và các phương pháp nghịch đảo ma trận đơn giản là nhanh nhất, thậm chí lên đến 10 triệu điểm dữ liệu.

Tóm lược
Là một nhà khoa học dữ liệu, một người phải luôn khám phá nhiều tùy chọn để giải quyết cùng một nhiệm vụ phân tích hoặc lập mô hình và chọn cách tốt nhất cho vấn đề cụ thể của mình.
Trong bài viết này, chúng tôi đã thảo luận về 8 cách để thực hiện hồi quy tuyến tính đơn giản. Hầu hết chúng đều có thể mở rộng thành mô hình hồi quy đa biến và đa thức tổng quát hơn. Chúng tôi không liệt kê R² phù hợp cho các phương pháp này vì tất cả chúng đều rất gần với 1.
Đối với hồi quy một biến, với hàng triệu điểm dữ liệu được tạo giả tạo, hệ số hồi quy được ước tính rất chính xác.
Mục tiêu của bài viết này chủ yếu là thảo luận về tốc độ tương đối/độ phức tạp tính toán của các phương pháp này. Chúng tôi đã chỉ ra thước đo độ phức tạp tính toán của từng mẫu bằng cách thử nghiệm trên một tập dữ liệu tổng hợp có kích thước tăng dần (lên đến 10 triệu mẫu). Đáng ngạc nhiên, giải pháp phân tích nghịch đảo ma trận đơn giản hoạt động khá nhanh so với Mô hình tuyến tính được sử dụng rộng rãi của scikit-learning.
Nếu bạn có bất kỳ câu hỏi hoặc ý tưởng để chia sẻ, xin vui lòng liên hệ với tác giả tại tirthajyoti[AT]gmail.com. Ngoài ra, bạn có thể kiểm tra tác giả kho GitHub để biết các đoạn mã thú vị khác trong Python, R hoặc MATLAB và các tài nguyên máy học. Nếu bạn, giống như tôi, đam mê học máy/khoa học dữ liệu/chất bán dẫn, vui lòng thêm tôi trên LinkedIn hoặc theo dõi tôi trên Twitter.