Đấu tranh để tích hợp sklearn và gấu trúc trong nhiệm vụ Kaggle đơn giản


7

Tôi đang cố gắng sử dụng mô-đun sklearn_pandas để mở rộng công việc tôi làm trong gấu trúc và nhúng ngón chân vào học máy nhưng tôi đang vật lộn với một lỗi tôi không thực sự hiểu cách khắc phục.

Tôi đã làm việc thông qua bộ dữ liệu sau đây trên Kaggle .

Về cơ bản, đây là một bảng không có ký tự (1000 hàng, 40 tính năng) với các giá trị dấu phẩy động.

import pandas as pdfrom sklearn import neighbors
from sklearn_pandas import DataFrameMapper, cross_val_score
path_train ="../kaggle/scikitlearn/train.csv"
path_labels ="../kaggle/scikitlearn/trainLabels.csv"
path_test = "../kaggle/scikitlearn/test.csv"

train = pd.read_csv(path_train, header=None)
labels = pd.read_csv(path_labels, header=None)
test = pd.read_csv(path_test, header=None)
mapper_train = DataFrameMapper([(list(train.columns),neighbors.KNeighborsClassifier(n_neighbors=3))])
mapper_train

Đầu ra:

DataFrameMapper(features=[([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
       n_neighbors=3, p=2, weights='uniform'))])

Càng xa càng tốt. Nhưng sau đó tôi thử sự phù hợp

mapper_train.fit_transform(train, labels)

Đầu ra:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-e3897d6db1b5> in <module>()
----> 1 mapper_train.fit_transform(train, labels)

//anaconda/lib/python2.7/site-packages/sklearn/base.pyc in fit_transform(self, X, y,     **fit_params)
    409         else:
    410             # fit method of arity 2 (supervised transformation)
--> 411             return self.fit(X, y, **fit_params).transform(X)
    412 
    413 

//anaconda/lib/python2.7/site-packages/sklearn_pandas/__init__.pyc in fit(self, X, y)
    116         for columns, transformer in self.features:
    117             if transformer is not None:
--> 118                 transformer.fit(self._get_col_subset(X, columns))
    119         return self
    120 

