Sự khác biệt giữa fit và fit_transform trong các mô hình scikit_learn?


110

Tôi là người mới làm quen với khoa học dữ liệu và tôi không hiểu sự khác biệt giữa fitfit_transformphương pháp trong scikit-learn. Bất cứ ai có thể giải thích đơn giản tại sao chúng ta có thể cần phải chuyển đổi dữ liệu?

Điều đó có nghĩa là mô hình phù hợp trên dữ liệu đào tạo và chuyển đổi để kiểm tra dữ liệu? Có nghĩa là ví dụ chuyển đổi các biến phân loại thành số trong đào tạo và chuyển đổi tính năng mới được thiết lập để kiểm tra dữ liệu?



@sds Câu trả lời ở trên cung cấp liên kết cho câu hỏi này.
Kaushal28

Chúng tôi áp dụng fittrên training datasetvà sử dụng các transformphương pháp trên both- các tập dữ liệu huấn luyện và các tập dữ liệu thử nghiệm
Prakash Kumar

Câu trả lời:


117

Để căn giữa dữ liệu (làm cho nó có giá trị trung bình bằng 0 và sai số chuẩn đơn vị), bạn trừ đi giá trị trung bình và sau đó chia kết quả cho độ lệch chuẩn.

x=xμσ

Bạn làm điều đó trên tập dữ liệu. Nhưng sau đó, bạn phải áp dụng chuyển đổi tương tự cho bộ thử nghiệm của mình (ví dụ: trong xác thực chéo) hoặc cho các ví dụ mới thu được trước khi dự báo. Nhưng bạn phải sử dụng hai tham số và (giá trị) giống nhau mà bạn đã sử dụng để căn giữa tập huấn luyện.σμσ

Do đó, mọi biến đổi của sklearn fit()chỉ tính toán các tham số (ví dụ: và trong trường hợp StandardScaler ) và lưu chúng dưới dạng trạng thái đối tượng bên trong. Sau đó, bạn có thể gọi phương thức của nó để áp dụng phép biến đổi cho một tập hợp các ví dụ cụ thể.σμσtransform()

fit_transform()tham gia hai bước này và được sử dụng để khớp các tham số ban đầu trên tập huấn luyện , nhưng nó cũng trả về một biến đổi . Trong nội bộ, nó chỉ gọi đầu tiên và sau đó trên cùng một dữ liệu.x 'xxfit()transform()


1
Cảm ơn rất nhiều về câu trả lời của bạn. Chỉ cần một điều. Thông số của bạn trong mô hình không có nghĩa là độ dốc lớn và chặn cho hồi quy? Khi bạn phù hợp, hãy nói hồi quy tuyến tính, ví dụ tham số nào được trang bị trong phương thức phù hợp? Các tham số chuẩn hóa hoặc các tham số mô hình như độ dốc và đánh chặn?
Kaggle

1
Ý tôi là các tham số bên trong của các biến đổi ( và trong trường hợp StandardScaler). Bất cứ phương thức biến đổi nào cũng trả về. Xem chương này về việc cắt cụt , ví dụ: scikit-learn.org/ sóng / môσμσget_params()
K3 --- rnc

2
Nhận xét trước đây của tôi là thực sự sai. Trong trường hợp hồi quy tuyến tính, các tham số được trang bị là coef_(nghĩa là độ dốc và giao thoa), không phải là tham số được trả về get_params()(thay vào đó, trả về tập hợp các đối số của hàm tạo mô hình với các giá trị được liên kết của chúng).
K3 --- rnc

Câu trả lời chính xác! Tôi đã xem qua bài viết của bạn trong khi tìm kiếm về chủ đề này, nhưng tôi cần làm rõ. Điều đó có nghĩa là nếu giả sử chúng ta muốn chuyển đổi từng tập hợp các ví dụ tiếp theo, chúng ta không bao giờ nên gọi fit_transform()vì nó sẽ không cho phép chúng ta truy cập trạng thái đối tượng bên trong, để chuyển đổi các ví dụ tiếp theo với cùng tham số thu được bằng cách sử dụng fit()trên tập dữ liệu ban đầu? Điều này phát sinh ví dụ khi, bạn có một tập dữ liệu kiểm tra và muốn chuyển đổi tập kiểm tra để chuyển nó đến trình phân loại được đào tạo của bạn.
AKKA

Sau khi bạn gọi t.fit_transform(train_data), t được trang bị, vì vậy bạn có thể sử dụng một cách an toàn t.transform(test_data).
K3 --- rnc

10

Lời giải thích sau đây được dựa trên fit_transformcác Imputerlớp, nhưng ý tưởng là như nhau cho fit_transformcác lớp scikit_learn khác thích MinMaxScaler.


