我正在尝试第一次编写自定义转换器。我的目标是编写一个利用StandardScaler()的类似变压器类。这是数据集的链接-https://www.kaggle.com/iabhishekofficial/mobile-price-classification/kernels 。我的所有特征都是数字(乍一看),但是有些特征具有不同的值,有些具有连续的值。因此,我认为不同的值是映射的,因此它们实际上是分类特征。如果标准化,这些功能将失去其意义。 因此,我的目的是创建一个自定义转换器,该转换器可以确定哪些输入特征是数字输入的,哪些是分类输入的,然后应使用SK Learn提供的StandardScaler类对数字输入特征进行标准化。
代码如下:
#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(缺失值)。我不知道为什么会这样。