TypeError: fit() takes exactly 3 arguments (2 given)`

Tôi đang làm gì sai? Mặc dù dữ liệu trong trường hợp này là như nhau, tôi đang lên kế hoạch xây dựng quy trình làm việc cho các hỗn hợp các tính năng phân loại, danh nghĩa và dấu phẩy động và sklearn_pandas có vẻ phù hợp logic.


1
Nhập thứ hai của bạn không được thụt lề chính xác. Tôi sẽ tự sửa mã nếu bản chỉnh sửa đủ dài.
đăng nhập

Câu trả lời:


6

Dưới đây là một ví dụ về cách để gấu trúc và sklearn chơi đẹp

nói rằng bạn có 2 cột là cả hai chuỗi và bạn muốn vector hóa - nhưng bạn không biết tham số vector hóa nào sẽ dẫn đến hiệu suất hạ nguồn tốt nhất.

tạo vectorizer

to_vect = Pipeline([('vect',CountVectorizer(min_df =1,max_df=.9,ngram_range=(1,2),max_features=1000)),
                    ('tfidf', TfidfTransformer())])

tạo obj DataFrameMapper.

full_mapper = DataFrameMapper([
        ('col_name1', to_vect),
        ('col_name2',to_vect)
    ])

đây là đường ống đầy đủ

full_pipeline  = Pipeline([('mapper',full_mapper),('clf', SGDClassifier(n_iter=15, warm_start=True))])

xác định các thông số bạn muốn quét để xem xét

full_params = {'clf__alpha': [1e-2,1e-3,1e-4],
                   'clf__loss':['modified_huber','hinge'],
                   'clf__penalty':['l2','l1'],
                   'mapper__features':[[('col_name1',deepcopy(to_vect)),
                                        ('col_name2',deepcopy(to_vect))],
                                       [('col_name1',deepcopy(to_vect).set_params(vect__analyzer= 'char_wb')),
                                        ('col_name2',deepcopy(to_vect))]]}

Đó là nó! - tuy nhiên lưu ý rằng mapper_features là một mục duy nhất trong từ điển này - vì vậy hãy sử dụng vòng lặp for hoặc itertools.product để tạo danh sách FLAT của tất cả các tùy chọn to_vect bạn muốn xem xét - nhưng đó là một nhiệm vụ riêng biệt ngoài phạm vi câu hỏi.

Tiếp tục để tạo trình phân loại tối ưu hoặc bất cứ điều gì khác mà đường ống của bạn kết thúc bằng

gs_clf = GridSearchCV(full_pipe, full_params, n_jobs=-1)

7

Tôi chưa bao giờ sử dụng sklearn_pandas, nhưng từ việc đọc mã nguồn của họ, có vẻ như đây là một lỗi ở phía họ. Nếu bạn tìm hàm đang ném ngoại lệ , bạn có thể nhận thấy rằng họ đang loại bỏ yđối số (nó thậm chí không tồn tại cho đến khi chuỗi doc) và fithàm bên trong mong đợi một đối số nhiều hơn, có thể là y:

def fit(self, X, y=None):
    '''
    Fit a transformation from the pipeline

    X       the data to fit
    '''
    for columns, transformer in self.features:
        if transformer is not None:
            transformer.fit(self._get_col_subset(X, columns))
    return self

Tôi khuyên bạn nên mở một vấn đề trong trình theo dõi lỗi của họ .

CẬP NHẬT :

Bạn có thể kiểm tra điều này nếu bạn chạy mã của mình từ IPython. Tóm lại, nếu bạn sử dụng %pdb onphép thuật ngay trước khi bạn thực hiện cuộc gọi có vấn đề, ngoại lệ được trình gỡ lỗi Python nắm bắt, do đó bạn có thể chơi xung quanh một chút và thấy rằng việc gọi fithàm với các giá trị nhãn y[0]sẽ hoạt động - xem dòng cuối cùng với pdb>lời nhắc. (Các tệp CSV được tải xuống từ Kaggle, ngoại trừ tệp lớn nhất chỉ là một phần của tệp thực).

In [1]: import pandas as pd

In [2]: from sklearn import neighbors

In [3]: from sklearn_pandas import DataFrameMapper, cross_val_score

In [4]: path_train ="train.csv"

In [5]: path_labels ="trainLabels.csv"

In [6]: path_test = "test.csv"

In [7]: train = pd.read_csv(path_train, header=None)

In [8]: labels = pd.read_csv(path_labels, header=None)

In [9]: test = pd.read_csv(path_test, header=None)

In [10]: mapper_train = DataFrameMapper([(list(train.columns),neighbors.KNeighborsClassifier(n_neighbors=3))])

In [13]: %pdb on

In [14]: mapper_train.fit_transform(train, labels)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-e3897d6db1b5> in <module>()
----> 1 mapper_train.fit_transform(train, labels)

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/base.pyc in fit_transform(self, X, y, **fit_params)
    409         else:
    410             # fit method of arity 2 (supervised transformation)
--> 411             return self.fit(X, y, **fit_params).transform(X)
    412
    413

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn_pandas/__init__.pyc in fit(self, X, y)
    116         for columns, transformer in self.features:
    117             if transformer is not None:
--> 118                 transformer.fit(self._get_col_subset(X, columns))
    119         return self
    120

TypeError: fit() takes exactly 3 arguments (2 given)
> /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn_pandas/__init__.py(118)fit()
    117             if transformer is not None:
--> 118                 transformer.fit(self._get_col_subset(X, columns))
    119         return self

ipdb> l
    113
    114         X       the data to fit
    115         '''
    116         for columns, transformer in self.features:
    117             if transformer is not None:
--> 118                 transformer.fit(self._get_col_subset(X, columns))
    119         return self
    120
    121
    122     def transform(self, X):
    123         '''
ipdb> transformer.fit(self._get_col_subset(X, columns), y[0])
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           n_neighbors=3, p=2, weights='uniform')

Cảm ơn. Tôi sẽ không biết những gì đã gây ra nó. Tôi chỉ biết hầu hết thời gian là do công việc của tôi có lỗi :)
elksie5000

@ elksie5000: Tôi đã thêm cách gỡ lỗi cuộc gọi. Tôi hy vọng cuộc gọi cuối cùng là những gì bạn mong đợi từ một cuộc gọi thành công đến chức năng (?). Nếu không, thật tốt khi biết cách bước vào mã với pdb:)
logc

Tôi phải thừa nhận pdb là thứ tôi đã xem lại sau khi làm việc thông qua cuốn sách Phân tích dữ liệu Python của Wes McKinney. Tôi đã làm việc trong IPython, nhưng đã rất hài lòng với các báo cáo in. Cám ơn bạn một lần nữa.
elksie5000

Là một lưu ý phụ, lời nhắc của trình gỡ lỗi nói "ipdb" vì đó là trình gỡ lỗi ipython - đây là một cài đặt bổ sung trong thiết lập của tôi. Trong trường hợp bình thường, nó sẽ là pdb thông thường được gọi. Chỉ cần nhận thấy sự khác biệt này.
đăng nhập
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.