Courses
Ép một đường thẳng vào dữ liệu có dạng cong không bao giờ là ý hay.
Hồi quy tuyến tính giả định mối quan hệ giữa biến dự báo và mục tiêu là một đường thẳng. Tiếc là phần lớn mối quan hệ trong thực tế thì không như vậy. Hãy nghĩ đến mối quan hệ giữa thu nhập và chi tiêu, hay thời gian và tăng trưởng — chúng uốn cong, đi ngang, lại uốn cong, rồi đổi hướng theo những cách không thể biểu diễn bằng một hệ số dốc duy nhất.
Hồi quy spline xử lý điều này bằng cách cho phép mối quan hệ uốn cong khi cần, mà không phải khớp một đường cong hoang dã không ràng buộc. Ý tưởng là khớp nhiều đoạn đa thức trơn trên toàn miền của biến dự báo và ghép chúng tại các điểm cụ thể.
Trong bài viết này, bạn sẽ học các khái niệm cốt lõi đằng sau hồi quy spline, cách các nút (knots) kiểm soát độ linh hoạt, các loại spline chính, và cách áp dụng chúng trong thực tế.
Trước khi tìm hiểu về spline, hãy đọc hướng dẫn của chúng tôi giúp bạn nắm mọi điều cần biết về hồi quy tuyến tính đơn giản.
Hồi quy spline là gì?
Hồi quy spline là kỹ thuật hồi quy mô hình hóa các mối quan hệ phi tuyến bằng các hàm đa thức theo từng đoạn, được ghép với nhau tại các điểm gọi là nút (knots).
Thay vì dùng một phương trình duy nhất cho toàn bộ mối quan hệ, hồi quy spline chia miền của biến dự báo thành các đoạn nhỏ và khớp một đa thức riêng cho mỗi đoạn. Các đoạn này gặp nhau tại các nút, và các ràng buộc đảm bảo chuyển tiếp mượt mà.
Kết quả cuối cùng nằm giữa hai thái cực. Nó linh hoạt hơn hồi quy tuyến tính, vốn chỉ vẽ được một đường thẳng duy nhất qua dữ liệu. Và có cấu trúc hơn các mô hình phi tuyến không ràng buộc như mạng nơ-ron sâu hay phương pháp hạt nhân, những mô hình có thể khớp gần như mọi thứ nhưng nói cho bạn rất ít về thứ chúng đã khớp.
Vì lý do đó, spline xuất hiện rất thường xuyên trong thống kê ứng dụng.
Vì sao cần hồi quy spline
Dữ liệu thực tế hầu như không bao giờ đi theo đường thẳng.
Hồi quy tuyến tính là điểm khởi đầu mặc định để mô hình hóa mối quan hệ, nhưng nó mang một giả định mạnh: tác động của biến dự báo lên kết quả giữ nguyên trên toàn miền. Khi mối quan hệ thực uốn cong hay đổi hướng, một đường thẳng sẽ underfit. Bạn sẽ có lỗi lớn ở hai đầu và một mô hình không thể theo kịp khuôn mẫu.
Cách khắc phục là dùng mô hình linh hoạt hơn. Hồi quy đa thức bậc cao là một lựa chọn — bạn thêm các hạng x^2, x^3, x^4 cho đến khi đường cong uốn đủ để khớp dữ liệu. Nhưng đa thức trở nên bất ổn ở rìa dữ liệu khi chúng vọt lên hoặc tụt xuống nơi có ít điểm dữ liệu. Hành vi đó gọi là hiện tượng Runge, và khiến đa thức bậc cao rủi ro khi dự đoán.
Hồi quy spline nằm giữa hai thái cực này.
Bạn có được độ linh hoạt cục bộ nơi dữ liệu uốn cong, mà không có sự bất ổn toàn cục của một đa thức bậc cao duy nhất. Mỗi đoạn là một đa thức bậc thấp (thường là bậc ba), nên không phần nào có thể hành xử bất thường. Và vì các đoạn được ghép mượt tại các nút, đường cong tổng thể vẫn trông như một hàm liên tục duy nhất.
Tóm lại, một spline cho đủ linh hoạt để theo các khuôn mẫu phức tạp và đủ cấu trúc để cư xử đúng mực ở rìa.
Hồi quy spline hoạt động thế nào
Hồi quy spline luôn theo một quy trình ba bước đơn giản.
- Chia miền biến dự báo thành các vùng: Bạn chọn một tập các nút dọc theo trục biến dự báo. Các nút này chia miền thành các khoảng. Nếu đặt ba nút, bạn có bốn vùng. Nút là ranh giới giữa các đoạn.
- Khớp một đa thức trong mỗi vùng: Bên trong mỗi khoảng, mô hình khớp một đa thức bậc thấp. Mỗi vùng có bộ hệ số đa thức riêng, nên đường cong có thể uốn khác nhau ở các phần khác nhau của miền biến dự báo. Vùng mà mối quan hệ gần như phẳng sẽ có đa thức gần-phẳng. Vùng mà mối quan hệ uốn mạnh sẽ có đa thức uốn cong hơn.
- Nối các vùng lại: Mô hình áp đặt các ràng buộc liên tục tại mọi nút. Giá trị đa thức từ hai phía phải khớp tại nút, để đường cong không bị nhảy. Với spline bậc ba, đạo hàm bậc nhất và bậc hai cũng phải khớp, nghĩa là không có góc nhọn và không có thay đổi độ cong đột ngột.
Chính các ràng buộc này khiến spline trông như một đường cong trơn duy nhất, uốn cục bộ nhưng chảy liên tục trên toàn miền biến dự báo. Nhìn bằng mắt thường, bạn không thể biết đa thức nào kết thúc và đa thức nào bắt đầu.
Các nút, bậc đa thức, và các ràng buộc liên tục cùng nhau định nghĩa spline. Thay đổi bất kỳ yếu tố nào, bạn sẽ có một loại spline khác với tính chất khác — và đó chính là nội dung các phần tiếp theo.
Nút (knots) trong hồi quy spline là gì?
Nút là các điểm dọc theo trục biến dự báo nơi một đoạn đa thức kết thúc và đoạn tiếp theo bắt đầu.
Bạn có thể xem chúng như các khớp nối của spline. Nếu đặt một nút tại x = 5, mô hình khớp một đa thức cho các giá trị nhỏ hơn 5 và một đa thức khác cho các giá trị lớn hơn 5. Hai đa thức gặp nhau tại nút, và các ràng buộc liên tục đảm bảo chúng được nối mượt. Thêm nhiều nút hơn, bạn có nhiều đoạn hơn, nghĩa là đường cong có thể uốn ở nhiều nơi hơn.
Vì thế, nút là cần gạt chính để kiểm soát độ linh hoạt của mô hình.
Số lượng nút quyết định có bao nhiêu mảnh đa thức tạo nên spline. Vị trí nút quyết định nơi đường cong được phép thay đổi hình dạng. Một spline với hai nút chỉ có thể uốn ở vài nơi. Một spline với hai mươi nút có thể bám theo gần như mọi điểm dữ liệu.
Vì vậy, chọn đúng số lượng và vị trí nút là quyết định chính trong hồi quy spline.
Quá ít nút
Nếu đặt quá ít nút, spline không có đủ đoạn để theo đúng khuôn mẫu thực tế trong dữ liệu. Đường cong quá cứng. Nó cư xử gần như một đa thức bậc thấp — linh hoạt ở mức tổng quát, nhưng không thể nắm bắt thay đổi cục bộ.
Hãy tưởng tượng khớp một spline với một nút cho dữ liệu có ba pha rõ rệt: xu hướng tăng, bình ổn, và giảm. Chỉ với một nút, spline chỉ có hai đoạn để làm việc. Nó có thể nắm bắt phần tăng và một trong hai pha còn lại, nhưng không thể bao trọn cả ba. Bạn sẽ gặp lại vấn đề như hồi quy tuyến tính — lỗi ở nơi spline không khớp được hình dạng dữ liệu.

