File size: 3,111 Bytes
0ab7b0c |
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
import pandas as pd
# 2018.11.28 Created by Eamon.Zhang
class MeanEncoding():
"""
replacing the label by the mean of the target for that label.
Parameters
----------
"""
def __init__(self, mapping=None, cols=None):
self.cols = cols
self.mapping = mapping
self._dim = None
# self.threshold = threshold
def fit(self, X, y=None, **kwargs):
"""Fit encoder according to X and y.
Parameters
----------
X : array-like, shape = [n_samples, n_features]
Training vectors, where n_samples is the number of samples
and n_features is the number of features.
y : array-like, shape = [n_samples]
Target values.
Returns
-------
self : encoder
Returns self.
"""
self._dim = X.shape[1]
_, categories = self.mean_encoding(
X,
y,
mapping=self.mapping,
cols=self.cols
# threshold=self.threshold
)
self.mapping = categories
return self
def transform(self, X):
"""Perform the transformation to new categorical data.
Will use the mapping (if available) and the column list to encode the
data.
Parameters
----------
X : array-like, shape = [n_samples, n_features]
Returns
-------
X : Transformed values with encoding applied.
"""
if self._dim is None:
raise ValueError('Must train encoder before it can be used to transform data.')
# make sure that it is the right size
if X.shape[1] != self._dim:
raise ValueError('Unexpected input dimension %d, expected %d' % (X.shape[1], self._dim,))
X, _ = self.mean_encoding(
X,
mapping=self.mapping,
cols=self.cols
# threshold=self.threshold
)
return X
def mean_encoding(self, X_in, y=None, mapping=None, cols=None):
"""
Grouping the observations that show rare labels into a unique category ('rare')
"""
X = X_in.copy(deep=True)
# if cols is None:
# cols = X.columns.values
if mapping is not None: # transform
mapping_out = mapping
for i in mapping:
column = i.get('col') # get the column name
X[column] = X[column].map(i['mapping'])
# try:
# X[column] = X[column].astype(int)
# except ValueError as e:
# X[column] = X[column].astype(float)
else: # fit
mapping_out = []
for col in cols:
# if util.is_category(X[col].dtype):
# categories = X[col].cat.categories
# else:
mapping = X[y.name].groupby(X[col]).mean().to_dict()
mapping = pd.Series(mapping)
mapping_out.append({'col': col, 'mapping': mapping, 'data_type': X[col].dtype}, )
return X, mapping_out |