Hướng dẫn train test split and cross validation in python - đào tạo thử nghiệm tách và xác thực chéo trong python

Chào mọi người! Sau bài đăng cuối cùng của tôi về hồi quy tuyến tính trong Python, tôi nghĩ rằng sẽ chỉ là tự nhiên để viết một bài viết về phân chia tàu/thử nghiệm và xác nhận chéo. Như thường lệ, tôi sẽ đưa ra một cái nhìn tổng quan ngắn về chủ đề và sau đó đưa ra một ví dụ về việc thực hiện nó trong Python. Đây là hai khái niệm khá quan trọng trong khoa học dữ liệu và phân tích dữ liệu và được sử dụng làm công cụ để ngăn chặn (hoặc ít nhất là giảm thiểu) quá mức). Tôi sẽ giải thích đó là gì - ví dụ khi chúng ta sử dụng mô hình thống kê (như hồi quy tuyến tính), chúng ta thường phù hợp với mô hình trên một tập huấn luyện để đưa ra dự đoán về dữ liệu không được đào tạo (dữ liệu chung ). Quá mức có nghĩa là những gì chúng tôi phù hợp với mô hình quá nhiều với dữ liệu đào tạo. Tất cả sẽ có ý nghĩa khá sớm, tôi hứa!

Những gì là quá mức/thiếu hụt một mô hình?

Như đã đề cập, trong thống kê và học máy, chúng tôi thường chia dữ liệu của mình thành hai tập hợp dữ liệu thử nghiệm. Khi chúng tôi làm điều đó, một trong hai điều có thể xảy ra: chúng tôi đã vượt qua mô hình của chúng tôi hoặc chúng tôi không thể làm hỏng mô hình của chúng tôi. Chúng tôi không muốn bất kỳ điều gì trong số những điều này xảy ra, bởi vì chúng ảnh hưởng đến khả năng dự đoán của mô hình của chúng tôi - chúng tôi có thể sử dụng một mô hình có độ chính xác thấp hơn và/hoặc không thể gen được (có nghĩa là bạn có thể khái quát các dự đoán của mình trên dữ liệu khác). Hãy cùng xem những gì dưới và quá mức thực sự có nghĩa là:

Quá mức

Việc quá mức có nghĩa là mô hình mà chúng tôi đã đào tạo đã đào tạo quá tốt và bây giờ, tốt, phù hợp quá chặt chẽ với bộ dữ liệu đào tạo. Điều này thường xảy ra khi mô hình quá phức tạp (tức là quá nhiều tính năng/biến so với số lượng quan sát). Mô hình này sẽ rất chính xác trên dữ liệu đào tạo nhưng có lẽ sẽ không chính xác trên dữ liệu chưa được đào tạo hoặc mới. Đó là bởi vì mô hình này không được khái quát hóa (hoặc không được khái quát hóa), có nghĩa là bạn có thể khái quát kết quả và có thể đưa ra bất kỳ suy luận nào về dữ liệu khác, cuối cùng, đó là những gì bạn đang cố gắng làm. Về cơ bản, khi điều này xảy ra, mô hình học hoặc mô tả tiếng ồn trên mạng trong dữ liệu đào tạo thay vì các mối quan hệ thực tế giữa các biến trong dữ liệu. Tiếng ồn này, rõ ràng, là một phần của bất kỳ bộ dữ liệu mới nào và không thể được áp dụng cho nó.

Thiếu hụt

Trái ngược với quá mức, khi một mô hình bị thiếu, điều đó có nghĩa là mô hình không phù hợp với dữ liệu đào tạo và do đó bỏ lỡ các xu hướng trong dữ liệu. Nó cũng có nghĩa là mô hình không thể được khái quát hóa thành dữ liệu mới. Như bạn có thể đoán (hoặc tìm ra!), Đây thường là kết quả của một mô hình rất đơn giản (không đủ các yếu tố dự đoán/biến độc lập). Nó cũng có thể xảy ra khi, ví dụ, chúng tôi phù hợp với mô hình tuyến tính (như hồi quy tuyến tính) với dữ liệu không phải là tuyến tính. Nó gần như không cần phải nói rằng mô hình này sẽ có khả năng dự đoán kém (trên dữ liệu đào tạo và có thể được khái quát hóa cho các dữ liệu khác).

Một ví dụ về quá mức, thiếu hụt và một mô hình mà Lừa Điên vừa phải!

