シンプルなKaggleタスクでsklearnとpandasを統合するのに苦労しています


7

私はsklearn_pandasモジュールを使用してパンダで行う作業を拡張し、機械学習につま先を浸そうとしていますが、修正方法が本当にわからないエラーで苦労しています。

Kaggleで次のデータセットを調べていました

これは基本的に、浮動小数点値を持つヘッダーのないテーブル(1000行、40の機能)です。

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

出力:

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'))])

ここまでは順調ですね。しかし、私はフィット感を試します

mapper_train.fit_transform(train, labels)

出力:

---------------------------------------------------------------------------
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)`

何が悪いのですか?この場合のデータはすべて同じですが、カテゴリ、公称、浮動小数点の混合のワークフローを作成することを計画しています。sklearn_pandasは論理的に適合するようです。


1
2番目のインポートは正しくインデントされていません。編集が長かった場合は、自分でコードを修正します。
logc 2014

回答:


6

これはパンダとsklearnをうまくプレイさせる方法の例です

両方とも文字列である2つの列があり、ベクトル化したいとしますが、どのベクトル化パラメータがダウンストリームのパフォーマンスを最高にするかわかりません。

ベクトライザーを作成する

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

DataFrameMapper objを作成します。

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

これは完全なパイプラインです

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

スキャンで考慮したいパラメーターを定義する

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))]]}

それでおしまい!-ただし、mapper_featuresはこのディクショナリの単一のアイテムであることに注意してください。したがって、forループまたはitertools.productを使用して、検討するすべてのto_vectオプションのFLATリストを生成します-これは、質問の範囲外の別個のタスクです。

最適な分類器またはパイプラインで終わる他のものを作成します

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

7

私はを使用したことがありませんsklearn_pandasが、ソースコードを読んでいると、これは彼らの側のバグのようです。例外をスローしている関数を探すとそれらがy引数を破棄していることがわかります(docstringになるまで存続しません)。また、内部fit関数は1つ以上の引数を期待しています。おそらく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

バグトラッカーで問題を開くことをお勧めします。

更新

IPythonからコードを実行する場合、これをテストできます。要約%pdb onすると、問題のある呼び出しを実行する直前にマジックを使用すると、例外がPythonデバッガーによってキャプチャーされるため、少し遊んfitで、ラベル値を使用y[0]して関数を呼び出すことが機能することを確認できます-最後の行を参照してくださいpdb>プロンプト。(CSVファイルはKaggleからダウンロードされますが、実際のファイルの一部である最大のものを除きます)。

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')

ありがとう。何が原因なのかはわかりませんでした。私はほとんどの場合、私の仕事が
間違っ

@ elksie5000:呼び出しをデバッグする方法を追加しました。最後の呼び出しが、関数(?)の呼び出しの成功から期待されるものであることを願っています。そうでなければ、それはとのコードにステップする方法を知っていることは常に良いですpdb:)
logc

Wes McKinneyによるPython for Data Analysisの本を読んだ後、pdbをもう一度見ていたことを認めなければなりません。私はすでにIPythonで働いていますが、printステートメントにはかなり満足しています。ありがとうございました。
elksie5000 2014

ちなみに、デバッガープロンプトは「ipdb」と表示されます。これはipythonデバッガーです-これは私のセットアップでの追加インストールです。通常の状況では、呼び出されるのは通常のpdbです。この違いに気づきました。
logc 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.