transformthay thế các giá trị còn thiếu bằng một số. Theo mặc định, số này là phương tiện của các cột của một số dữ liệu mà bạn chọn. Hãy xem xét ví dụ sau:

imp = Imputer()
# calculating the means
imp.fit([[1, 3], [np.nan, 2], [8, 5.5]])

Bây giờ, người bán hàng đã học cách sử dụng giá trị trung bình (1 + 8) / 2 = 4,5 cho cột đầu tiên và trung bình (2 + 3 + 5.5) / 3 = 3.5 cho cột thứ hai khi được áp dụng cho dữ liệu hai cột:

X = [[np.nan, 11], 
     [4,      np.nan], 
     [8,      2],
     [np.nan, 1]]
print(imp.transform(X))

chúng tôi nhận được

[[4.5, 11], 
 [4, 3.5],
 [8, 2],
 [4.5, 1]]

Vì vậy, bằng cách fittính toán phương tiện của các cột từ một số dữ liệu và bằng cách transformđó áp dụng các phương tiện đó cho một số dữ liệu (chỉ thay thế các giá trị bị thiếu bằng các phương tiện). Nếu cả hai dữ liệu này đều giống nhau (tức là dữ liệu để tính phương tiện và dữ liệu có nghĩa là được áp dụng), bạn có thể sử dụng fit_transformvề cơ bản là fittheo sau bởi a transform.

Bây giờ câu hỏi của bạn:

Tại sao chúng ta có thể cần phải chuyển đổi dữ liệu?

"Vì nhiều lý do, nhiều bộ dữ liệu trong thế giới thực chứa các giá trị bị thiếu, thường được mã hóa dưới dạng khoảng trắng, NaN hoặc các phần giữ chỗ khác. Tuy nhiên, các bộ dữ liệu này không tương thích với các công cụ ước tính tìm hiểu scikit cho rằng tất cả các giá trị trong một mảng là số" ( nguồn )

Điều đó có nghĩa là mô hình phù hợp trên dữ liệu đào tạo và chuyển đổi để kiểm tra dữ liệu?

Các fitxung động không có gì để làm với việc fitsử dụng trong mô hình phù hợp. Vì vậy, bằng cách sử dụng fitdữ liệu huấn luyện chỉ cần tính toán phương tiện của từng cột dữ liệu đào tạo. Sử dụng transformtrên dữ liệu thử nghiệm sau đó thay thế các giá trị thiếu của dữ liệu thử nghiệm bằng các phương tiện được tính toán từ dữ liệu huấn luyện.


3

Theo thuật ngữ của layman, fit_transform có nghĩa là thực hiện một số tính toán và sau đó thực hiện chuyển đổi (giả sử tính toán phương tiện của các cột từ một số dữ liệu và sau đó thay thế các giá trị còn thiếu). Vì vậy, đối với tập huấn luyện, bạn cần cả tính toán và thực hiện chuyển đổi.

Nhưng đối với tập kiểm thử, Machine learning áp dụng dự đoán dựa trên những gì đã học được trong tập huấn luyện và do đó không cần tính toán, nó chỉ thực hiện chuyển đổi.


3

Các phương thức này được sử dụng để chuyển đổi tập dữ liệu trong scikit-learn:

Hãy để chúng tôi lấy một ví dụ cho các giá trị nhân rộng trong bộ dữ liệu:

Ở đây phương pháp phù hợp , khi được áp dụng cho tập dữ liệu huấn luyện, tìm hiểu các tham số mô hình (ví dụ: độ lệch trung bình và độ lệch chuẩn). Sau đó, chúng ta cần áp dụng phương thức biến đổi trên tập dữ liệu huấn luyện để có được tập dữ liệu huấn luyện đã được chuyển đổi (chia tỷ lệ). Chúng tôi cũng có thể thực hiện cả hai bước này trong một bước bằng cách áp dụng fit_transform trên tập dữ liệu đào tạo.

Vậy thì tại sao chúng ta cần 2 phương pháp riêng biệt - phù hợpbiến đổi ?

Trong thực tế, chúng ta cần phải có một tập dữ liệu thử nghiệm và đào tạo riêng biệt và đó là nơi có một phương pháp phù hợpbiến đổi riêng biệt giúp ích. Chúng tôi áp dụng sự phù hợp trên tập dữ liệu huấn luyện và sử dụng phương pháp biến đổi trên cả hai - tập dữ liệu huấn luyện và tập dữ liệu kiểm tra. Do đó, việc đào tạo cũng như tập dữ liệu kiểm tra sau đó được chuyển đổi (chia tỷ lệ) bằng cách sử dụng các tham số mô hình đã học được khi áp dụng phương pháp phù hợp với tập dữ liệu huấn luyện.

Mã ví dụ:

scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train) 
scaler.transform(X_test) 

2

Đây không phải là một câu trả lời kỹ thuật, nhưng, hy vọng, sẽ hữu ích để xây dựng trực giác của chúng tôi:

