У меня есть трансформатор, который вычисляет процент значений для каждой группы. Первоначально, панды использовались, потому что я начал с панд, а colnames лучше обрабатывать. Однако теперь мне нужно интегрироваться в sklearn-конвейер.pandas to numpy array для конвейера sklearn
Как я могу конвертировать мой трансформатор для поддержки Numpy массивов из более sklearn трубопровода вместо фреймов данных панд? Дело в том, что self.colname
нельзя использовать для массивов numpy, и я думаю, что группировка должна выполняться по-разному.
Как реализовать упорства такого трансформатора, как эти веса необходимости быть загружаемыми с диска для развертывания такого трансформатора в трубопроводе.
class PercentageTransformer(TransformerMixin):
def __init__(self, colname,typePercentage='totalTarget', _target='TARGET', _dropOriginal=True):
self.colname = colname
self._target = _target
self._dropOriginal = _dropOriginal
self.typePercentage = typePercentage
def fit(self, X, y, *_):
original = pd.concat([y,X], axis=1)
grouped = original.groupby([self.colname, self._target]).size()
if self.typePercentage == 'totalTarget':
df = grouped/original[self._target].sum()
else:
df = (grouped/grouped.groupby(level=0).sum())
if self.typePercentage == 'totalTarget':
nameCol = "pre_" + self.colname
else:
nameCol = "pre2_" + self.colname
self.nameCol = nameCol
grouped = df.reset_index(name=nameCol)
groupedOnly = grouped[grouped[self._target] == 1]
groupedOnly = groupedOnly.drop(self._target, 1)
self.result = groupedOnly
return self
def transform(self, dataF):
mergedThing = pd.merge(dataF, self.result, on=self.colname, how='left')
mergedThing.loc[(mergedThing[self.nameCol].isnull()), self.nameCol] = 0
if self._dropOriginal:
mergedThing = mergedThing.drop(self.colname, 1)
return mergedThing
Он будет использоваться в трубопроводе, как это:
pipeline = Pipeline([
('features', FeatureUnion([
('continuous', Pipeline([
('extract', ColumnExtractor(CONTINUOUS_FIELDS)),
])),
('factors', Pipeline([
('extract', ColumnExtractor(FACTOR_FIELDS)),
# using labelencoding and all bias
('bias', PercentageAllTransformer(FACTOR_FIELDS, _dropOriginal=True, typePercentage='totalTarget')),
]))
], n_jobs=-1)),
('estimator', estimator)
])
pipeline
будет оснащен X
и y
, где оба являются кадры данных. Я не уверен в X.as_matrix
.
'объекты pandas' являются обертками вокруг объектов' numpy'. Нет массива 'pandas', я полагаю, вы имеете в виду' Series'? Во всяком случае, может быть, ваша проблема будет решена просто путем возврата 'self.values' вместо' self'. –
Что касается настойчивости, есть несколько способов сделать это. Как правило, сериализация объектов в Python будет использовать модуль pickle. –
Действительно, я имел в виду кадры данных панд. Дело в том, что если я правильно его понимаю: orignal 'original.groupby ([self.colname, self._target]' больше не является фреймворком данных, а массивом numpy, например, colnames больше не работают, поэтому self.values не выглядит –