Ví dụ quá ít nút
Quá ít nút dẫn đến underfitting. Mô hình quá mượt để hữu dụng.
Quá nhiều nút
Vấn đề ngược lại cũng tệ không kém. Nếu đặt quá nhiều nút, spline có quá nhiều đoạn đến mức nó bắt đầu khớp cả nhiễu thay vì khuôn mẫu thực. Đường cong lắc lư giữa mọi quan sát và đuổi theo biến thiên ngẫu nhiên thay vì xu hướng nền tảng.
Một spline với hai mươi nút trên bộ dữ liệu năm mươi điểm sẽ trông như bức vẽ nối điểm hơn là một mô hình. Nó sẽ khớp dữ liệu huấn luyện gần như hoàn hảo, nhưng dự đoán trên dữ liệu mới sẽ kém tin cậy. Thay đổi nhỏ ở đầu vào dẫn đến thay đổi lớn, khó lường ở đầu ra.

Ví dụ quá nhiều nút
Quá nhiều nút dẫn đến overfitting. Mô hình quá linh hoạt để khái quát hóa.
Bạn muốn đủ nút để bắt được những chỗ uốn thực sự trong dữ liệu, nhưng không quá nhiều đến mức mô hình bắt đầu ghi nhớ nhiễu. Các phần tiếp theo sẽ nói về cách đưa ra quyết định đó trong thực hành.
Các loại spline
Spline có vài biến thể, và lựa chọn chủ yếu phụ thuộc vào loại đa thức bạn dùng cho mỗi đoạn và các ràng buộc bạn áp lên đường cong.
Spline tuyến tính
Spline tuyến tính là phiên bản đơn giản nhất. Mỗi đoạn là một đường thẳng, và các đoạn nối tại nút.

Ví dụ spline tuyến tính
Ràng buộc tính liên tục ở đây lỏng hơn, vì giá trị từ hai phía phải khớp tại nút, nhưng độ dốc có thể thay đổi. Kết quả trông như một chuỗi đoạn thẳng nối nhau với các góc tại mỗi nút. Đủ linh hoạt để xử lý những uốn cong đơn giản, nhưng đôi khi đường cong không trơn tru.
Spline tuyến tính hiệu quả khi bạn chỉ quan tâm đến xu hướng tổng quát và không bận tâm về độ gắt về mặt thị giác. Chúng cũng dễ diễn giải nhất vì mỗi đoạn chỉ là một đường thẳng với độ dốc riêng.
Spline bậc ba (cubic)
Spline bậc ba là lựa chọn mặc định trong hầu hết ứng dụng. Mỗi đoạn là một đa thức bậc ba (bậc 3), và các ràng buộc liên tục nghiêm ngặt hơn so với spline tuyến tính.