Thứ nhất, tất cả các công cụ ước tính được đào tạo (hoặc "phù hợp") trên một số dữ liệu đào tạo. Phần đó khá đơn giản.

Thứ hai, tất cả các công cụ ước tính tìm hiểu scikit có thể được sử dụng trong một đường ống và ý tưởng với một đường ống là dữ liệu chảy qua đường ống. Khi đã phù hợp ở một mức cụ thể trong đường ống, dữ liệu được chuyển sang giai đoạn tiếp theo trong đường ống nhưng rõ ràng dữ liệu cần phải được thay đổi (chuyển đổi) theo một cách nào đó; nếu không, bạn sẽ không cần giai đoạn đó trong đường ống. Vì vậy, biến đổi là một cách chuyển đổi dữ liệu để đáp ứng nhu cầu của giai đoạn tiếp theo trong đường ống.

Nếu bạn không sử dụng đường ống, tôi vẫn nghĩ sẽ hữu ích khi nghĩ về các công cụ học máy này theo cách này bởi vì, ngay cả trình phân loại đơn giản nhất vẫn đang thực hiện chức năng phân loại. Nó nhận như là một số dữ liệu đầu vào và tạo ra một đầu ra. Đây là một đường ống quá; chỉ là một rất đơn giản.

Tóm lại, fit thực hiện đào tạo, biến đổi thay đổi dữ liệu trong đường ống để chuyển nó sang giai đoạn tiếp theo trong đường ống và fit_transform thực hiện cả khớp và biến đổi trong một bước có thể được tối ưu hóa.


"" Chúng tôi áp dụng phù hợp với tập dữ liệu huấn luyện và sử dụng phương pháp biến đổi trên cả hai - tập dữ liệu huấn luyện và tập dữ liệu kiểm tra "" :) Nice
Prakash Kumar

2
Tôi nghĩ bạn có ý kiến ​​để bình luận dưới đây. Tôi sẽ chuyển tiếp nó tới Prasad Nageshkar. (Chà ... tôi sẽ có nếu tôi có tiếng tăm.)
Eric McLachlan

1

V1V2V1V2

Đến với câu hỏi khác trước tiên bạn xây dựng mô hình trong tập huấn luyện đó là (mô hình học các mẫu hoặc Hành vi của dữ liệu của bạn từ tập huấn luyện) và khi bạn chạy cùng một mô hình trong tập kiểm tra, nó sẽ cố gắng xác định các mẫu hoặc hành vi tương tự một khi nó xác định nó sẽ đưa ra kết luận và đưa ra kết quả phù hợp với dữ liệu huấn luyện


0

Hãy xem xét một nhiệm vụ yêu cầu chúng ta bình thường hóa dữ liệu. Ví dụ: chúng tôi có thể sử dụng chuẩn hóa tối thiểu hoặc chuẩn hóa điểm z. Có một số tham số vốn có trong mô hình. Các giá trị tối thiểu và tối đa trong chuẩn hóa tối thiểu tối đa và độ lệch trung bình và độ lệch chuẩn trong chuẩn hóa điểm z. Hàm fit () tính toán các giá trị của các tham số này.

Ảnh hưởng của sự phù hợp ()

Hàm biến đổi áp dụng các giá trị của các tham số trên dữ liệu thực tế và đưa ra giá trị chuẩn hóa.

Tác dụng của biến đổi ()

Hàm fit_transform () thực hiện cả hai trong cùng một bước.

Tác dụng của fit_transform ()

Lưu ý rằng giá trị tương tự được nhận cho dù chúng tôi thực hiện trong 2 bước hoặc trong một bước duy nhất.


0

"fit" tính giá trị trung bình và tiêu chuẩn được sử dụng để nhân rộng sau này . (jsut một tính toán), không có gì được trao cho bạn.

"Transform" sử dụng giá trị trung bình và std được tính toán trước đó để tự động xác định dữ liệu (trừ giá trị trung bình khỏi tất cả các giá trị và sau đó chia cho std).

"fit_transform" thực hiện cả hai cùng một lúc. Vì vậy, bạn có thể làm điều đó với 1 dòng mã thay vì 2.

Bây giờ hãy xem xét nó trong thực tế:

Đối với tập huấn luyện X , chúng tôi thực hiện "fit_transform" vì chúng tôi cần tính toán trung bình và tiêu chuẩn, sau đó sử dụng nó để tự động xác định dữ liệu. Đối với bộ kiểm tra X , tốt, chúng tôi đã có giá trị trung bình và tiêu chuẩn, vì vậy chúng tôi chỉ thực hiện phần "biến đổi".

Nó siêu đơn giản. Bạn đang làm rất tốt. Giữ thành tốt công việc của bạn, bạn của tôi :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.