【问题标题】:knn imputation of categorical variables in pythonpython中分类变量的knn插补
【发布时间】:2017-09-17 00:27:44
【问题描述】:

我正在尝试从数据集上的 fancyimpute 模块实现 kNN。我能够使用以下代码实现数据集的连续变量的代码:

knn_impute2=KNN(k=3).complete(train[['LotArea','LotFrontage']]) 

它会产生如下理想的答案:This show how the original dataset looks like and how it has changed using knn imputation

我尝试为分类数据集实现相同的代码,但出现错误:

could not convert string to float: 'female'

这是我使用的代码(我正在尝试使用 Imputer):

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='most_frequent', axis=0)
imp.fit(df['sex'])
print(imp.transform(df['sex']))

我做错了什么?

回顾一下,我想在这个数据集上使用 knn 插补来插补性别列。下面是数据集。

The dataset i want to impute using knn imputation with k value 2

我如何使用 knnimpute 来做到这一点,或者我需要编写自己的函数。如果是,任何人都可以帮助我。谢谢

【问题讨论】:

  • 大多数 scikit-learn 估计器/转换器只处理数字,而不是字符串。因此,首先将您的字符串分类数据转换为数字,然后尝试
  • 当然。我已经在想一个主意了。但 Imputer 无法将 np.NaN 转换为标签
  • 你如何定义类别/分类变量之间的距离,欧几里得或其他?
  • 我使用了欧式距离,否则,说明对分类变量使用汉明距离
  • 欧几里得坐标系上未定义的两个对象之间的欧几里得距离的定义是什么?例如。我可以轻松地对“category1”、“category2”和“category3”进行一次热编码。但我无法确定它们的相对距离。

标签: python machine-learning knn imputation


【解决方案1】:

我能够使用下面列出的步骤来估算分类变量。我很乐意欢迎任何可以自动执行此类任务的遗漏或程序

Step1:将对象的数据类型(全部)子集到另一个容器中

Step2:将np.NaN 更改为对象数据类型,例如None。现在,容器仅由 objects 数据类型组成

Step3:将整个容器变成分类数据集

Step4:对数据集进行编码(我使用的是.cat.codes)

Step5:将编码后的None的值改回np.NaN

Step5:使用 KNN(来自 fancyimpute)来估算缺失值

Step6:将编码数据集重新映射到其初始名称

【讨论】:

  • R包imputeMulti...我不会用Python,所以不能提供参考
【解决方案2】:

Imputer 仅适用于数字。您可以使用 map 函数将 'sex' 列转换为数字 1 和 0

df.sex=df.sex.map({'female':1,'male':0})

之后,您可以使用Imputer 将所有缺失值填充为 1 或 0,然后再次使用 map 函数将 'sex' 转换回字符串值(如果需要)。

【讨论】:

  • 我已经这样做了。请记住,性别列中有 np.NaN,而 Imputer 无法将其转换为标签。
  • @KINNI 不,Imputer 可以处理 np.nan,如本示例中给出的 - scikit-learn.org/stable/modules/…。它将返回一个整数,您可以将其转换回标签
  • 我将重试并发布我得到的错误。感谢您尝试并发布您获得的输出。
  • 你是怎么处理你的问题的,我也一样
  • 此技巧仅适用于二进制类别,其中 0 和 1 的“平均值”可以使用舍入重新解释为 0 或 1(使用您的示例,0.7 大致为女性,0.2 大致为男性。)在超过 2 个类别的情况下,不要使用此技巧。框架挑战:您有类别映射{狗:1,猫:2,鸟:3}。 Imputer 为您提供 2。您确定 Imputer 没有尝试将狗和鸟的平均值作为其预测吗?
猜你喜欢
  • 2021-03-02
  • 1970-01-01
  • 2020-02-05
  • 2021-07-11
  • 1970-01-01
  • 2019-03-05
  • 2016-01-16
  • 1970-01-01
  • 2017-01-17
相关资源
最近更新 更多