Я играю с набором данных Titani c и хотел создать пользовательский импутер для заполнения пропущенных значений age
с помощью прогнозов из модели LinearRegression. Пожалуйста, найдите код ниже:
import seaborn as sns
import pandas as pd
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LinearRegression
from sklearn.base import BaseEstimator, TransformerMixin
titanic = sns.load_dataset('titanic')
class AgeImputer(TransformerMixin, BaseEstimator):
def fit(self, x, y=None):
self.model = LinearRegression()
# just use two columns for this example
self.independent_columns = ['fare', 'pclass']
# split the null age values from rest of data
self.null_age_data = x[pd.isnull(x['age'])]
self.age_data = x[pd.isnull(x['age'])==False]
# fit the model on age_data
self.model.fit(self.age_data[self.independent_columns], self.age_data['age'])
return self
def transform(self, x):
""" make predictions and return the whole dataframe """
self.null_age_data['age'] = self.model.predict(self.null_age_data[self.independent_columns])
return self.null_age_data.append(self.age_data)
age_imputer = make_pipeline(
AgeImputer()
)
age_imputer.fit_transform(titanic)
Мне интересно, является ли это лучшим способом создания импутера, подобного этому. Причина в том, что передача всего фрейма данных и сохранение его в виде переменных класса кажется пустой тратой памяти. Есть ли более простое решение, чем это? Заранее спасибо!