Machine learning scikit学习另一特征标称值组内特征的插补平均值

Machine learning scikit学习另一特征标称值组内特征的插补平均值,machine-learning,scikit-learn,classification,mean,imputation,Machine Learning,Scikit Learn,Classification,Mean,Imputation,我想插补一个特征的平均值,但仅根据另一列中具有相同类别/标称值的其他示例计算平均值,我想知道使用scikit learn的插补器类是否可行?这样做只会使添加到管道中更容易 例如: 使用kaggle的泰坦尼克号数据集: 我将如何计算每个pclass的平均票价。其背后的想法是,不同阶层的人在票价上会有很大的差异 更新:在与一些人讨论后,我本应该使用的短语是“在课堂上计算平均值” 我已经研究了下面的评论,当我有时间做我想做的事情时,我会构造一个通用的管道函数:)我有一个很好的主意如何做,当它完成后,我

我想插补一个特征的平均值,但仅根据另一列中具有相同类别/标称值的其他示例计算平均值,我想知道使用scikit learn的插补器类是否可行?这样做只会使添加到管道中更容易

例如:

使用kaggle的泰坦尼克号数据集:

我将如何计算每个
pclass
的平均
票价
。其背后的想法是,不同阶层的人在票价上会有很大的差异

更新:在与一些人讨论后,我本应该使用的短语是“在课堂上计算平均值”


我已经研究了下面的评论,当我有时间做我想做的事情时,我会构造一个通用的管道函数:)我有一个很好的主意如何做,当它完成后,我会发布一个答案。

所以下面是一个非常简单的方法来回答我的问题,只是为了处理事情的方式。一个更健壮的实现可能涉及使用scikit learn中的插补器类,这意味着它还可以执行模式、中值等操作,并且能够更好地处理稀疏/密集矩阵

这是基于Vivek Kumar对原始问题的评论,该评论建议将数据拆分成堆栈,然后以这种方式进行插补,然后重新组合

将numpy导入为np
来自sklearn.base导入BaseEstimator,TransformerMixin
带有InclusasMeansImputter的类(基本估计量,转换项):
def_uuuinit_uuu(self,replace_col_index,class_col_index=None,missing_value=np.nan):
self.missing_值=missing_值
self.replace\u col\u index=replace\u col\u index
self.y=None
self.class\u col\u index=class\u col\u index
def配合(自身、X、y=无):
self.y=y
回归自我
def变换(自,X):
y=self.y
类别=np.唯一(y)
堆栈=[]
如果len(X)>1且len(self.y)=len(X):
如果(self.class\u col\u index==无):
#如果我们用的是因变量
对于类中的aclass:
_缺失=X[(y==aclass)&
(X[:,self.replace_col_index]==self.missing_值)]
无_缺失=X[(y==aclass)&
(X[:,self.replace_col_index]!=self.missing_值)]
列=不缺少列[:,self.replace\u col\u index]
#根据示例计算平均值,无遗漏值
平均值=np.mean(列[不缺少[:,self.replace\u col\u index]!=self.missing\u值])
#广播所有缺失值的平均值
缺少[:,self.replace\u col\u index]=平均值
stacks.append(np.concatenate((缺少_,没有缺少_)))
其他:
#如果我们在二值化功能中使用标称值(即类
#在标称列中是否有唯一值(例如性别)
对于类中的aclass:
带有_missing=X[(X[:,self.class\u col\u index]==aclass)&
(X[:,self.replace_col_index]==self.missing_值)]
没有_missing=X[(X[:,self.class\u col\u index]==aclass)&
(X[:,self.replace_col_index]!=self.missing_值)]
列=不缺少列[:,self.replace\u col\u index]
#根据示例计算平均值,无遗漏值
平均值=np.mean(列[不缺少[:,self.replace\u col\u index]!=self.missing\u值])
#广播所有缺失值的平均值
缺少[:,self.replace\u col\u index]=平均值
stacks.append(np.concatenate((缺少_,没有缺少_)))
如果len(堆栈)>1:
#重新组合我们的价值观
X=np.串联(堆栈)
返回X

您可以按照
pclass
分割数据,为它们计算
票价
,然后再次叠加以生成完整的数据。谢谢@VivekKumar!作为我的管道的一部分,我将对此进行研究。您可以查看以获得实现自己的类的提示,这些类可以在管道中使用。此外,您可能还应该在
fit
时间学习相关统计信息,以便测试数据不会使用自己的分布进行插补。