Ví dụ spline bậc ba
Tại mỗi nút, ba điều kiện phải đúng: giá trị khớp nhau, đạo hàm bậc nhất khớp nhau, và đạo hàm bậc hai khớp nhau. Điều này có nghĩa không có bước nhảy, không có góc nhọn, và không có thay đổi độ cong đột ngột. Đường cong đi qua các nút mà không có dấu hiệu thị giác nào cho thấy nơi chuyển tiếp xảy ra.
Bậc ba là bậc đa thức thấp nhất cho phép thay đổi độ cong một cách trơn tru. Đó là lý do nó phổ biến. Bậc cao hơn hiếm khi thêm được độ linh hoạt hữu ích và chỉ khiến mô hình khó kiểm soát hơn.
Spline bậc ba tự nhiên (natural cubic)
Spline bậc ba tự nhiên là biến thể thêm ràng buộc ở biên của dữ liệu.

Ví dụ spline bậc ba tự nhiên
Vấn đề với spline bậc ba thông thường là chúng có thể cư xử kỳ lạ ở rìa, đặc biệt nơi có ít điểm dữ liệu. Hai đoạn ngoài cùng vẫn là đa thức bậc ba, và các đa thức bậc ba có thể vọt lên hoặc tụt xuống nhanh khi ngoại suy.
Spline bậc ba tự nhiên khắc phục điều này bằng cách buộc đạo hàm bậc hai bằng không tại hai nút biên. Trong thực tế, điều này có nghĩa đường cong trở nên tuyến tính ngoài các nút ngoài cùng. Hành vi ngoại suy ổn định hơn nhiều, khiến spline bậc ba tự nhiên là lựa chọn tốt hơn khi bạn quan tâm đến dự đoán gần rìa dữ liệu.
B-spline
B-spline (viết tắt của basis spline) là một cách khác để dựng spline. Thay vì định nghĩa trực tiếp từng đoạn đa thức, B-spline xây dựng spline như tổng có trọng số của các hàm cơ sở.

Ví dụ B-spline
Mỗi hàm cơ sở tự nó là một spline nhỏ chỉ khác không trong một vùng giới hạn. Spline đầy đủ là tổng của các hàm cơ sở này, mỗi hàm nhân với một hệ số được hồi quy ước lượng.
B-spline ổn định về mặt số học và dễ mở rộng. Phần lớn triển khai spline hiện đại trong Python và R dùng biểu diễn B-spline, ngay cả khi giao diện cho người dùng trông như spline thông thường. Nếu bạn từng gọi bs() trong R hoặc dùng SplineTransformer trong scikit-learn, bạn đã dùng B-spline.
Hồi quy spline so với hồi quy đa thức
Cả hồi quy đa thức và hồi quy spline đều xử lý các mối quan hệ phi tuyến, nhưng chúng tiếp cận rất khác nhau. Khác biệt nằm ở cách xây dựng đường cong.
Hồi quy đa thức
Hồi quy đa thức khớp một đa thức toàn cục trên toàn miền biến dự báo. Bạn chọn một bậc (2, 3, 5, 10), và mô hình tìm một bộ hệ số duy nhất tối thiểu hóa lỗi trên toàn bộ dữ liệu. Đường cong có một phương trình, và phương trình đó mô tả mối quan hệ ở mọi nơi.
Nghe có vẻ gọn gàng, nhưng có vấn đề. Một đa thức duy nhất phải cân bằng độ khớp trên toàn miền, nên điều xảy ra ở một vùng ảnh hưởng đến mọi vùng khác. Nếu bạn tăng bậc để xử lý một chỗ uốn gắt ở giữa dữ liệu, bạn sẽ thấy đường cong bắt đầu vung vẩy ở rìa. Đây là hiện tượng Runge đã nói — đa thức bậc cao trở nên bất ổn gần biên dữ liệu.
Vấn đề khác là hồi quy đa thức không có khái niệm tính cục bộ. Một đột biến tại x = 5 có thể làm thay đổi hình dạng của độ khớp tại x = 50, vì mọi quan sát đều đóng góp vào cùng một phương trình toàn cục.
Hồi quy spline
Hồi quy spline chia miền biến dự báo thành các đoạn và khớp một đa thức bậc thấp trong mỗi đoạn. Các đa thức được nối mượt tại các nút, nhưng mỗi đa thức là độc lập theo nghĩa hình dạng của nó chủ yếu do dữ liệu trong chính vùng đó chi phối.
Điều này cho bạn tính linh hoạt cục bộ. Vùng có chỗ uốn gắt sẽ có đa thức uốn hơn. Vùng có xu hướng phẳng sẽ có đa thức gần-phẳng. Và vì mỗi đoạn là bậc thấp (thường bậc ba), không phần nào có thể cư xử kỳ lạ ở rìa. Bạn có được độ khớp mượt hơn, ổn định hơn, đặc biệt gần biên dữ liệu.
So sánh cạnh nhau

