处理缺失的数据并不是一件容易的事。 方法的范围从简单的均值插补和观察值的完全删除到像MICE这样的更高级的技术。 解决问题的挑战性是选择使用哪种方法。 今天,我们将探索一种简单但高效的填补缺失数据的方法-KNN算法。

KNN代表" K最近邻居",这是一种简单算法,可根据定义的最接近邻居数进行预测。 它计算从您要分类的实例到训练集中其他所有实例的距离。

正如标题所示,我们不会将算法用于分类目的,而是填充缺失值。 本文将使用房屋价格数据集,这是一个简单而著名的数据集,仅包含500多个条目。

这篇文章的结构如下:

1. 数据集加载和探索

1. KNN归因

1. 归因优化

1. 结论

数据集加载和探索

如前所述,首先下载房屋数据集。 另外,请确保同时导入了Numpy和Pandas。 这是前几行的外观:

默认情况下,数据集缺失值非常低-单个属性中只有五个:

让我们改变一下。 您通常不会这样做,但是我们需要更多缺少的值。 首先,我们创建两个随机数数组,其范围从1到数据集的长度。 第一个数组包含35个元素,第二个数组包含20个(任意选择):

i1 = np.random.choice(a=df.index, size=35) i2 = np.random.choice(a=df.index, size=20)

这是第一个数组的样子:

您的数组将有所不同,因为随机化过程是随机的。 接下来,我们将用NAN替换特定索引处的现有值。 这是如何做:

df.loc[i1, 'INDUS'] = np.nan df.loc[i2, 'TAX'] = np.nan

现在,让我们再次检查缺失值-这次,计数有所不同:

这就是我们从归因开始的全部前置工作。 让我们在下一部分中进行操作。

KNN归因

整个插补可归结为4行代码-其中之一是库导入。 我们需要sklearn.impute中的KNNImputer,然后以一种著名的Scikit-Learn方式创建它的实例。 该类需要一个强制性参数– n_neighbors。 它告诉冒充参数K的大小是多少。

首先,让我们选择3的任意数字。稍后我们将优化此参数,但是3足以启动。 接下来,我们可以在计算机上调用fit_transform方法以估算缺失的数据。

最后,我们将结果数组转换为pandas.DataFrame对象,以便于解释。 这是代码:

from sklearn.impute import KNNImputerimputer = KNNImputer(n_neighbors=3)imputed = imputer.fit_transform(df)df_imputed = pd.DataFrame(imputed, columns=df.columns)

非常简单。 让我们现在检查缺失值:

尽管如此,仍然存在一个问题-我们如何为K选择正确的值?

归因优化

该住房数据集旨在通过回归算法进行预测建模,因为目标变量是连续的(MEDV)。 这意味着我们可以训练许多预测模型,其中使用不同的K值估算缺失值,并查看哪个模型表现最佳。

但首先是导入。 我们需要Scikit-Learn提供的一些功能-将数据集分为训练和测试子集,训练模型并进行验证。 我们选择了"随机森林"算法进行训练。 RMSE用于验证:

from sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.metrics import mean_squared_errorrmse = lambda y, yhat: np.sqrt(mean_squared_error(y, yhat))

以下是执行优化的必要步骤:

迭代K的可能范围-1到20之间的所有奇数都可以

1. 使用当前的K值执行插补

1. 将数据集分为训练和测试子集

1. 拟合随机森林模型

1. 预测测试集

1. 使用RMSE进行评估

听起来很多,但可以归结为大约15行代码。 这是代码段:

def optimize_k(data, target):    errors = []    for k in range(1, 20, 2):        imputer = KNNImputer(n_neighbors=k)        imputed = imputer.fit_transform(data)        df_imputed = pd.DataFrame(imputed, columns=df.columns)                X = df_imputed.drop(target, axis=1)        y = df_imputed[target]        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)        model = RandomForestRegressor()        model.fit(X_train, y_train)        preds = model.predict(X_test)        error = rmse(y_test, preds)        errors.append({'K': k, 'RMSE': error})            return errors

现在,我们可以使用修改后的数据集(在3列中缺少值)调用optimize_k函数,并传入目标变量(MEDV):

k_errors = optimize_k(data=df, target='MEDV')

就是这样! k_errors数组如下所示:

以视觉方式表示:

看起来K = 15是给定范围内的最佳值,因为它导致最小的误差。 我们不会涵盖该错误的解释,因为它超出了本文的范围。 让我们在下一节中总结一下。

总结

编写处理缺少数据归因的代码很容易,因为有很多现有的算法可以让我们直接使用。 但是我们很难理解里面原因-了解应该推定哪些属性,不应该推算哪些属性。 例如,可能由于客户未使用该类型的服务而缺失了某些值,因此没有必要执行估算。

