2016-08-17 33 views
5

Tôi khá mới với đường ống trong sklearn và tôi đang gặp phải vấn đề này: Tôi có một tập dữ liệu có hỗn hợp văn bản và số tức là các cột nhất định chỉ có văn bản và phần còn lại có số nguyên (hoặc số dấu phẩy động).sklearn đường ống - làm thế nào để áp dụng các biến đổi khác nhau trên các cột khác nhau

Tôi đã tự hỏi liệu có thể xây dựng một đường ống nơi tôi có thể gọi ví dụ LabelEncoder() trên các đối tượng địa lý văn bản và MinMaxScaler() trên các cột số. Các ví dụ tôi đã thấy trên web chủ yếu hướng tới việc sử dụng LabelEncoder() trên toàn bộ tập dữ liệu chứ không phải trên các cột được chọn. Điều này có thể không? Nếu có bất kỳ con trỏ nào sẽ được đánh giá cao.

Trả lời

12

Cách tôi thường làm là sử dụng FeatureUnion, sử dụng FunctionTransformer để kéo các cột có liên quan.

Ghi chú quan trọng:

  • Bạn phải xác định chức năng của bạn với def từ annoyingly bạn không thể sử dụng lambda hoặc partial trong FunctionTransformer nếu bạn muốn dưa mô hình của bạn

  • Bạn cần phải khởi tạo FunctionTransformer với validate=False

Một cái gì đó như thế này:

from sklearn.pipeline import make_union, make_pipeline 
from sklearn.preprocessing import FunctionTransformer 

def get_text_cols(df): 
    return df[['name', 'fruit']] 

def get_num_cols(df): 
    return df[['height','age']] 

vec = make_union(*[ 
    make_pipeline(FunctionTransformer(get_text_cols, validate=False), LabelEncoder()))), 
    make_pipeline(FunctionTransformer(get_num_cols, validate=False), MinMaxScaler()))) 
]) 
+0

Bất kỳ ý tưởng nào tại sao tôi nhận được 'TypeError: Tất cả các ước tính phải thực hiện phù hợp và biến đổi'. nếu tôi chạy mã của bạn? scikit-learn 0.19.1 –

+1

Nevermind, chữ ký đã được thay đổi rõ ràng - Tôi đã gửi bản chỉnh sửa –

Các vấn đề liên quan