Điều đáng chú ý là sự thiếu hụt không phải là phổ biến như quá mức. Tuy nhiên, chúng tôi muốn tránh cả hai vấn đề đó trong phân tích dữ liệu. Bạn có thể nói rằng chúng tôi đang cố gắng tìm ra nền tảng giữa giữa và quá mức mô hình của chúng tôi. Như bạn sẽ thấy, việc phân chia đào tạo/kiểm tra và xác nhận chéo giúp tránh quá mức hơn là thiếu hụt. Hãy để đi sâu vào cả hai!

Đội hình/bài kiểm tra

Như tôi đã nói trước đây, dữ liệu chúng tôi sử dụng thường được chia thành dữ liệu đào tạo và dữ liệu kiểm tra. Bộ đào tạo chứa một đầu ra đã biết và mô hình tìm hiểu về dữ liệu này để được khái quát hóa cho các dữ liệu khác sau này. Chúng tôi có bộ dữ liệu thử nghiệm (hoặc tập hợp con) để kiểm tra dự đoán mô hình của chúng tôi trên tập hợp con này.

Đội hình/bài kiểm tra

Như tôi đã nói trước đây, dữ liệu chúng tôi sử dụng thường được chia thành dữ liệu đào tạo và dữ liệu kiểm tra. Bộ đào tạo chứa một đầu ra đã biết và mô hình tìm hiểu về dữ liệu này để được khái quát hóa cho các dữ liệu khác sau này. Chúng tôi có bộ dữ liệu thử nghiệm (hoặc tập hợp con) để kiểm tra dự đoán mô hình của chúng tôi trên tập hợp con này.

import pandas as pd
from sklearn import datasets, linear_model
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt

Hãy cùng xem cách làm điều này trong Python. Chúng tôi sẽ thực hiện việc này bằng cách sử dụng thư viện Scikit-learn và cụ thể là phương thức Train_Test_Split. Chúng tôi sẽ bắt đầu với việc nhập các thư viện cần thiết:

  • Hãy để nhanh chóng đi qua các thư viện mà tôi đã nhập khẩu: — to load the data file as a Pandas data frame and analyze the data. If you want to read more on Pandas, feel free to check out my post!
  • Pandas - Để tải tệp dữ liệu dưới dạng khung dữ liệu gấu trúc và phân tích dữ liệu. Nếu bạn muốn đọc thêm trên gấu trúc, vui lòng kiểm tra bài viết của tôi!Sklearn, I’ve imported the datasets module, so I can load a sample dataset, and the linear_model, so I can run a linear regression
  • Từ Sklearn, tôi đã nhập mô -đun bộ dữ liệu, vì vậy tôi có thể tải một bộ dữ liệu mẫu và tuyến tính, vì vậy tôi có thể chạy hồi quy tuyến tínhSklearn, sub-library model_selection, I’ve imported the train_test_split so I can, well, split to training and test sets
  • Từ sklearn, mô hình phụ nhân phụ_selection, tôi đã nhập Train_test_split để tôi có thể chia thành các bộ đào tạo và kiểm traMatplotlib I’ve imported pyplot in order to plot graphs of the data

Từ matplotlib, tôi đã nhập pyplot để vẽ đồ thị của dữ liệu

# Load the Diabetes dataset
columns = “age sex bmi map tc ldl hdl tch ltg glu”.split() # Declare the columns names
diabetes = datasets.load_diabetes() # Call the diabetes dataset from sklearn
df = pd.DataFrame(diabetes.data, columns=columns) # load the dataset as a pandas data frame
y = diabetes.target # define the target variable (dependent variable) as y

Ok, tất cả các bộ! Hãy để tải trọng trong bộ dữ liệu bệnh tiểu đường, biến nó thành khung dữ liệu và xác định các cột tên tên:

# create training and testing vars
X_train, X_test, y_train, y_test = train_test_split(df, y, test_size=0.2)
print X_train.shape, y_train.shape
print X_test.shape, y_test.shape
(353, 10) (353,)
(89, 10) (89,)

Bây giờ chúng tôi sẽ phù hợp với mô hình trên dữ liệu đào tạo:

# fit a model
lm = linear_model.LinearRegression()
model = lm.fit(X_train, y_train)
predictions = lm.predict(X_test)

Như bạn có thể thấy, chúng tôi đã phù hợp với mô hình trên dữ liệu đào tạo và cố gắng dự đoán dữ liệu thử nghiệm. Hãy để xem những gì (một số) dự đoán là:

predictions[0:5]
array([ 205.68012533, 64.58785513, 175.12880278, 169.95993301,
128.92035866])

