SklearnとPandasを簡単なKaggleタスクに統合するのに苦労しています
-
16-10-2019 - |
質問
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は論理的なフィット感があるように見えました。
解決
これがパンダと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はこの辞書の単一のアイテムであることに注意してください。したがって、loopまたはitertools.productにaを使用して、考慮したいすべてのto_vectオプションのフラットリストを生成しますが、質問の範囲外の個別のタスクです。
最適な分類子またはパイプラインが終了するものを作成します
gs_clf = GridSearchCV(full_pipe, full_params, n_jobs=-1)
他のヒント
私は使用したことがありません sklearn_pandas
, 、しかし、彼らのソースコードを読むことから、これは彼らの側のバグのように見えます。あなたが探しているなら 例外をスローしている関数, 、あなたは彼らが廃棄していることに気付くことができます y
議論(それはドックストリングまで生き残ることさえありません)、そして内側 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')