社区编辑申请
注册/登录
在Python中使用KNN算法处理缺失的数据
开发 后端 大数据 算法
处理缺失的数据并不是一件容易的事。 方法的范围从简单的均值插补和观察值的完全删除到像MICE这样的更高级的技术。 解决问题的挑战性是选择使用哪种方法。 今天,我们将探索一种简单但高效的填补缺失数据的方法-KNN算法。

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

 

在python中使用KNN算法处理缺失的数据

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

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

这篇文章的结构如下:

  • 数据集加载和探索
  • KNN归因
  • 归因优化
  •  结论

数据集加载和探索

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

 

在python中使用KNN算法处理缺失的数据

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

 

在python中使用KNN算法处理缺失的数据

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

 

  1. i1 = np.random.choice(a=df.indexsize=35)  
  2. i2 = np.random.choice(a=df.indexsize=20) 

这是第一个数组的样子:

 

在python中使用KNN算法处理缺失的数据

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

 

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

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

 

在python中使用KNN算法处理缺失的数据

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

KNN归因

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

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

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

 

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

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

 

在python中使用KNN算法处理缺失的数据

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

归因优化

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

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

 

  1. from sklearn.model_selection import train_test_split 
  2. from sklearn.ensemble import RandomForestRegressor 
  3. from sklearn.metrics import mean_squared_error 
  4.  
  5. rmse = lambda y, yhat: np.sqrt(mean_squared_error(y, yhat)) 

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

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

  • 使用当前的K值执行插补
  • 将数据集分为训练和测试子集
  • 拟合随机森林模型
  • 预测测试集
  • 使用RMSE进行评估

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

 

  1. def optimize_k(data, target): 
  2.     errors = [] 
  3.     for k in range(1, 20, 2): 
  4.         imputer = KNNImputer(n_neighbors=k) 
  5.         imputed = imputer.fit_transform(data) 
  6.         df_imputed = pd.DataFrame(imputed, columns=df.columns) 
  7.          
  8.         X = df_imputed.drop(target, axis=1) 
  9.         y = df_imputed[target] 
  10.         X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) 
  11.  
  12.         model = RandomForestRegressor() 
  13.         model.fit(X_train, y_train) 
  14.         preds = model.predict(X_test) 
  15.         error = rmse(y_test, preds) 
  16.         errors.append({'K': k, 'RMSE': error}) 
  17.          
  18.     return errors 

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

  1. k_errors = optimize_k(data=df, target='MEDV'

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

 

在python中使用KNN算法处理缺失的数据

以视觉方式表示:

 

在python中使用KNN算法处理缺失的数据

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

总结

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

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

责任编辑:未丽燕 来源: 今日头条
相关推荐

2022-04-11 11:38:44

Python代码游戏

2022-05-17 09:14:50

聚类算法python

2022-05-03 22:25:57

Python浏览器语言

2022-05-10 16:04:40

编程语言PythonC语言

2022-04-01 15:36:05

Python推荐系统数据

2022-04-13 18:40:59

Python开发

2022-05-25 07:11:13

2022-05-07 07:26:05

PyScriptHTMLPython 代码

2022-05-02 16:27:01

JavaScriptHTMLPython

2022-05-06 10:21:22

Python人脸识别

2022-05-11 12:12:32

ScapyPython网络包

2022-05-03 23:44:21

Python动态链接库Ctypes

2022-05-16 09:34:17

Python可视化图表

2022-04-19 08:29:12

Python机器学习

2022-04-24 10:12:25

Python软件包代码

2022-05-10 07:24:19

2022-05-13 09:34:00

Slik-wrang机器学习人工智能

2022-04-25 14:06:28

数据分析人工智能机器学习

2022-03-28 14:08:02

Python数据清洗数据集

2022-04-17 23:09:07

深度学习人工智能芯片

同话题下的热门内容

简单的六种防止数据重复提交的方法!用Python进行人脸识别「包括源代码」超实用!教你用 Python 获取并下载美股数据在 Go 中实现一个支持并发的 TCP 服务端Python或R:哪种编程语言更适合数据科学?用 XML 和 Java 构建树莓派打印机的用户界面C语言:如何给全局变量起一个别名?什么!Sentinel流控规则可以这样玩?

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号