Lưu ý: Bởi vì tôi đã sử dụng [0: 5] sau các dự đoán, nó chỉ hiển thị năm giá trị dự đoán đầu tiên. Loại bỏ [0: 5] sẽ làm cho nó in tất cả các giá trị dự đoán mà mô hình của chúng tôi đã tạo.

Hãy để âm mưu mô hình:

## The line / model
plt.scatter(y_test, predictions)
plt.xlabel(“True Values”)
plt.ylabel(“Predictions”)

Và in điểm chính xác:

print “Score:”, model.score(X_test, y_test)Score: 0.485829586737

Có bạn đi! Dưới đây là một bản tóm tắt về những gì tôi đã làm: Tôi đã tải dữ liệu, chia nó thành một bộ đào tạo và thử nghiệm, phù hợp với mô hình hồi quy cho dữ liệu đào tạo, đưa ra dự đoán dựa trên dữ liệu này và kiểm tra dự đoán về dữ liệu kiểm tra. Có vẻ tốt, phải không? Nhưng việc phân chia tàu/thử nghiệm có những nguy hiểm của nó - điều gì sẽ xảy ra nếu sự chia rẽ chúng ta tạo ra là ngẫu nhiên? Điều gì sẽ xảy ra nếu một tập hợp dữ liệu của chúng tôi chỉ có những người từ một tiểu bang nhất định, nhân viên có mức thu nhập nhất định nhưng không phải là mức thu nhập khác, chỉ có phụ nữ hoặc chỉ những người ở một độ tuổi nhất định? (Hãy tưởng tượng một tập tin được đặt hàng bởi một trong số này). Điều này sẽ dẫn đến việc quá mức, mặc dù chúng tôi đang cố gắng tránh nó! Đây là nơi xác nhận chéo đến.

Xác thực chéo

Trong đoạn trước, tôi đã đề cập đến các cảnh báo trong phương pháp phân chia tàu/thử nghiệm. Để tránh điều này, chúng ta có thể thực hiện một cái gì đó gọi là xác thực chéo. Nó rất giống với phân chia đào tạo/thử nghiệm, nhưng nó áp dụng cho nhiều tập hợp hơn. Có nghĩa là, chúng tôi chia dữ liệu của chúng tôi thành các tập hợp K và đào tạo trên K-1 một trong những tập hợp con đó. Những gì chúng tôi làm là giữ tập hợp con cuối cùng để kiểm tra. Chúng tôi có thể làm điều đó cho mỗi tập hợp con.

Đại diện trực quan của việc phân chia tàu/thử nghiệm và xác nhận chéo. H/T cho người hướng dẫn DSI của tôi, Joseph Nelson!

Có một loạt các phương pháp xác nhận chéo, tôi sẽ đi qua hai trong số đó: đầu tiên là xác thực chéo K-Fold và phương pháp thứ hai là để xác thực chéo (LOOCV)K-Folds Cross Validation and the second is Leave One Out Cross Validation (LOOCV)

K-gấp xác thực chéo

Trong xác thực chéo K-Fold, chúng tôi chia dữ liệu của chúng tôi thành các tập hợp con khác nhau (hoặc nếp gấp). Chúng tôi sử dụng các tập hợp K-1 để đào tạo dữ liệu của chúng tôi và để lại tập hợp con cuối cùng (hoặc lần cuối cùng) làm dữ liệu thử nghiệm. Sau đó, chúng tôi trung bình mô hình so với mỗi nếp gấp và sau đó hoàn thiện mô hình của chúng tôi. Sau đó, chúng tôi kiểm tra nó so với tập kiểm tra.

Đại diện trực quan của K-Fold. Một lần nữa, H/T cho Joseph Nelson!

Dưới đây là một ví dụ rất đơn giản từ tài liệu Sklearn cho K-Fold:

from sklearn.model_selection import KFold # import KFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]]) # create an array
y = np.array([1, 2, 3, 4]) # Create another array
kf = KFold(n_splits=2) # Define the split - into 2 folds
kf.get_n_splits(X) # returns the number of splitting iterations in the cross-validator
print(kf) KFold(n_splits=2, random_state=None, shuffle=False)

Và hãy để xem kết quả - các nếp gấp:

for train_index, test_index in kf.split(X):
print(“TRAIN:”, train_index, “TEST:”, test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
('TRAIN:', array([2, 3]), 'TEST:', array([0, 1]))
('TRAIN:', array([0, 1]), 'TEST:', array([2, 3]))

Như bạn có thể thấy, hàm chia dữ liệu gốc thành các tập hợp con khác nhau của dữ liệu. Một lần nữa, ví dụ rất đơn giản nhưng tôi nghĩ nó giải thích khái niệm khá tốt.

Để lại một xác thực chéo (LOOCV)

Đây là một phương pháp khác để xác nhận chéo, để lại xác thực chéo (nhân tiện, các phương pháp này không phải là hai phương pháp duy nhất, có một loạt các phương pháp khác để xác nhận chéo. Kiểm tra chúng trong trang web Sklearn). Trong loại xác thực chéo này, số lượng nếp gấp (tập hợp con) bằng với số lượng quan sát chúng ta có trong bộ dữ liệu. Sau đó, chúng tôi trung bình tất cả các nếp gấp này và xây dựng mô hình của chúng tôi với mức trung bình. Sau đó chúng tôi kiểm tra mô hình so với nếp gấp cuối cùng. Bởi vì chúng tôi sẽ nhận được một số lượng lớn các bộ đào tạo (bằng với số lượng mẫu), phương pháp này rất tốn kém về mặt tính toán và nên được sử dụng trên các bộ dữ liệu nhỏ. Nếu bộ dữ liệu lớn, rất có thể sẽ tốt hơn nếu sử dụng một phương thức khác, như Kold.

Hãy cùng kiểm tra một ví dụ khác từ Sklearn:

from sklearn.model_selection import LeaveOneOut 
X = np.array([[1, 2], [3, 4]])
y = np.array([1, 2])
loo = LeaveOneOut()
loo.get_n_splits(X)

for train_index, test_index in loo.split(X):
print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
print(X_train, X_test, y_train, y_test)

Và đây là đầu ra:

# Load the Diabetes dataset
columns = “age sex bmi map tc ldl hdl tch ltg glu”.split() # Declare the columns names
diabetes = datasets.load_diabetes() # Call the diabetes dataset from sklearn
df = pd.DataFrame(diabetes.data, columns=columns) # load the dataset as a pandas data frame
y = diabetes.target # define the target variable (dependent variable) as y
0

Một lần nữa, ví dụ đơn giản, nhưng tôi thực sự nghĩ rằng nó giúp hiểu được khái niệm cơ bản của phương pháp này.

Vì vậy, chúng ta nên sử dụng phương pháp nào? Bao nhiêu nếp gấp? Chà, chúng ta càng có nhiều nếp gấp, chúng ta sẽ giảm lỗi do sai lệch nhưng tăng lỗi do phương sai; Giá tính toán cũng sẽ tăng lên, rõ ràng - bạn càng có nhiều nếp gấp, càng mất nhiều thời gian để tính toán nó và bạn sẽ cần nhiều bộ nhớ hơn. Với số lượng nếp gấp thấp hơn, chúng tôi sẽ giảm lỗi do phương sai, nhưng lỗi do sai lệch sẽ lớn hơn. Nó cũng sẽ tính toán rẻ hơn. Do đó, trong các bộ dữ liệu lớn, K = 3 thường được khuyến khích. Trong các bộ dữ liệu nhỏ hơn, như tôi đã đề cập trước đây, tốt nhất là sử dụng LOOCV.

Hãy cùng kiểm tra ví dụ tôi đã sử dụng trước đây, lần này với việc sử dụng xác thực chéo. Illll sử dụng hàm Cross_val_predict để trả về các giá trị dự đoán cho từng điểm dữ liệu khi nó trong phần thử nghiệm.

# Load the Diabetes dataset
columns = “age sex bmi map tc ldl hdl tch ltg glu”.split() # Declare the columns names
diabetes = datasets.load_diabetes() # Call the diabetes dataset from sklearn
df = pd.DataFrame(diabetes.data, columns=columns) # load the dataset as a pandas data frame
y = diabetes.target # define the target variable (dependent variable) as y
1

Như bạn nhớ, trước đó trên Iveve đã tạo ra sự phân chia tàu/thử nghiệm cho bộ dữ liệu bệnh tiểu đường và phù hợp với một mô hình. Hãy để xem điểm số sau khi xác nhận chéo:

# Load the Diabetes dataset
columns = “age sex bmi map tc ldl hdl tch ltg glu”.split() # Declare the columns names
diabetes = datasets.load_diabetes() # Call the diabetes dataset from sklearn
df = pd.DataFrame(diabetes.data, columns=columns) # load the dataset as a pandas data frame
y = diabetes.target # define the target variable (dependent variable) as y
2

Như bạn có thể thấy, lần cuối cùng đã cải thiện điểm của mô hình gốc - từ 0,485 lên 0,569. Không phải là một kết quả tuyệt vời, nhưng này, chúng tôi sẽ lấy những gì chúng ta có thể nhận được :)