Hồi quy đa thức so với hồi quy spline
Vì vậy, nếu mối quan hệ của bạn chỉ hơi phi tuyến và bạn chấp nhận một độ khớp toàn cục, hồi quy đa thức có thể dùng được. Nếu mẫu hình phức tạp hơn hoặc bạn quan tâm đến dự đoán gần biên, spline là lựa chọn an toàn hơn.
Chọn số lượng và vị trí nút
Chọn nút là phần quan trọng nhất của hồi quy spline. Quá ít nút dẫn đến underfit, còn quá nhiều gây overfit. Và nơi bạn đặt chúng sẽ thay đổi các mẫu hình mà mô hình có thể nắm bắt.
Có vài cách tiếp cận, và thường bạn sẽ kết hợp một vài cách.
- Kiến thức miền: Nếu bạn biết điều gì đó về bài toán, hãy dùng nó. Một nghiên cứu lâm sàng có thể đặt nút tại các ngưỡng lâm sàng đã biết. Một mô hình định giá có thể đặt nút tại các điểm mà hành vi người tiêu dùng dự kiến thay đổi. Đặt nút dựa trên miền là cách diễn giải tốt nhất vì các đoạn tương ứng với ranh giới thực tế.
- Nút cách đều: Chọn một số lượng nút và đặt cách đều trên miền biến dự báo. Cách này ổn khi dữ liệu phân bố tương đối đều dọc trục biến. Nó không hiệu quả khi bạn có vùng dày đặc và vùng thưa thớt — nút cách đều có thể rơi vào vùng hầu như không có dữ liệu, làm độ khớp kém ổn định.
- Nút theo phân vị: Thay vì đặt nút ở vị trí bằng nhau trên trục x, hãy đặt tại các phân vị của biến dự báo. Với 4 nút và cách đặt theo phân vị, bạn sẽ đặt tại các bách phân vị 20, 40, 60 và 80. Điều này đảm bảo mỗi đoạn chứa xấp xỉ cùng số quan sát, giúp độ khớp tin cậy hơn ở vùng thưa dữ liệu.
- Cross-validation: Bạn thử các số lượng nút khác nhau, khớp spline cho mỗi cấu hình, và so sánh hiệu năng trên dữ liệu giữ lại. Cấu hình có lỗi xác thực thấp nhất thắng. Cách này loại bỏ phỏng đoán nhưng tốn chi phí tính toán, và kết quả vẫn phụ thuộc vào chiến lược đặt nút (cách đều, phân vị) mà bạn tìm kiếm.
Bài toán đánh đổi vẫn giống mọi bài toán hồi quy: linh hoạt so với độ phức tạp. Nhiều nút nghĩa là nhiều linh hoạt hơn, cho phép mô hình theo sát mẫu tinh vi hơn nhưng cũng dễ đuổi theo nhiễu. Ít nút hơn nghĩa là mô hình ổn định, dễ diễn giải hơn nhưng có thể bỏ sót mẫu thực sự.
Bắt đầu với 3–5 nút đặt theo phân vị, rồi kiểm tra phần dư. Nếu bạn thấy các mẫu có hệ thống mà spline chưa bắt được, hãy thêm một nút ở vùng đó. Nếu đường khớp quá lắc lư, hãy bớt một nút. Cross-validation đáng dùng khi bạn cần bảo vệ lựa chọn hoặc khi mô hình đưa vào sản xuất.
Hồi quy spline trong Machine Learning và Thống kê
Hồi quy spline xuất hiện ở mọi nơi cần mô hình hóa hiệu ứng phi tuyến trơn mà không cam kết một dạng hàm cụ thể. Dưới đây là vài lĩnh vực phổ biến:
- Xu hướng chuỗi thời gian: Cách dùng thường thấy là tách xu hướng trơn trong chuỗi thời gian khỏi biến động ngắn hạn. Một spline khớp theo thời gian làm biến dự báo cho bạn một đường xu hướng linh hoạt thích ứng với thay đổi hướng mà không phản ứng thái quá với nhiễu. Các nhà kinh tế và phân tích dùng điều này thường xuyên khi họ muốn mô tả quỹ đạo cơ bản của một biến — như GDP hay giá cổ phiếu — mà không cần giả định tuyến tính hay hàm mũ.
- Kinh tế và kinh tế lượng: Spline được dùng để mô hình hóa các mối quan hệ mà tác động của một biến thay đổi theo miền của nó. Tác động của thu nhập lên tiêu dùng không hằng số, vì các hộ thu nhập thấp chi tiêu khác các hộ thu nhập cao. Spline nhìn thấy điều này mà không giả định một dạng hàm cụ thể.
- Y tế và thống kê sinh học: Nhiều kết cục sức khỏe có mối quan hệ phi tuyến với các biến như tuổi, BMI, huyết áp, hoặc nồng độ biomarker. Rủi ro bệnh thường theo dạng chữ U hoặc J — hai cực đều nguy hiểm, ở giữa an toàn. Mô hình tuyến tính sẽ bỏ lỡ điều này. Spline bậc ba và spline bậc ba tự nhiên là công cụ tiêu chuẩn để mô hình hóa các hiệu ứng này, và chúng được tích hợp trong hầu hết phần mềm thống kê dùng trong nghiên cứu lâm sàng.
- Môi trường và sinh thái học: Spline cũng xuất hiện khi mô hình hóa cách các loài hoặc biến khí hậu đáp ứng theo gradient môi trường. Những yếu tố như nhiệt độ, độ cao và lượng mưa thường có hiệu ứng phi tuyến lên các kết quả như độ phong phú loài hoặc năng suất cây trồng. Spline cho phép nhà nghiên cứu khớp đường đáp ứng mà không cần chỉ định hình dạng trước.
Trong tất cả các trường hợp này, spline cho bạn sự linh hoạt khi cần, mà không buộc bạn đoán dạng hàm của mối quan hệ. Điều đó khiến chúng phù hợp cho mô hình khám phá và là lựa chọn vững chắc cho mô hình sản xuất khi tính diễn giải quan trọng.
Hồi quy spline trong Python
Python có ba cách phổ biến để khớp hồi quy spline: scikit-learn cho quy trình kiểu ML, patsy cho đặc tả mô hình dựa trên công thức, và statsmodels cho suy luận thống kê. Tôi sẽ lần lượt đi qua từng cách.
Dùng scikit-learn
scikit-learn cung cấp SplineTransformer, thứ chuyển một đặc trưng số thành tập các hàm cơ sở B-spline. Sau đó bạn đưa các đặc trưng này vào bất kỳ mô hình hồi quy tuyến tính nào.
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import SplineTransformer
from sklearn.pipeline import make_pipeline
# Data
np.random.seed(42)
x = np.linspace(0, 10, 100).reshape(-1, 1)
y = np.sin(x).ravel() + 0.3 * x.ravel() + np.random.normal(0, 0.3, 100)
# Spline features + linear regression pipeline
model = make_pipeline(
SplineTransformer(n_knots=5, degree=3),
LinearRegression()
)
model.fit(x, y)
y_pred = model.predict(x)
print("R^2 score:", model.score(x, y))