最终确定是否需要进行缺失数据的处理,还需要有领域的专业知识,与领域专家进行咨询并研究领域是一种很好的方法。

作者:Dario Radečić

deephub翻译组

knn算法python代码_在python中使用KNN算法处理缺失的数据相关推荐

  1. latex附录中放python代码_在Latex中插入Python代码

    这里指的插入是指最终能在生成的pdf中显示高亮的Python代码. 在Latex中插入Python代码,需要一个第三发的宏包pythonhighlight: https://github.com/ol ...

  2. nms python代码_?标检测中的?极?值抑制算法(nms):python代码解析

    ⾮极⼤值抑制(Non-Maximum Suppression)原理 ⾮极⼤值抑制,顾名思义,找出极⼤值,抑制⾮极⼤值.这种思路和算法在各个领域中应⽤⼴泛,⽐如边缘检测算法canny算⼦中就使⽤了该⽅法 ...

  3. slope one 推荐算法python 代码_基于协同的SlopeOne推荐算法原理介绍和实现

    Slope One 算法是由 Daniel Lemire 教授在 2005 年提出的一个 Item-Based 的协同过滤推荐算法. --文章概要 该篇文章主要介绍Slope One算法.Slope ...

  4. 计算物理作业python代码_使用 Python 解决计算物理问题

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 介绍 拉普拉斯方程是一种最简单的二阶偏微分方程,同样也是一种最简单的椭圆形偏微分方程.此方程在科学界,尤其 ...

  5. fastica算法matlab代码讲解,盲信号提取中的fastICA算法

    盲信号提取中的fastICA算法matlab程序,使用的是负熵作为对照函数,并用正交投影形式进行deflation,可以对任意维的混合信号进行盲提取进而进行分离. 所谓盲信号就是杂乱无章,没有规律可循 ...

  6. l bfgs算法java代码_数值优化:理解L-BFGS算法

    译自<Numerical Optimization: Understanding L-BFGS>,本来只想作为学习CRF的补充材料,读完后发现收获很多,把许多以前零散的知识点都串起来了.对 ...

  7. pca算法python代码_三种方法实现PCA算法(Python)

    主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域.它的主要作用是对高维数据进行降维.PCA把原先的n个特征用数目 ...

  8. 决策树留一法python代码_从实例中归纳决策树_人工智能一

    从实例中归纳决策树_人工智能一 18.3.3 从实例中归纳决策树 布尔决策树的一个实例是由一个输入属性向量X以及一个唯一的布尔输出值y组成的.一个实例集合(X1,y1),-,(X12,y12)如图18 ...

  9. 区域生长算法 python代码_区域生长Python

    我在get8n()函数上遇到了一些问题,所以我重写了它.我相信下面的代码符合你的要求.region_growing()函数中有两行被注释掉.如果您取消注释它们,它们将显示处理过程中发生的事情的动画.这 ...

最新文章

  1. 为什么python不报错不出结果_python的坑货ConfigParser类读取文件失败不报错
  2. .net core redis 驱动推荐,为什么不使用 StackExchange.Redis
  3. Java——n个数的全排列
  4. MFC CStringArray 字符串数组类 使用方法
  5. python list index方法,Python List.index()方法
  6. 信息学奥赛一本通C++语言——1119:矩阵交换行
  7. java如何调用脚本_Java如何调用脚本的特定功能?
  8. 【Zend Studio】10.6.0版本设置默认编码为UTF-8
  9. RapidMiner Studio入门
  10. 键盘密码(Qwerty)——python解密
  11. ubuntu 搜狗输入法异常
  12. 日语中那些表示复数概念的表达方式
  13. matlab实现加减乘除、乘方、开平方、带括号和结果分析的GUI计算器
  14. 医院AI智能随访电话机器人-北京联络加Loojion自主研发
  15. wow盗号木马事件前后
  16. 合并列值(将一列的多个值合并成一行)
  17. CSS: :last-child 与 :first-child的坑
  18. android zip格式应用,Android 压缩解压zip文件
  19. Apache Calcite官方文档中文版- 概览-2. 教程
  20. Excel 做相关性分析

热门文章

  1. java实现客服转接_Java微信公众平台开发(9) 关键字回复以及客服接口实现
  2. css3动画与@keyframes关键帧
  3. 计算机快捷键下档健,电脑文档快捷键
  4. 跳转定义_HTML中的超级链接和锚点跳转
  5. python for android 安装配置_mac appium for android 环境搭建 (appium python pycharm)
  6. 2019mysql安装_2019mysql安装过程
  7. php字符型和数字型的注入,Sql注入的分类:数字型+字符型
  8. php伪协议漏洞_PHP之伪协议深入理解
  9. java spring源码_spring源码分析-spring中的bean
  10. Startlsback常见使用过程中的问题