Trong chương này, chúng ta sẽ khám phá cách khớp các mô hình tuyến tính chung trong Python. Chúng tôi sẽ tập trung vào các công cụ được cung cấp bởi gói
3
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
Hồi quy tuyến tính
Để thực hiện hồi quy tuyến tính trong Python, chúng tôi sử dụng hàm
4 [viết tắt của bình phương nhỏ nhất thông thường] từ gói
3. Hãy tạo một số dữ liệu mô phỏng và sử dụng hàm này để tính toán giải pháp hồi quy tuyến tính
import numpy as np import pandas as pd import matplotlib.pyplot as plt def generate_linear_data[slope, intercept, noise_sd=1, x=None, npoints=100, seed=None]: """ generate data with a given slope and intercept and add normally distributed noise if x is passed as an argument then a given x will be used, otherwise it will be generated randomly Returns: -------- a pandas data frame with variables x and y """ if seed is not None: np.random.seed[seed] if x is None: x = np.random.randn[npoints] y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd return[pd.DataFrame[{'x': x, 'y': y}]] slope = 1 intercept = 10 noise_sd = 1 simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1] plt.scatter[simulated_data['x'], simulated_data['y']]
Sau đó, chúng ta có thể thực hiện hồi quy tuyến tính trên những dữ liệu này bằng cách sử dụng hàm
6. Chức năng này không tự động bao gồm một phần chặn trong mô hình của nó, vì vậy chúng tôi cần thêm một phần vào thiết kế. Lắp mô hình bằng chức năng này là một quy trình gồm hai bước. Đầu tiên, chúng tôi thiết lập mô hình và lưu trữ nó vào một biến [mà chúng tôi sẽ gọi là
7]. Sau đó, chúng tôi thực sự điều chỉnh mô hình, mô hình này tạo ra kết quả mà chúng tôi lưu trữ vào một biến khác có tên là
8 và xem tóm tắt bằng phương pháp
9 của biến kết quả
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']0
Kết quả hồi quy OLSDep. Biến đổi. yR-bình phương. 0. 522Mô hình. OLSAdj. bình phương R. 0. 517Phương pháp. Số bình phương nhỏ nhất F-statistic. 107. 0Ngày. Thứ ba, ngày 31 tháng 8 năm 2021Prob [F-statistic]. 2. 20e-17Thời gian. 14. 59. 55Log-Khả năng. -134. 44Không. quan sát. 100AIC. 272. 9Df dư. 98BIC. 278. Mô hình 1Df. 1Loại hiệp phương sai. nonrobustcoefstd errtP>. t. [0. 0250. 975]Đánh chặn10. 14700. 094107. 9730. 0009. 96110. 334x1. 09540. 10610. 3420. 0000. 8851. 306Xe vạn năng. 0. 898Durbin-Watson. 2. 157Prob[Xe đa năng]. 0. 638Jarque-Bera [JB]. 0. 561Xiên. -0. 172Prob[JB]. 0. 755Kurtosis. 3. 127Điều kiện. Không. 1. 15
Cảnh báo.
[1] Lỗi chuẩn giả định rằng ma trận hiệp phương sai của các lỗi được chỉ định chính xác.
Chúng ta sẽ thấy ba điều trong những kết quả này
Ước tính của Giao điểm trong mô hình phải rất gần với giao điểm chặn mà chúng tôi đã chỉ định
Ước tính cho tham số x phải rất gần với độ dốc mà chúng tôi đã chỉ định
Độ lệch chuẩn dư phải gần giống với độ lệch chuẩn nhiễu mà chúng tôi đã chỉ định. Bản tóm tắt không trực tiếp báo cáo độ lệch chuẩn còn lại nhưng chúng ta có thể tính toán nó bằng cách sử dụng số dư được lưu trữ trong phần tử
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']
00 ở đầu ra kết quả
Phê bình và chẩn đoán mô hình
Khi chúng tôi đã lắp mô hình, chúng tôi muốn xem xét một số chẩn đoán để xác định xem mô hình có thực sự vừa vặn hay không.
Điều đầu tiên cần kiểm tra là đảm bảo rằng phần dư [ít nhất là đại khái] có phân phối chuẩn. Chúng ta có thể làm điều này bằng cách sử dụng biểu đồ QQ.
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']2
Điều này có vẻ khá tốt, theo nghĩa là các điểm dữ liệu còn lại rất gần với đường đơn vị. Điều này không có gì đáng ngạc nhiên, vì chúng tôi đã tạo dữ liệu với nhiễu phân phối bình thường. Chúng ta cũng nên vẽ các giá trị dự đoán [hoặc phù hợp] với phần dư, để đảm bảo rằng mô hình hoạt động tốt hơn một cách có hệ thống đối với một số giá trị dự đoán so với các giá trị khác
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']3
Như mong đợi, chúng tôi thấy không có mối quan hệ rõ ràng
Ví dụ về sự phù hợp của mô hình có vấn đề
Giả sử rằng có một biến khác đang diễn ra trong tập dữ liệu này mà chúng tôi không biết. Biến này khiến một số trường hợp có giá trị lớn hơn nhiều so với các trường hợp khác, theo cách không liên quan đến biến X. Ở đây chúng tôi chơi một mẹo nhỏ bằng cách sử dụng hàm
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']01 để tạo một chuỗi từ 0 đến 1, sau đó đặt ngưỡng cho các 0 đó. 5 [để lấy một nửa giá trị bằng 0 và nửa còn lại bằng một] rồi nhân với kích thước hiệu ứng mong muốn
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']5
Bây giờ chúng ta điều chỉnh mô hình một lần nữa và kiểm tra phần dư
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']6
Sự thiếu chuẩn mực rõ ràng từ cốt truyện QQ và chúng ta cũng có thể thấy rằng có một cấu trúc rõ ràng trong phần dư
Hãy xem xét một vấn đề tiềm ẩn khác, trong đó biến y có quan hệ phi tuyến với biến X. Chúng ta có thể tạo những dữ liệu này bằng cách bình phương biến X khi chúng ta tạo biến Y
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']7
import numpy as np import pandas as pd import matplotlib.pyplot as plt def generate_linear_data[slope, intercept, noise_sd=1, x=None, npoints=100, seed=None]: """ generate data with a given slope and intercept and add normally distributed noise if x is passed as an argument then a given x will be used, otherwise it will be generated randomly Returns: -------- a pandas data frame with variables x and y """ if seed is not None: np.random.seed[seed] if x is None: x = np.random.randn[npoints] y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd return[pd.DataFrame[{'x': x, 'y': y}]] slope = 1 intercept = 10 noise_sd = 1 simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1] plt.scatter[simulated_data['x'], simulated_data['y']]0
Kết quả hồi quy OLSDep. Biến đổi. y3R-bình phương. 0. 008Mô hình. OLSAdj. bình phương R. -0. 002Phương pháp. Số bình phương nhỏ nhất F-statistic. 0. 8369Ngày. Thứ ba, ngày 31 tháng 8 năm 2021Prob [F-statistic]. 0. 363Time. 14. 59. 56Log-Khả năng. -149. 89Không. quan sát. 100AIC. 303. Dư 8Df. 98BIC. 309. 0Df Mẫu. 1Loại hiệp phương sai. nonrobustcoefstd errtP>. t. [0. 0250. 975]Đánh chặn10. 78130. 11098. 2950. 00010. 56410. 999x0. 11310. 1240. 9150. 363-0. 1320. 358Toàn thể. 62. 137Durbin-Watson. 1. 699Prob[Xe đa năng]. 0. 000Jarque-Bera [JB]. 203. 933Xiên. 2. 285Prob[JB]. 5. 21e-45Kurtosis. 8. 297Điều kiện. Không. 1. 15
Cảnh báo.
[1] Lỗi chuẩn giả định rằng ma trận hiệp phương sai của các lỗi được chỉ định chính xác.
Bây giờ chúng ta thấy rằng không có mối quan hệ tuyến tính đáng kể nào giữa \[X^2\] và Y/ Nhưng nếu chúng ta xem xét phần dư thì vấn đề với mô hình sẽ trở nên rõ ràng
plt. hình[figsize=[12, 6]] plt. ô con [1, 2, 1] scipy. số liệu thống kê. probplot[ols_result3. cư trú, cốt truyện = sns. mpl. pyplot]
plt. ô con[1, 2, 2] plt. phân tán [ols_result3. giá trị được trang bị, ols_result3. cư trú] plt. xlabel['Giá trị vừa vặn'] plt. ylabel['Dư']
Trong trường hợp này, chúng ta có thể thấy mối quan hệ phi tuyến tính rõ ràng giữa giá trị dự đoán và giá trị phần dư, cũng như sự thiếu chuẩn tắc rõ ràng trong phần dư
Như chúng ta đã lưu ý trong chương trước, “tuyến tính” trong mô hình tuyến tính chung không đề cập đến hình dạng của phản ứng, mà thay vào đó đề cập đến thực tế là mô hình là tuyến tính trong các tham số của nó - nghĩa là các yếu tố dự đoán trong mô hình . g. , thay vì được nâng lên lũy thừa của tham số]. Đây là cách chúng tôi xây dựng một mô hình có thể giải thích cho mối quan hệ phi tuyến tính, bằng cách sử dụng
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']02 trong mô hình
import numpy as np import pandas as pd import matplotlib.pyplot as plt def generate_linear_data[slope, intercept, noise_sd=1, x=None, npoints=100, seed=None]: """ generate data with a given slope and intercept and add normally distributed noise if x is passed as an argument then a given x will be used, otherwise it will be generated randomly Returns: -------- a pandas data frame with variables x and y """ if seed is not None: np.random.seed[seed] if x is None: x = np.random.randn[npoints] y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd return[pd.DataFrame[{'x': x, 'y': y}]] slope = 1 intercept = 10 noise_sd = 1 simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1] plt.scatter[simulated_data['x'], simulated_data['y']]1
Kết quả hồi quy OLSDep. Biến đổi. y3R-bình phương. 0. 992Mô hình. OLSAdj. bình phương R. 0. 992Phương pháp. Số bình phương nhỏ nhất F-statistic. 1. 243e+04Ngày. Thứ ba, ngày 31 tháng 8 năm 2021Prob [F-statistic]. 4. 87e-105Thời gian. 14. 59. 56Log-Khả năng. 92. 204Không. quan sát. 100AIC. -180. Dư 4Df. 98BIC. -175. Mô hình 2Df. 1Loại hiệp phương sai. nonrobustcoefstd errtP>. t. [0. 0250. 975]Đánh chặn10. 02150. 012841. 5680. 0009. 99810. 045x_squared0. 97400. 009111. 4730. 0000. 9570. 991Xe buýt toàn năng. 0. 981Durbin-Watson. 2. 260Prob[Xe đa năng]. 0. 612Jarque-Bera [JB]. 1. 073Xiên. 0. 216Prob[JB]. 0. 585Kurtosis. 2. 735Cond. Không. 2. 09
Cảnh báo.
[1] Lỗi chuẩn giả định rằng ma trận hiệp phương sai của các lỗi được chỉ định chính xác.
Bây giờ chúng ta thấy rằng ảnh hưởng của \[X^2\] là đáng kể và nếu chúng ta nhìn vào biểu đồ còn lại, chúng ta sẽ thấy rằng mọi thứ có vẻ tốt hơn nhiều
import numpy as np import pandas as pd import matplotlib.pyplot as plt def generate_linear_data[slope, intercept, noise_sd=1, x=None, npoints=100, seed=None]: """ generate data with a given slope and intercept and add normally distributed noise if x is passed as an argument then a given x will be used, otherwise it will be generated randomly Returns: -------- a pandas data frame with variables x and y """ if seed is not None: np.random.seed[seed] if x is None: x = np.random.randn[npoints] y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd return[pd.DataFrame[{'x': x, 'y': y}]] slope = 1 intercept = 10 noise_sd = 1 simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1] plt.scatter[simulated_data['x'], simulated_data['y']]2
Không hoàn hảo, nhưng tốt hơn nhiều so với trước đây
Mở rộng hồi quy cho kết quả nhị phân
import numpy as np import pandas as pd import matplotlib.pyplot as plt def generate_linear_data[slope, intercept, noise_sd=1, x=None, npoints=100, seed=None]: """ generate data with a given slope and intercept and add normally distributed noise if x is passed as an argument then a given x will be used, otherwise it will be generated randomly Returns: -------- a pandas data frame with variables x and y """ if seed is not None: np.random.seed[seed] if x is None: x = np.random.randn[npoints] y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd return[pd.DataFrame[{'x': x, 'y': y}]] slope = 1 intercept = 10 noise_sd = 1 simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1] plt.scatter[simulated_data['x'], simulated_data['y']]3
Bây giờ chúng tôi muốn xây dựng một mô hình cho phép chúng tôi dự đoán ai mắc bệnh tiểu đường, dựa trên tuổi và Chỉ số khối cơ thể [BMI] của họ. Tuy nhiên, bạn có thể nhận thấy rằng biến Bệnh tiểu đường là một biến nhị phân; . Chúng ta có thể điều chỉnh mô hình này bằng hàm
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']03
import numpy as np import pandas as pd import matplotlib.pyplot as plt def generate_linear_data[slope, intercept, noise_sd=1, x=None, npoints=100, seed=None]: """ generate data with a given slope and intercept and add normally distributed noise if x is passed as an argument then a given x will be used, otherwise it will be generated randomly Returns: -------- a pandas data frame with variables x and y """ if seed is not None: np.random.seed[seed] if x is None: x = np.random.randn[npoints] y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd return[pd.DataFrame[{'x': x, 'y': y}]] slope = 1 intercept = 10 noise_sd = 1 simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1] plt.scatter[simulated_data['x'], simulated_data['y']]4
Kết quả hồi quy logitDep. Biến đổi. Bệnh tiểu đườngKhông. quan sát. 5267Mô hình. Phần dư LogitDf. 5264Phương pháp. Mô hình MLEDf. 2Ngày. Thứ ba, ngày 31 tháng 8 năm 2021Pseudo R-squ. 0. 1661Thời gian. 14. 59. 56Log-Khả năng. -1895. 1 hội tụ. TrueLL-Null. -2272. 6Loại hiệp phương sai. giá trị p nonrobustLLR. 1. 122e-164coefstd errzP>. z. [0. 0250. 975]Đánh chặn-7. 31010. 276-26. 4780. 000-7. 851-6. 769Tuổi0. 06220. 00321. 7630. 0000. 0570. 068BMI0. 06930. 00512. 7690. 0000. 0590. 080
Điều này trông rất giống với kết quả đầu ra từ hàm
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']04 và nó cho chúng ta thấy rằng có một mối quan hệ đáng kể giữa tuổi, cân nặng và bệnh tiểu đường. Mô hình cung cấp cho chúng tôi xác suất dự đoán rằng mỗi cá nhân sẽ mắc bệnh tiểu đường; . 5, thì điều đó có nghĩa là mô hình dự đoán rằng cá nhân đó có nhiều khả năng mắc bệnh tiểu đường hơn là không mắc bệnh tiểu đường.
Chúng ta có thể bắt đầu bằng cách so sánh những dự đoán đó với kết quả thực tế.
import numpy as np import pandas as pd import matplotlib.pyplot as plt def generate_linear_data[slope, intercept, noise_sd=1, x=None, npoints=100, seed=None]: """ generate data with a given slope and intercept and add normally distributed noise if x is passed as an argument then a given x will be used, otherwise it will be generated randomly Returns: -------- a pandas data frame with variables x and y """ if seed is not None: np.random.seed[seed] if x is None: x = np.random.randn[npoints] y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd return[pd.DataFrame[{'x': x, 'y': y}]] slope = 1 intercept = 10 noise_sd = 1 simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1] plt.scatter[simulated_data['x'], simulated_data['y']]5
LogitPrediction01Tiểu đường0440050175661
Bảng này cho thấy mô hình đã làm khá tốt, ở chỗ nó dán nhãn hầu hết những người không mắc bệnh tiểu đường là không mắc bệnh tiểu đường và hầu hết những người mắc bệnh tiểu đường là mắc bệnh tiểu đường. Tuy nhiên, nó cũng mắc rất nhiều sai lầm, ghi nhầm gần một nửa số người mắc bệnh tiểu đường là không mắc bệnh tiểu đường.
Chúng tôi thường muốn một con số duy nhất cho chúng tôi biết dự đoán của chúng tôi tốt như thế nào. Chúng ta có thể đơn giản hỏi trung bình có bao nhiêu dự đoán của chúng ta đúng
import numpy as np import pandas as pd import matplotlib.pyplot as plt def generate_linear_data[slope, intercept, noise_sd=1, x=None, npoints=100, seed=None]: """ generate data with a given slope and intercept and add normally distributed noise if x is passed as an argument then a given x will be used, otherwise it will be generated randomly Returns: -------- a pandas data frame with variables x and y """ if seed is not None: np.random.seed[seed] if x is None: x = np.random.randn[npoints] y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd return[pd.DataFrame[{'x': x, 'y': y}]] slope = 1 intercept = 10 noise_sd = 1 simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1] plt.scatter[simulated_data['x'], simulated_data['y']]6
Điều này cho chúng tôi biết rằng chúng tôi đang dự đoán khá tốt, với độ chính xác trên 80%. Tuy nhiên, biện pháp này có vấn đề, vì hầu hết những người trong mẫu không mắc bệnh tiểu đường. Điều này có nghĩa là chúng ta có thể đạt được độ chính xác tương đối cao nếu chúng ta chỉ đơn giản nói rằng không có ai mắc bệnh tiểu đường
import numpy as np import pandas as pd import matplotlib.pyplot as plt def generate_linear_data[slope, intercept, noise_sd=1, x=None, npoints=100, seed=None]: """ generate data with a given slope and intercept and add normally distributed noise if x is passed as an argument then a given x will be used, otherwise it will be generated randomly Returns: -------- a pandas data frame with variables x and y """ if seed is not None: np.random.seed[seed] if x is None: x = np.random.randn[npoints] y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd return[pd.DataFrame[{'x': x, 'y': y}]] slope = 1 intercept = 10 noise_sd = 1 simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1] plt.scatter[simulated_data['x'], simulated_data['y']]7
Một giá trị thường được sử dụng khi chúng ta có dự đoán được phân loại [như chúng ta làm ở đây, với xác suất được dự đoán bởi mô hình] được gọi là khu vực dưới đặc tính vận hành máy thu hoặc AUROC. Đây là một số nằm trong khoảng từ 0 đến 1, trong đó 0. 5 có nghĩa là chúng tôi đang đoán và một có nghĩa là dự đoán của chúng tôi là hoàn hảo. Hãy xem điều gì sẽ xảy ra với tập dữ liệu này, sử dụng
from nhanes.load import load_NHANES_data nhanes_data = load_NHANES_data[] adult_nhanes_data = nhanes_data.query['AgeInYearsAtScreening > 17']05 từ gói scikit-learn
import numpy as np import pandas as pd import matplotlib.pyplot as plt def generate_linear_data[slope, intercept, noise_sd=1, x=None, npoints=100, seed=None]: """ generate data with a given slope and intercept and add normally distributed noise if x is passed as an argument then a given x will be used, otherwise it will be generated randomly Returns: -------- a pandas data frame with variables x and y """ if seed is not None: np.random.seed[seed] if x is None: x = np.random.randn[npoints] y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd return[pd.DataFrame[{'x': x, 'y': y}]] slope = 1 intercept = 10 noise_sd = 1 simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1] plt.scatter[simulated_data['x'], simulated_data['y']]8
Mô hình của chúng tôi hoạt động tương đối tốt theo điểm số này. Điều gì sẽ xảy ra nếu chúng ta muốn biết liệu điều này có tốt hơn cơ hội không? . Sau đó, chúng tôi có thể hỏi khả năng điểm số quan sát của chúng tôi sẽ như thế nào nếu không có mối quan hệ thực sự
import numpy as np import pandas as pd import matplotlib.pyplot as plt def generate_linear_data[slope, intercept, noise_sd=1, x=None, npoints=100, seed=None]: """ generate data with a given slope and intercept and add normally distributed noise if x is passed as an argument then a given x will be used, otherwise it will be generated randomly Returns: -------- a pandas data frame with variables x and y """ if seed is not None: np.random.seed[seed] if x is None: x = np.random.randn[npoints] y = x * slope + intercept + np.random.randn[x.shape[0]] * noise_sd return[pd.DataFrame[{'x': x, 'y': y}]] slope = 1 intercept = 10 noise_sd = 1 simulated_data = generate_linear_data[slope, intercept, noise_sd, seed=1] plt.scatter[simulated_data['x'], simulated_data['y']]9
Điều này cho chúng tôi thấy rằng điểm quan sát của chúng tôi cao hơn tất cả 1000 điểm thu được bằng cách sử dụng hoán vị ngẫu nhiên. Vì vậy, chúng tôi có thể kết luận rằng độ chính xác của chúng tôi lớn hơn cơ hội. Tuy nhiên, điều này không cho chúng ta biết chúng ta có thể dự đoán liệu một người mới có mắc bệnh tiểu đường hay không. Đây là những gì chúng ta chuyển sang tiếp theo
xác thực chéo
Xác thực chéo là một kỹ thuật mạnh mẽ cho phép chúng tôi ước tính kết quả của chúng tôi sẽ tổng quát hóa tốt như thế nào đối với một tập dữ liệu mới. Ở đây chúng ta sẽ xây dựng mã xác thực chéo của riêng mình để xem nó hoạt động như thế nào, tiếp tục ví dụ về hồi quy logistic từ phần trước. Trong xác thực chéo, chúng tôi muốn chia dữ liệu thành nhiều tập hợp con và sau đó đào tạo mô hình lặp lại trong khi loại bỏ từng tập hợp con [mà chúng tôi thường gọi là nếp gấp] và sau đó kiểm tra mô hình trên nếp gấp được giữ lại đó. Chúng tôi có thể sử dụng một trong các công cụ từ gói scikit-learning để tạo các nếp gấp xác thực chéo cho chúng tôi. Hãy bắt đầu bằng cách sử dụng xác thực chéo 10 lần, trong đó chúng tôi chia dữ liệu thành 10 phần và khớp với mô hình trong khi giữ lại một trong những phần đó và sau đó thử nghiệm nó trên dữ liệu đã loại bỏ
0
1
2
Kết quả này cho thấy mô hình của chúng tôi có thể khái quát hóa tương đối tốt cho các cá nhân mới — trên thực tế, gần như tốt như mô hình ban đầu. Điều này là do cỡ mẫu của chúng tôi rất lớn;