Bây giờ, hãy để âm mưu dự đoán mới, sau khi thực hiện xác thực chéo:

# Load the Diabetes dataset
columns = “age sex bmi map tc ldl hdl tch ltg glu”.split() # Declare the columns names
diabetes = datasets.load_diabetes() # Call the diabetes dataset from sklearn
df = pd.DataFrame(diabetes.data, columns=columns) # load the dataset as a pandas data frame
y = diabetes.target # define the target variable (dependent variable) as y
3

Bạn có thể thấy nó rất khác với cốt truyện gốc từ trước đó. Đó là gấp sáu điểm so với âm mưu ban đầu vì tôi đã sử dụng CV = 6.

Cuối cùng, hãy để kiểm tra điểm R² của mô hình (R² là một số của người Viking cho biết tỷ lệ của phương sai trong biến phụ thuộc có thể dự đoán được từ (các) biến độc lập. Về cơ bản, mô hình của chúng tôi chính xác như thế nào):

# Load the Diabetes dataset
columns = “age sex bmi map tc ldl hdl tch ltg glu”.split() # Declare the columns names
diabetes = datasets.load_diabetes() # Call the diabetes dataset from sklearn
df = pd.DataFrame(diabetes.data, columns=columns) # load the dataset as a pandas data frame
y = diabetes.target # define the target variable (dependent variable) as y
4

Đó là nó cho thời gian này! Tôi hy vọng bạn thích bài viết này. Như mọi khi, tôi hoan nghênh các câu hỏi, ghi chú, nhận xét và yêu cầu cho các bài đăng về các chủ đề bạn muốn đọc. Hẹn gặp lại bạn lần sau!

Chia tách thử nghiệm và xác nhận chéo là gì?

Trong xác thực chéo K-Fold, chúng tôi chia dữ liệu của chúng tôi thành các tập hợp con khác nhau (hoặc nếp gấp). Chúng tôi sử dụng các tập hợp K-1 để đào tạo dữ liệu của chúng tôi và để lại tập hợp con cuối cùng (hoặc lần cuối cùng) làm dữ liệu thử nghiệm. Sau đó, chúng tôi trung bình mô hình so với mỗi nếp gấp và sau đó hoàn thiện mô hình của chúng tôi. Sau đó, chúng tôi kiểm tra nó so với tập kiểm tra.

Làm thế nào để bạn chia dữ liệu thành đào tạo và kiểm tra và xác nhận trong Python?

Chia dữ liệu Chúng tôi có thể sử dụng Train_Test_Split để đầu tiên tạo sự phân chia trên bộ dữ liệu gốc.Sau đó, để có được bộ xác thực, chúng ta có thể áp dụng chức năng tương tự cho bộ tàu để có được bộ xác thực.Trong hàm bên dưới, kích thước tập kiểm tra là tỷ lệ của dữ liệu gốc chúng tôi muốn sử dụng làm bộ thử nghiệm.use the train_test_split to first make the split on the original dataset. Then, to get the validation set, we can apply the same function to the train set to get the validation set. In the function below, the test set size is the ratio of the original data we want to use as the test set.

Phân chia thử nghiệm tàu trong Python là gì?

Phân chia thử nghiệm tàu được sử dụng để ước tính hiệu suất của các thuật toán học máy được áp dụng cho các thuật toán/ứng dụng dựa trên dự đoán.Phương pháp này là một quy trình nhanh chóng và dễ dàng để thực hiện sao cho chúng ta có thể so sánh kết quả mô hình học máy của riêng mình với kết quả máy.used to estimate the performance of machine learning algorithms that are applicable for prediction-based Algorithms/Applications. This method is a fast and easy procedure to perform such that we can compare our own machine learning model results to machine results.

Xác nhận chéo trong Python là gì?

Xác thực chéo là một phương pháp thống kê được sử dụng để ước tính hiệu suất của các mô hình học máy.Đây là một phương pháp để đánh giá kết quả phân tích thống kê sẽ khái quát hóa thành một tập dữ liệu độc lập như thế nào.a statistical method used to estimate the performance of machine learning models. It is a method for assessing how the results of a statistical analysis will generalize to an independent data set.