điểm R2 scikit-learn
SplineTransformer tạo cơ sở spline với 5 nút và đa thức bậc ba. Sau đó, LinearRegression tìm các hệ số cho từng hàm cơ sở. Bạn có thể thay thế bằng bất kỳ bộ hồi quy sklearn nào ở đây — ridge, lasso, bất cứ thứ gì khớp mô hình tuyến tính trên đặc trưng đã biến đổi.
Cách tiếp cận này phù hợp với quy trình sklearn, nhưng bạn sẽ không có đầu ra thống kê như sai số chuẩn hay p-value. Để có chúng, bạn sẽ muốn dùng patsy hoặc statsmodels.
Dùng patsy
patsy là giao diện dựa trên công thức để xây dựng ma trận thiết kế. Đây là thứ gần giống nhất với công thức mô hình của R trong Python, và là cách tiêu chuẩn để tạo đặc trưng spline dùng với statsmodels.
import numpy as np
import pandas as pd
from patsy import dmatrix
import statsmodels.api as sm
np.random.seed(42)
x = np.linspace(0, 10, 100)
y = np.sin(x) + 0.3 * x + np.random.normal(0, 0.3, 100)
df = pd.DataFrame({"x": x, "y": y})
# B-spline basis using patsy
spline_basis = dmatrix("bs(x, df=6, degree=3)", data=df, return_type="dataframe")
# Fit with statsmodels OLS
model = sm.OLS(df["y"], spline_basis).fit()
print(model.summary())

tóm tắt mô hình patsy
Hàm bs() trong công thức bảo patsy xây dựng cơ sở B-spline với 6 bậc tự do và bậc 3 (bậc ba). patsy trả về ma trận thiết kế, đưa thẳng vào sm.OLS(). Tham số df kiểm soát số lượng hàm cơ sở spline — giá trị cao hơn cho nhiều linh hoạt hơn, tương tự như thêm nhiều nút.
Nếu bạn muốn spline tự nhiên, chỉ cần đổi bs() thành ns():
spline_basis = dmatrix("ns(x, df=6)", data=df, return_type="dataframe")
Dùng statsmodels với công thức
statsmodels cũng có API công thức tích hợp với patsy. Đây là phiên bản gọn nhất khi bạn muốn một lệnh hồi quy spline kèm đầy đủ đầu ra thống kê.
import statsmodels.formula.api as smf
model = smf.ols("y ~ bs(x, df=7, degree=3)", data=df).fit()
print(model.summary())

