Пользовательский трансформатор для конвейеров ML - PullRequest
0 голосов
/ 25 мая 2020

Я впервые пытаюсь написать собственный трансформатор. Моя цель - написать класс преобразователя, аналогичный тому, который использует StandardScaler (). Вот ссылка на набор данных - https://www.kaggle.com/iabhishekofficial/mobile-price-classification/kernels. Все мои функции числовые (на первый взгляд), но некоторые функции имеют разные значения, а некоторые - непрерывные. Итак, я решил, что отображаются различные значения, и, следовательно, они на самом деле являются категориальными характеристиками. Эти функции потеряют свое значение, если их стандартизировать. Итак, моя цель - создать собственный преобразователь, который определяет, какие входные функции являются числовыми, а какие - категориальными, а затем он должен стандартизировать числовые функции с использованием класса StandardScaler, предоставляемого SK learn.

Вот код:

#Custom transformer to standardize the continuous numerical values
class CustomNormalizer(BaseEstimator,TransformerMixin):

    #Class Constructor
    def __init__(self,features,copy=True,with_mean=True,with_std=True):
        self.features = features
        self.scaler = StandardScaler(copy,with_mean,with_std)

    #Return the fit features
    def fit( self, X, y = None ):
        return self

    # Custom transformer 
    def transform(self, X, y = None):
        categorical_feature_names = []
        numerical_feature_names = []

        unique_entries = pd.DataFrame(X[self.features].nunique(), columns = ['values']).T
        for feature in unique_entries.columns:
            if(unique_entries.loc["values", feature] == 2):
                categorical_feature_names.append(feature)
            else:
                numerical_feature_names.append(feature)

        numerical_features_scaled = self.scaler.fit_transform(X[numerical_feature_names])
        numerical_features = pd.DataFrame(numerical_features_scaled, columns = numerical_feature_names) 

        categorical_features = X.drop(numerical_feature_names, axis = 1)

        return categorical_features.join(numerical_features)

Затем я создаю экземпляр этого класса и подгоняю и трансформирую набор данных:

norm = CustomNormalizer(inputs.columns.values)
norm.fit(X_train, y_train)
norm.transform(X_train, y_train)

Проблема в том, что в результате я сохранил категориальные функции, но числовые функции дают много NaN ( отсутствующие значения). Я не могу понять, почему это происходит.

DataFrame Before: enter image description here

DataFrame After: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...