1

カテゴリ変数を使用してパイプラインを構築しようとしています

import numpy as np
import pandas as pd
import sklearn
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn import linear_model
from sklearn.pipeline import Pipeline
df = pd.DataFrame({'a':range(6),  'c':['a', 'b', 'c']*2, 'd': ['m', 'f']*3        })
X = df[['c', 'd']]
y = df['a']

regressor = linear_model.SGDRegressor()

カテゴリ変数の変換

class Cat(TransformerMixin):

    def transform(self, X, **transform_params):
        enc = DictVectorizer(sparse = False)
        enc_data = enc.fit_transform(X.T.to_dict().values())
        return enc_data

    def fit(self, X, y=None, **fit_params):
        return self

パイプライン

 pipeline = Pipeline([ 

                ('categorical', Cat()),
    ('model_fitting', regressor),
])
pipeline.fit(X, y)

そのとおりです。しかし、新しいデータセットを当てはめようとするとエラーが発生します。例えば

contr = pd.DataFrame({'c':['a'], 'd': ['m']})
pred = pipeline.predict(contr)
pred
and

ValueError: shapes (1,2) and (5,) not aligned: 2 (dim 1) != 5 (dim 0)

クラス Cat(TransformerMixin) に問題があることがわかります。それを改善する方法は?

4

1 に答える 1

0

以下のようにしました。できます

機能を変更しました

class Cat(TransformerMixin):

def transform(self, X, y=None, **fit_params):
    enc = DictVectorizer(sparse = False)
    encc = enc.fit(df[['c', 'd']].T.to_dict().values())
    enc_data = encc.transform(X.T.to_dict().values())
    return enc_data

def fit_transform(self, X, y=None, **fit_params):
    self.fit(X, y, **fit_params)
    return self.transform(X)

def fit(self, X, y=None, **fit_params):
    return self

そして新しいデータセット

control = pd.DataFrame({'c':['b'], 'd': ['f']})
pred = pipeline.predict(control)
pred
于 2016-10-25T22:28:59.940 に答える