tóm tắt mô hình statsmodels
summary() cung cấp hệ số cho từng hàm cơ sở spline, sai số chuẩn, p-value, và các thống kê độ khớp thường dùng. Bản thân các hệ số không diễn giải trực tiếp, vì mỗi hệ số tương ứng với một hàm cơ sở, không phải một đại lượng thực tế. Bạn diễn giải độ khớp bằng cách vẽ dự đoán trên toàn miền biến dự báo.
Với hầu hết quy trình thống kê, API công thức của statsmodels là lựa chọn tiện nhất. Dùng scikit-learn khi spline là một phần của pipeline ML lớn hơn.
Hồi quy spline trong R
R có hỗ trợ tích hợp tốt nhất cho spline trong số các ngôn ngữ phổ biến. Gói splines đi kèm base R, và hai hàm chính — bs() và ns() — hoạt động trực tiếp bên trong bất kỳ công thức hồi quy nào.
Hàm bs() tạo cơ sở B-spline. Hàm ns() tạo cơ sở spline bậc ba tự nhiên. Cả hai sinh ra một ma trận đặc trưng spline mà hệ thống công thức của R tự động chèn vào mô hình.
Dùng bs() cho B-spline
# Data
set.seed(42)
x <- seq(0, 10, length.out = 100)
y <- sin(x) + 0.3 * x + rnorm(100, sd = 0.3)
df <- data.frame(x = x, y = y)
# Cubic B-spline with 6 degrees of freedom
library(splines)
model <- lm(y ~ bs(x, df = 6, degree = 3), data = df)
summary(model)

đầu ra bs() trong R
Công thức y ~ bs(x, df = 6, degree = 3) bảo R thay x bằng một cơ sở B-spline bậc 3 với 6 bậc tự do. R xử lý phần còn lại — xây dựng ma trận cơ sở, khớp mô hình tuyến tính, và tạo đối tượng lm chuẩn với mọi chẩn đoán thường dùng.
Bạn có thể truyền trực tiếp vị trí các nút nếu muốn toàn quyền kiểm soát:
model <- lm(y ~ bs(x, knots = c(2, 5, 8), degree = 3), data = df)
Điều này đặt các nút tại x = 2, x = 5, và x = 8 thay vì để R tự chọn cho bạn.
Dùng ns() cho spline tự nhiên
Với spline bậc ba tự nhiên (loại có hành vi tuyến tính ngoài biên), hãy dùng ns():
model_natural <- lm(y ~ ns(x, df = 6), data = df)
summary(model_natural)

đầu ra ns() trong R
Cú pháp giống nhau, nhưng hành vi ở biên khác nhau. Spline tự nhiên thường là lựa chọn an toàn hơn khi bạn quan tâm đến dự đoán hoặc diễn giải gần rìa dữ liệu.
Diễn giải đầu ra
Các hệ số trong đầu ra summary() tương ứng với các hàm cơ sở spline, không phải đại lượng có thể diễn giải trực tiếp. Để thấy mô hình thực sự học gì, hãy dự đoán trên một lưới giá trị x và vẽ kết quả:
x_grid <- data.frame(x = seq(0, 10, length.out = 200))
preds <- predict(model, newdata = x_grid)
plot(df$x, df$y)
lines(x_grid$x, preds, col = "green", lwd = 2)

