数据清洗-缺失值填充-K-NN算法(K-Nearest Neighbors, K-NN算法)
目录
- 一、安装所需的python包
- 二、采用K-NN算法进行缺失值填充
- 2.1可直接运行代码
- 2.2以某个缺失值数据进行实战
- 2.2.1代码运行过程截屏:
- 2.2.2填充后的数据截屏:
- 三、K 近邻算法 (K-Nearest Neighbors, KNN) 介绍
- 3.1 K 近邻算法定义
- 3.2 K 近邻算法的基本思想
- 3.3 K 近邻算法的步骤
- 3.4 K 近邻算法的距离度量
- 3.5 K 近邻算法的优缺点
- 3.5.1 优点
- 3.5.2 缺点
- 3.6 K 近邻算法的应用场景
- 3.7 K 近邻算法的改进方法
感觉大家对原理性的东西不太感兴趣,那我就直接举例提供代码,以及详细的注释,大家自己对照改代码应用于你自己建立的模型吧。
这些代码全部是我自己做数模竞赛时候自己用的代码。可以直接运行,记得修改文件路径。
一、安装所需的python包
pip install pandas scikit-learn scipy numpy joblib
二、采用K-NN算法进行缺失值填充
注意代码需要把自己的数据文件格式转换为CSV文件,并且把路径修改为自己文件所在的路径,不会转换的参考我此教程文件格式转换:EXCEL和CSV文件格式互相转换。
我知道大家对原理性的东西不感兴趣,我把他的原理介绍放在文末,需要写论文的同学自己拿去用,记得修改,否则查重率过不去。
2.1可直接运行代码
"""
K-NN
1.**K-最近邻 (K-Nearest Neighbors, K-NN)**: K-NN是一种
基于实例的学习,或是局部而似和将所有计算推识到分类之
后的情性学习。整个训练数据集都存储在横型中。K-NN算
法比其他技术更适合用于多类目分类问题,如果你对填补缺
失值的速度和精度的平衡感兴趣,这是一个不错的选择。这个的效果比牛顿插值法差一点,,而那些训练模型的那个可能是因为数据量太少,效果差,这是我的一点经验。
"""import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.impute import KNNImputer
from scipy.interpolate import interp1d
import numpy as np
import joblib# 读取数据,请将'缺失值填充.csv'替换为你的真实数据文件名
filename = '缺失值填充.csv'
data = pd.read_csv(filename, encoding='gbk')# 分离出有缺失值的列
missing_columns = data.columns[data.isnull().any()]# 使用KNN算法插补缺失值
imputer = KNNImputer(n_neighbors=3)
data_imputed = imputer.fit_transform(data)
data_imputed = pd.DataFrame(data_imputed, columns=data.columns)# 再次加载原始数据,将插补的值填充到相应的位置
original_data = pd.read_csv(filename, encoding='gbk')
missing_value_rows, missing_value_cols = np.where(original_data.isnull())# 替换缺失值为插补值
for row, col in zip(missing_value_rows, missing_value_cols):original_data.iloc[row, col] = data_imputed.iloc[row, col]# 输出处理后的数据
print(original_data)
original_data.to_csv('knn填充.csv', index=False)
2.2以某个缺失值数据进行实战
注意:数据量较少,由自己构建,均有规律,
如下图:
构造缺失值,如下图:
运行代码查看填充后的数据怎么样,
运行代码如下图+填充后的截图:
2.2.1代码运行过程截屏:
2.2.2填充后的数据截屏:
说明:估计是数据量太小,或者缺失值太多,导致填充的效果一般(对于这种规律的数据使用牛顿插值法倒是挺不错的,数据量大的,可以使用神经网络遗传算法来进行缺失值填充,下面我都会介绍),但是你在进行数模比赛时候,需要说明为什么你要选用knn算法,说明他的原理即可,不必纠结填充的数据是否正确,因为你本身也不知道数据的正确性。
接下来我将分享其他我参加数模时候常用的几种数据填充的代码,都是我自己调试跑通过的,大家直接复制粘贴使用。
三、K 近邻算法 (K-Nearest Neighbors, KNN) 介绍
3.1 K 近邻算法定义
K 近邻算法 (K-Nearest Neighbors, KNN) 是一种基本的监督学习算法,主要用于分类和回归问题。KNN 算法基于“相似的输入具有相似的输出”这一假设,通过计算给定数据点与训练数据集中其他点的距离,找出与其最接近的 K
个邻居,然后根据这些邻居的类别或数值进行预测。KNN 算法的核心思想是:相似的样本往往具有相似的输出。
3.2 K 近邻算法的基本思想
KNN 算法没有显式的学习过程,也不需要构建显式的模型,它属于 惰性学习算法。KNN 的主要步骤如下:
- 计算距离:对于一个需要分类或回归的数据点,计算它与训练集中每个数据点的距离。常用的距离度量方法包括欧几里得距离、曼哈顿距离和闵可夫斯基距离等。
- 选择最近的 K 个邻居:根据计算出的距离,选择距离最小的 K 个邻居。
- 投票或平均:
- 分类问题:在分类问题中,KNN 算法根据 K 个邻居中出现次数最多的类别进行投票决定待预测点的类别。
- 回归问题:在回归问题中,KNN 算法通过 K 个邻居的数值平均来预测待预测点的值。
3.3 K 近邻算法的步骤
- 选择参数 K 的值:决定选择多少个邻居参与投票或计算平均值。
- 计算距离:对于待分类或回归的样本,计算它与训练数据集中每个样本的距离。
- 选择最近的 K 个邻居:根据距离对训练数据进行排序,选取距离最近的 K 个样本。
- 进行分类或回归:
- 分类:在 K 个邻居中,选择出现次数最多的类别作为预测结果。
- 回归:在 K 个邻居中,取目标值的平均值作为预测结果。
3.4 K 近邻算法的距离度量
常用的距离度量方法有:
-
欧几里得距离 (Euclidean Distance):
d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x, y) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2} d(x,y)=i=1∑n(xi−yi)2 -
曼哈顿距离 (Manhattan Distance):
d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ d(x, y) = \sum_{i=1}^n |x_i - y_i| d(x,y)=i=1∑n∣xi−yi∣ -
闵可夫斯基距离 (Minkowski Distance):
d ( x , y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 / p d(x, y) = \left( \sum_{i=1}^n |x_i - y_i|^p \right)^{1/p} d(x,y)=(i=1∑n∣xi−yi∣p)1/p
3.5 K 近邻算法的优缺点
3.5.1 优点
- 简单易懂:KNN 算法简单直观,易于理解和实现。
- 无需训练:由于 KNN 是惰性学习算法,它不需要显式的训练过程,计算开销集中在预测阶段。
- 可用于分类和回归:KNN 算法既可以用于分类问题,也可以用于回归问题。
3.5.2 缺点
- 计算复杂度高:对于大数据集,计算待预测点与所有训练数据点的距离需要大量的计算资源。
- 内存开销大:需要存储所有的训练数据,在内存有限的情况下处理大规模数据可能存在困难。
- 对不相关特征敏感:KNN 算法对数据中的不相关特征和噪声比较敏感,需要进行特征选择和数据预处理。
- 参数选择困难:选择合适的 K 值是一个挑战,K 值过小容易导致过拟合,K 值过大容易导致欠拟合。
3.6 K 近邻算法的应用场景
KNN 算法广泛应用于以下场景:
- 分类问题:例如,文本分类、图像分类、用户行为分类等。
- 回归问题:例如,预测房价、预测股票价格等。
- 异常检测:例如,检测信用卡欺诈、网络入侵检测等。
- 推荐系统:例如,电影推荐、商品推荐等。
3.7 K 近邻算法的改进方法
- 归一化或标准化数据:由于 KNN 算法对特征的尺度非常敏感,通常需要对数据进行归一化或标准化处理。
- 使用加权 KNN:在基本的 KNN 中,所有邻居的权重相同,可以改进为对距离更近的邻居赋予更大的权重,以提高算法的准确性。
- 使用降维方法:可以使用 PCA(主成分分析)或其他降维方法减少特征维数,以减少计算量和内存使用。