scikit-learn 在另一特征的不同类别值组内填补特征的均值

我想填补某个特征的均值,但只基于另一列中具有相同类别/名义值的其他示例来计算均值。我想知道这是否可以使用scikit-learn的Imputer类来实现?这样做会更容易将其添加到管道中。

例如:

使用来自kaggle的泰坦尼克数据集:来源

我该如何填补每个pclassfare均值?背后的想法是不同类别的人在票价上会有很大的差异。

更新:在与一些人讨论后,我应该使用的短语是“在类别内填补均值”。

我已经查看了下面的@某人的评论,并将在有时间时构建一个通用的管道函数来实现我想要的。我已经有了如何做的好主意,并会在完成后作为答案发布。


回答:

因此,下面是对我的问题的一个相当简单的处理方法,仅用于处理均值。更健壮的实现可能需要使用scikit-learn的Imputer类,这样它也可以处理众数、中位数等,并且在处理稀疏/密集矩阵时会更有效。

这是基于@某人对原始问题的评论,建议将数据分成堆栈,然后以这种方式填补并重新组装它们。

import numpy as npfrom sklearn.base import BaseEstimator, TransformerMixinclass WithinClassMeanImputer(BaseEstimator, TransformerMixin):    def __init__(self, replace_col_index, class_col_index = None, missing_values=np.nan):        self.missing_values = missing_values        self.replace_col_index = replace_col_index        self.y = None        self.class_col_index = class_col_index    def fit(self, X, y = None):        self.y = y        return self    def transform(self, X):        y = self.y        classes = np.unique(y)        stacks = []        if len(X) > 1 and len(self.y) = len(X):            if( self.class_col_index == None ):                # 如果我们使用的是依赖变量                for aclass in classes:                    with_missing = X[(y == aclass) &                                         (X[:, self.replace_col_index] == self.missing_values)]                    without_missing = X[(y == aclass) &                                             (X[:, self.replace_col_index] != self.missing_values)]                    column = without_missing[:, self.replace_col_index]                    # 从没有缺失值的示例中计算均值                    mean = np.mean(column[without_missing[:, self.replace_col_index] != self.missing_values])                    # 将均值广播到所有缺失值                    with_missing[:, self.replace_col_index] = mean                    stacks.append(np.concatenate((with_missing, without_missing)))            else:                # 如果我们使用的是二值化特征内的名义值(即类别                # 是名义列内的唯一值 - 例如性别)                for aclass in classes:                    with_missing = X[(X[:, self.class_col_index] == aclass) &                                         (X[:, self.replace_col_index] == self.missing_values)]                    without_missing = X[(X[:, self.class_col_index] == aclass) &                                             (X[:, self.replace_col_index] != self.missing_values)]                    column = without_missing[:, self.replace_col_index]                    # 从没有缺失值的示例中计算均值                    mean = np.mean(column[without_missing[:, self.replace_col_index] != self.missing_values])                    # 将均值广播到所有缺失值                    with_missing[:, self.replace_col_index] = mean                    stacks.append(np.concatenate((with_missing, without_missing)))            if len(stacks) > 1 :                # 重新组装我们的值堆栈                X = np.concatenate(stacks)        return X

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注