Diễn giải đầu ra trong R
Đây là mẫu hình tiêu chuẩn trong R: bạn khớp spline, dự đoán trên một lưới mịn, và chồng đường cong lên dữ liệu. R cũng cho phép bạn dùng các hạng spline cùng với các biến dự báo khác trong cùng công thức:
model_multi <- lm(y ~ ns(x, df = 6) + other_var, data = df)
Mô hình này khớp hiệu ứng phi tuyến cho x và hiệu ứng tuyến tính cho other_var trong cùng một mô hình. Chính sự linh hoạt đó là lý do spline được dùng rộng rãi trong các quy trình thống kê dựa trên R.
Ưu điểm của hồi quy spline
Dưới đây là vài ưu điểm của spline so với các mô hình machine learning phổ biến hơn:
- Mô hình hóa quan hệ phi tuyến mà không cần biết dạng: Bạn không phải cam kết một hình dạng hàm cụ thể. Spline để dữ liệu định hình đường cong, vì vậy bạn có thể mô hình hóa các khúc uốn, đoạn bình ổn, và đổi hướng mà không cần biết trước chúng xảy ra ở đâu.
- Đường khớp trơn và dễ diễn giải: Đầu ra là một đường cong liên tục, không phải một hộp đen. Bạn có thể vẽ spline, xem phản hồi thay đổi ra sao trên miền biến dự báo, và giải thích cho khán giả không kỹ thuật.
- Ổn định hơn đa thức bậc cao: Mỗi đoạn là đa thức bậc thấp, nên không mảnh nào có thể hành xử quá đà ở rìa. Hành vi ở biên được kiểm soát tốt hơn nhiều, đặc biệt với spline bậc ba tự nhiên.
- Tích hợp vào quy trình hồi quy hiện có: Spline hoạt động bên trong hồi quy tuyến tính chuẩn. Bạn có thể kết hợp với biến dự báo khác, regularization, hiệu ứng hỗn hợp, và mọi công cụ khác xây trên OLS.
Hạn chế của hồi quy spline
Giống hầu hết mô hình, spline có vài đánh đổi bạn cần biết:
- Chọn nút là phần khó: Việc chọn số lượng và vị trí nút tốn công. Mặc định đôi khi tốt, nhưng nhiều trường hợp bạn sẽ cần cross-validation hoặc kiến thức miền để có độ khớp tốt. Không có một quy tắc chung luôn đúng.
- Diễn giải khó hơn khi nhiều nút: Một spline với ba nút vẫn đủ đơn giản để diễn giải. Một spline với hai mươi nút thì không. Bạn vẫn có thể vẽ đường cong, nhưng giải thích mô hình đang làm gì một cách chặt chẽ trở nên khó hơn nhiều.
- Vẫn có thể overfit: Spline ổn định hơn đa thức bậc cao, nhưng không miễn nhiễm với overfitting. Quá nhiều nút, đặt nút kém, quá nhiều ngoại lệ, hoặc cỡ mẫu nhỏ đều có thể tạo ra mô hình khớp tốt dữ liệu huấn luyện nhưng thất bại trên dữ liệu mới.
- Hệ số không có ý nghĩa trực tiếp: Các hệ số khớp tương ứng với các hàm cơ sở, không phải đại lượng thực tế. Bạn không thể đọc ra "x tăng một đơn vị làm y thay đổi beta" như với hồi quy tuyến tính. Bạn phải diễn giải trực quan độ khớp.
Lỗi thường gặp với hồi quy spline
Dưới đây là vài lỗi mà người mới hay mắc với hồi quy spline:
- Dùng quá nhiều nút: Người mới thường thêm nút cho đến khi đường khớp nhìn đẹp trên dữ liệu huấn luyện. Đây là bẫy overfitting kinh điển. Nếu spline lắc lư giữa mọi quan sát, bạn có quá nhiều nút. Hãy cross-validate hoặc bắt đầu với ít nút và chỉ thêm khi phần dư cho thấy mẫu rõ ràng.
- Dùng quá ít nút và cho rằng dữ liệu tuyến tính: Lỗi ngược lại. Nếu bạn khớp spline với một hoặc hai nút và phần dư vẫn cho thấy độ cong, mô hình đang underfit. Spline đơn giản là không có đủ đoạn để theo mẫu thực. Hãy thêm nút ở vùng phần dư sai lệch.
- Hiểu sai hành vi ở biên: Spline bậc ba thông thường có thể cư xử thất thường gần rìa dữ liệu. Nếu bạn dự đoán gần biên (hoặc ngoại suy ra ngoài), hãy dùng spline bậc ba tự nhiên. Chúng buộc hành vi tuyến tính ngoài các nút biên và tránh dao động mà spline bậc ba thường có thể tạo ra.
- So sánh trực tiếp spline với mô hình phi tuyến không ràng buộc: Spline không cố gắng trở thành mạng nơ-ron hay random forest. Nếu bạn so đọ spline với mô hình hộp đen phi tuyến hoàn toàn về độ chính xác dự đoán thô, mô hình hộp đen thường thắng về hiệu năng thuần. Nhưng đó không phải mục tiêu. Spline thắng ở khả năng diễn giải và khả năng tích hợp vào suy luận thống kê truyền thống.
Hồi quy spline so với các kỹ thuật mô hình hóa phi tuyến khác
Spline không phải cách duy nhất để mô hình hóa mối quan hệ phi tuyến, nhưng chúng hữu ích nếu bạn quan tâm đến diễn giải. Dưới đây là so sánh với các lựa chọn phổ biến nhất.
Hồi quy đa thức
Hồi quy đa thức dùng một phương trình toàn cục. Dễ đặc tả hơn nhưng kém ổn định, đặc biệt ở biên. Spline vượt trội đa thức về linh hoạt và ổn định khi mối quan hệ có hơn một khúc uốn. Đa thức chỉ dễ diễn giải ở bậc rất thấp (2 hoặc 3). Vượt qua đó, spline trở nên vừa đáng tin cậy hơn vừa dễ diễn giải hơn.
Mô hình cộng tuyến tính tổng quát (GAM)
GAM về bản chất là spline ở quy mô lớn. GAM cho phép bạn khớp một spline cho mỗi biến dự báo độc lập và cộng chúng lại theo cách cộng tính. Bạn có thể coi hồi quy spline là GAM một biến, và GAM là tổng các spline trên nhiều biến.
GAM xử lý nhiều biến dự báo phi tuyến gọn gàng hơn so với tự khớp spline cho từng biến. Chúng cũng bao gồm các phạt làm trơn để chọn đúng mức linh hoạt, giúp bớt việc chọn nút. Nếu bạn làm việc với nhiều biến dự báo và vài biến cần xử lý phi tuyến, GAM thường là lựa chọn tốt hơn.
Cây quyết định
Cây quyết định tiếp cận hoàn toàn khác. Thay vì khớp một đường cong trơn, chúng chia không gian biến dự báo thành các vùng hình chữ nhật và dự đoán một giá trị hằng trong mỗi vùng. Kết quả là một hàm bậc thang.
Cây linh hoạt hơn spline ở vài khía cạnh — có thể mô hình hóa tương tác và thay đổi đột ngột. Nhưng hàm khớp không trơn hay liên tục. Nó cũng không khái quát tốt ở vùng thưa dữ liệu. Spline tốt hơn khi bạn quan tâm đến độ trơn và ngoại suy ổn định. Cây tốt hơn khi bạn muốn mô hình hóa ranh giới sắc nét hay tương tác trên nhiều biến.
Vì sao hồi quy spline quan trọng
Spline ở khắp nơi trong thống kê ứng dụng. Chúng xuất hiện trong nghiên cứu lâm sàng, phân tích kinh tế, khoa học môi trường, mô hình chuỗi thời gian, và bất kỳ lĩnh vực nào cần mô hình hóa hiệu ứng phi tuyến trơn mà không dùng mô hình hộp đen.
Lý do là sự cân bằng chúng mang lại — đủ linh hoạt để xử lý dữ liệu lộn xộn, nhưng đủ cấu trúc để vẫn diễn giải và ổn định.
Chúng cũng là nền tảng cho các phương pháp nâng cao hơn. Mô hình cộng tuyến tính tổng quát xây trực tiếp trên spline, smoothing spline mở rộng ý tưởng với regularization tích hợp, và nhiều kỹ thuật hồi quy phi tuyến hiện đại dùng cơ sở spline. Nếu bạn muốn hiểu những phương pháp này, trước hết bạn phải hiểu spline.
Vì vậy spline quan trọng vì chúng thực dụng và vì chúng là viên gạch xây nên nhiều thứ tiếp theo. Chúng không phải mô hình mạnh mẽ nhất, nhưng là một trong những mô hình đáng tin cậy nhất — và đó thường là điều quan trọng.
Kết luận
Hồi quy spline mô hình hóa mối quan hệ phi tuyến bằng cách kết hợp các đa thức theo từng đoạn tại các điểm gọi là nút. Đó là ý tưởng, và phần còn lại là các biến thể của nó.
Nút và độ trơn là hai ý niệm bạn cần nắm vững. Mọi thứ khác (các loại spline, biểu diễn cơ sở, triển khai trong R và Python) chỉ là những cách khác nhau để làm việc với hai khái niệm đó.
Hãy thử vài loại spline trên dữ liệu của bạn. So sánh spline bậc ba, bậc ba tự nhiên, và B-spline. Dịch chuyển các nút và xem điều gì xảy ra. Cứ thử nghiệm, vì tính trực quan của đường khớp giúp bạn dễ thấy tác động của từng lựa chọn.
Nếu bạn muốn đào sâu hơn vào toán học đằng sau spline và nhiều thuật toán khác, hãy đăng ký lộ trình Machine Learning Scientist in Python của chúng tôi. Nó có mọi thứ bạn cần để sẵn sàng đi làm vào năm 2026.
Câu hỏi thường gặp về Hồi quy Spline
Hồi quy spline nói đơn giản là gì?
Hồi quy spline là cách mô hình hóa các mối quan hệ cong trong dữ liệu bằng cách chia miền biến dự báo thành các đoạn và khớp một đa thức nhỏ trong mỗi đoạn. Các đoạn được nối mượt tại các điểm gọi là nút, nên kết quả tổng thể là một đường cong liên tục. Nó linh hoạt hơn hồi quy tuyến tính và ổn định hơn hồi quy đa thức bậc cao.
Khi nào tôi nên dùng hồi quy spline thay vì hồi quy tuyến tính?
Hãy dùng hồi quy spline khi mối quan hệ giữa biến dự báo và kết quả không phải đường thẳng. Nếu mô hình tuyến tính để lại các mẫu trong phần dư — ví dụ lỗi dương ở giữa và âm ở hai đầu miền dữ liệu — đó là dấu hiệu mối quan hệ phi tuyến.
Nút (knots) trong hồi quy spline là gì?
Nút là các điểm dọc theo trục biến dự báo nơi một đoạn đa thức kết thúc và đoạn tiếp theo bắt đầu. Chúng kiểm soát độ linh hoạt của spline. Nhiều nút hơn nghĩa là đường cong có thể uốn ở nhiều nơi hơn. Chọn đúng số lượng và vị trí nút là quyết định trung tâm trong hồi quy spline. Quá ít dẫn đến underfit, quá nhiều dẫn đến overfit.
Sự khác nhau giữa spline bậc ba và spline bậc ba tự nhiên là gì?
Cả hai đều khớp đa thức bậc ba giữa các nút, nhưng khác nhau ở cách cư xử tại biên dữ liệu. Spline bậc ba thường có thể cư xử khó lường gần rìa vì mỗi đầu vẫn là một đa thức bậc ba đầy đủ. Spline bậc ba tự nhiên buộc đường cong tuyến tính ngoài các nút ngoài cùng, giúp dự đoán gần hoặc vượt biên ổn định hơn nhiều.
Tôi chọn số lượng nút cho mô hình spline như thế nào?
Bắt đầu với 3–5 nút đặt tại các phân vị của biến dự báo để mỗi đoạn có số quan sát tương tự nhau. Nếu phần dư cho thấy các mẫu mà spline chưa bắt được, hãy thêm một nút ở vùng đó. Để chặt chẽ hơn, dùng cross-validation để so sánh các số nút khác nhau và chọn cấu hình có lỗi xác thực thấp nhất.
