2016-09-09 3 views
1

Дать свой первый трубопровод для sklearn я наткнулся на некоторые вопросы, когда только подмножество столбцов помещается в трубопровод:sklearn в трубопроводе

mydf = pd.DataFrame({'classLabel':[0,0,0,1,1,0,0,0], 
        'categorical':[7,8,9,5,7,5,6,4], 
        'numeric1':[7,8,9,5,7,5,6,4], 
        'numeric2':[7,8,9,5,7,5,6,"N.A"]}) 
columnsNumber = ['numeric1'] 
XoneColumn = X[columnsNumber] 

Я использую functionTransformer как:

def extractSpecificColumn(X, columns): 
    return X[columns] 

pipeline = Pipeline([ 
    ('features', FeatureUnion([ 
     ('continuous', Pipeline([ 
      ('numeric', FunctionTransformer(columnsNumber)), 
      ('scale', StandardScaler()) 
     ])) 
    ], n_jobs=1)), 
    ('estimator', RandomForestClassifier(n_estimators=50, criterion='entropy', n_jobs=-1)) 
]) 

cv.cross_val_score(pipeline, XoneColumn, y, cv=folds, scoring=kappaScore) 

Это приводит к: TypeError: 'list' object is not callable при включенном функциональном трансформаторе.

редактировать:

Если я экземпляр ColumnExtractor, как показано ниже не возвращается никакой ошибки. Но разве это не functionTransformer означает просто для простых случаев, подобных этому, и должен просто работать?

class ColumnExtractor(TransformerMixin): 
    def __init__(self, columns): 
     self.columns = columns 

    def transform(self, X, *_): 
     return X[self.columns] 

    def fit(self, *_): 
     return self 
+0

не должен 'XoneColumn = X [columnsNumber]' be 'XoneColumn = mydf [columnsNumber]'? – EdChum

+0

, также рассматривающий вопрос 2 в вашем github, индексы, возвращаемые из 'train_test_split', являются порядковыми значениями индекса, поэтому я предлагаю использовать' .iloc' в dfs 'X_train = X.iloc [train_index] X_test = X.iloc [ test_index] y_train = y.iloc [train_index] y_test = y.iloc [test_index] ' – EdChum

+1

Код sklearn предполагает, что все является массивом np, поэтому у вас есть выбор либо преобразовать ваш pandas df в массив np, используя атрибут' .values' или использовать индексы 'pandas', такие как' iloc', 'loc' и' ix' – EdChum

ответ

1

FunctionTransformer используется для «лифта» функцию для преобразования, которые я думаю, что может помочь с некоторыми шагами очистки данных. Представьте, что у вас в основном числовой массив, и вы хотите преобразовать его с помощью Transformer, который будет выходить из строя, если он получит nan (например, Normalize). Вы могли бы в конечном итоге с чем-то вроде

df.fillna(0, inplace=True) 
... 
cross_val_score(pipeline, ...) 

, но, возможно, вы что fillna требуется только в одном преобразовании, так вместо того, чтобы в fillna как выше, у вас есть

normalize = make_pipeline(
    FunctionTransformer(np.nan_to_num, validate=False), 
    Normalize() 
) 

который заканчивается нормализуя его, как вы хотеть. Затем вы можете использовать этот фрагмент в нескольких местах, не засоряя код с .fillna(0)

В вашем примере, вы передаете в ['numeric1'], который является list и не экстрактор подобно аналогичным набраны df[['numeric1']]. То, что вы можете вместо этого больше похож

FunctionTransformer(operator.itemgetter(columns)) 

, но которые все еще не будет работать, так как объект, который в конечном счете передается в FunctionTransformer будет np.array и не DataFrame.

Для выполнения операций над конкретными столбцами DataFrame вы можете использовать библиотеку, такую ​​как sklearn-pandas, которая позволяет определять определенные трансформаторы по столбцу.

Смежные вопросы