机器学习算法:K近邻(k-nearest neighbors)回归实战

简介: 机器学习算法:K近邻(k-nearest neighbors)回归实战

2.4.3 模拟数据集--kNN回归

Step1: 库函数导入

#Demo来自sklearn官网importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.neighborsimportKNeighborsRegressor

Step2: 数据导入&分析

1


/

np.random.seed(0)
# 随机生成40个(0, 1)之前的数,乘以5,再进行升序X=np.sort(5*np.random.rand(40, 1), axis=0)
# 创建[0, 5]之间的500个数的等差数列, 作为测试数据T=np.linspace(0, 5, 500)[:, np.newaxis]
# 使用sin函数得到y值,并拉伸到一维y=np.sin(X).ravel()
# Add noise to targets[y值增加噪声]y[::5] +=1* (0.5-np.random.rand(8))


Step3: 模型训练&预测可视化

# ############################################################################## Fit regression model# 设置多个k近邻进行比较n_neighbors= [1, 3, 5, 8, 10, 40]
# 设置图片大小plt.figure(figsize=(10,20))
fori, kinenumerate(n_neighbors):
# 默认使用加权平均进行计算predictorclf=KNeighborsRegressor(n_neighbors=k, p=2, metric="minkowski")
# 训练clf.fit(X, y)
# 预测y_=clf.predict(T)
plt.subplot(6, 1, i+1)
plt.scatter(X, y, color='red', label='data')
plt.plot(T, y_, color='navy', label='prediction')
plt.axis('tight')
plt.legend()
plt.title("KNeighborsRegressor (k = %i)"% (k))
plt.tight_layout()
plt.show()

tight_layout

会自动调整子图参数,使之填充整个图像区域。这是个实验特性,可能在一些情况下不工作。它仅仅检查坐标轴标签、刻度标签以及标题的部分。

使用之前:



使用之后:


Step4:模型分析

当k=1时,预测的结果只和最近的一个训练样本相关,从预测曲线中可以看出当k很小时候很容易发生过拟合。

当k=40时,预测的结果和最近的40个样本相关,因为我们只有40个样本,此时是所有样本的平均值,此时所有预测值都是均值,很容易发生欠拟合。

一般情况下,使用knn的时候,根据数据规模我们会从[3, 20]之间进行尝试,选择最好的k,例如上图中的[3, 10]相对1和40都是还不错的选择。

2.4.4 马绞痛数据--kNN数据预处理+kNN分类pipeline

1

下载需要用到的数据集


!wget https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/3K/horse-colic.csv





# 下载数据集介绍

!wget https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/3K/horse-colic.names


/bin/sh: wget: command not found

Step1: 库函数导入

1

importnumpyasnpimportpandasaspd# kNN分类器fromsklearn.neighborsimportKNeighborsClassifier# kNN数据空值填充fromsklearn.imputeimportKNNImputer# 计算带有空值的欧式距离fromsklearn.metrics.pairwiseimportnan_euclidean_distances# 交叉验证fromsklearn.model_selectionimportcross_val_score# KFlod的函数fromsklearn.model_selectionimportRepeatedStratifiedKFoldfromsklearn.pipelineimportPipelineimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_split

Step2: 数据导入&分析

2,1,530101,38.50,66,28,3,3,?,2,5,4,4,?,?,?,3,5,45.00,8.40,?,?,2,2,11300,00000,00000,2 1,1,534817,39.2,88,20,?,?,4,1,3,4,2,?,?,?,4,2,50,85,2,2,3,2,02208,00000,00000,2 2,1,530334,38.30,40,24,1,1,3,1,3,3,1,?,?,?,1,1,33.00,6.70,?,?,1,2,00000,00000,00000,1 1,9,5290409,39.10,164,84,4,1,6,2,2,4,4,1,2,5.00,3,?,48.00,7.20,3,5.30,2,1,02208,00000,00000,1 2,1,530255,37.30,104,35,?,?,6,2,?,?,?,?,?,?,?,?,74.00,7.40,?,?,2,2,04300,00000,00000,2 ......

数据集介绍:horse-colic.names

数据中的'?'表示空值,如果我们使用KNN分类器,'?'不能数值,不能进行计算,因此我们需要进行数据预处理对空值进行填充。

这里我们使用KNNImputer进行空值填充,KNNImputer填充的原来很简单,计算每个样本最近的k个样本,进行空值填充。

我们先来看下KNNImputer的运行原理:

Step3: KNNImputer空值填充--使用和原理介绍

1X= [[1, 2, np.nan], [3, 4, 3], [np.nan, 6, 5], [8, 8, 7]]
imputer=KNNImputer(n_neighbors=2, metric='nan_euclidean')
imputer.fit_transform(X)


[9]:

array([[1. , 2. , 4. ], ,       [3. , 4. , 3. ], ,       [5.5, 6. , 5. ], ,       [8. , 8. , 7. ]])

带有空值的欧式距离计算公式

1

nan_euclidean_distances([[np.nan, 6, 5], [3, 4, 3]], [[3, 4, 3], [1, 2, np.nan], [8, 8, 7]])


[10]:

array([[3.46410162, 6.92820323, 3.46410162], ,       [0.        , 3.46410162, 7.54983444]])

Step4: KNNImputer空值填充--欧式距离的计算

样本[1, 2, np.nan] 最近的2个样本是: [3, 4, 3] [np.nan, 6, 5], 计算距离的时候使用欧式距离,只关注非空样本。 [1, 2, np.nan] 填充之后得到 [1, 2, (3 + 5) / 2] = [1, 2, 4]

只计算所有非空的值,对所有空加权到非空值的计算上,上例中,我们看到一个有3维,只有第二维全部非空, 将第一维和第三维的计算加到第二维上,所有需要乘以3。

表格中距离度量使用的是带有空值欧式距离计算相似度,使用简单的加权平均进行填充。

带有空值的样本

最相近的样本1

最相近的样本2

填充之后的值

[1, 2,np.nan]

[3, 4, 3]; 3.46

[np.nan, 6, 5]; 6.93

[1, 2,4]

[np.nan, 6, 5]

[3, 4, 3]; 3.46

[8, 8, 7]; 3.46

[5.5, 6, 5]

1# load dataset, 将?变成空值input_file='./horse-colic.csv'df_data=pd.read_csv(input_file, header=None, na_values='?')



# 得到训练数据和label, 第23列表示是否发生病变, 1: 表示Yes; 2: 表示No. data=df_data.valuesix= [iforiinrange(data.shape[1]) ifi!=23]
X, y=data[:, ix], data[:, 23]



# 查看所有特征的缺失值个数和缺失率foriinrange(df_data.shape[1]):
n_miss=df_data[[i]].isnull().sum()
perc=n_miss/df_data.shape[0] *100ifn_miss.values[0] >0:
print('>Feat: %d, Missing: %d, Missing ratio: (%.2f%%)'% (i, n_miss, perc))
# 查看总的空值个数print('KNNImputer before Missing: %d'%sum(np.isnan(X).flatten()))
# 定义 knnimputerimputer=KNNImputer()
# 填充数据集中的空值imputer.fit(X)
# 转换数据集Xtrans=imputer.transform(X)
# 打印转化后的数据集的空值print('KNNImputer after Missing: %d'%sum(np.isnan(Xtrans).flatten()))

>Feat: 0, Missing: 1, Missing ratio: (0.33%) >Feat: 3, Missing: 60, Missing ratio: (20.00%) >Feat: 4, Missing: 24, Missing ratio: (8.00%) >Feat: 5, Missing: 58, Missing ratio: (19.33%) >Feat: 6, Missing: 56, Missing ratio: (18.67%) >Feat: 7, Missing: 69, Missing ratio: (23.00%) >Feat: 8, Missing: 47, Missing ratio: (15.67%) >Feat: 9, Missing: 32, Missing ratio: (10.67%) >Feat: 10, Missing: 55, Missing ratio: (18.33%) >Feat: 11, Missing: 44, Missing ratio: (14.67%) >Feat: 12, Missing: 56, Missing ratio: (18.67%) >Feat: 13, Missing: 104, Missing ratio: (34.67%) >Feat: 14, Missing: 106, Missing ratio: (35.33%) >Feat: 15, Missing: 247, Missing ratio: (82.33%) >Feat: 16, Missing: 102, Missing ratio: (34.00%) >Feat: 17, Missing: 118, Missing ratio: (39.33%) >Feat: 18, Missing: 29, Missing ratio: (9.67%) >Feat: 19, Missing: 33, Missing ratio: (11.00%) >Feat: 20, Missing: 165, Missing ratio: (55.00%) >Feat: 21, Missing: 198, Missing ratio: (66.00%) >Feat: 22, Missing: 1, Missing ratio: (0.33%) KNNImputer before Missing: 1605 KNNImputer after Missing: 0

Step5: 基于pipeline模型训练&可视化

什么是Pipeline, 我这里直接翻译成数据管道。任何有序的操作有可以看做pipeline,例如工厂流水线,对于机器学习模型来说,这就是数据流水线。 是指数据通过管道中的每一个节点,结果除了之后,继续流向下游。对于我们这个例子,数据是有空值,我们会有一个KNNImputer节点用来填充空值, 之后继续流向下一个kNN分类节点,最后输出模型。

results=list()
strategies= [str(i) foriin [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 18, 20, 21]]
forsinstrategies:
# create the modeling pipelinepipe=Pipeline(steps=[('imputer', KNNImputer(n_neighbors=int(s))), ('model', KNeighborsClassifier())])
# 数据多次随机划分取平均得分scores= []
forkinrange(20):
# 得到训练集合和验证集合, 8: 2X_train, X_test, y_train, y_test=train_test_split(Xtrans, y, test_size=0.2)
pipe.fit(X_train, y_train)
# 验证modelscore=pipe.score(X_test, y_test)
scores.append(score)
# 保存resultsresults.append(np.array(scores))
print('>k: %s, Acc Mean: %.3f, Std: %.3f'% (s, np.mean(scores), np.std(scores)))
# print(results)# plot model performance for comparisonplt.boxplot(results, labels=strategies, showmeans=True)
plt.show()

>k: 1, Acc Mean: 0.800, Std: 0.031 >k: 2, Acc Mean: 0.821, Std: 0.041 >k: 3, Acc Mean: 0.833, Std: 0.053 >k: 4, Acc Mean: 0.824, Std: 0.037 >k: 5, Acc Mean: 0.802, Std: 0.038 >k: 6, Acc Mean: 0.811, Std: 0.030 >k: 7, Acc Mean: 0.797, Std: 0.056 >k: 8, Acc Mean: 0.819, Std: 0.044 >k: 9, Acc Mean: 0.820, Std: 0.032 >k: 10, Acc Mean: 0.815, Std: 0.046 >k: 15, Acc Mean: 0.818, Std: 0.037 >k: 16, Acc Mean: 0.811, Std: 0.048 >k: 18, Acc Mean: 0.809, Std: 0.043 >k: 20, Acc Mean: 0.810, Std: 0.038 >k: 21, Acc Mean: 0.828, Std: 0.038

Step 6: 结果分析

我们的实验是每个k值下,随机切分20次数据, 从上述的图片中, 根据k值的增加,我们的测试准确率会有先上升再下降再上升的过程。 [3, 5]之间是一个很好的取值,上文我们提到,k很小的时候会发生过拟合,k很大时候会发生欠拟合,当遇到第一下降节点,此时我们可以 简单认为不在发生过拟合,取当前的k值即可。

2.5 KNN原理介绍

k近邻方法是一种惰性学习算法,可以用于回归和分类,它的主要思想是投票机制,对于一个测试实例x, 我们在有标签的训练数据集上找到和最相近的k个数据,用他们的label进行投票,分类问题则进行表决投票,回归问题使用加权平均或者直接平均的方法。knn算法中我们最需要关注两个问题:k值的选择和距离的计算。 kNN中的k是一个超参数,需要我们进行指定,一般情况下这个k和数据有很大关系,都是交叉验证进行选择,但是建议使用交叉验证的时候,k∈[2,20],使用交叉验证得到一个很好的k值。

k值还可以表示我们的模型复杂度,当k值越小意味着模型复杂度表达,更容易过拟合,(用极少树的样例来绝对这个预测的结果,很容易产生偏见,这就是过拟合)。我们有这样一句话,k值越多学习的估计误差越小,但是学习的近似误差就会增大。


距离/相似度的计算:

补充:欧式距离:https://zhuanlan.zhihu.com/p/350744027

曼哈顿距离

相关文章
|
11天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
37 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
21天前
|
机器学习/深度学习 TensorFlow API
机器学习实战:TensorFlow在图像识别中的应用探索
【10月更文挑战第28天】随着深度学习技术的发展,图像识别取得了显著进步。TensorFlow作为Google开源的机器学习框架,凭借其强大的功能和灵活的API,在图像识别任务中广泛应用。本文通过实战案例,探讨TensorFlow在图像识别中的优势与挑战,展示如何使用TensorFlow构建和训练卷积神经网络(CNN),并评估模型的性能。尽管面临学习曲线和资源消耗等挑战,TensorFlow仍展现出广阔的应用前景。
49 5
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
|
1月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
1月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
66 2
|
1月前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
74 1
|
1月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
59 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
1月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
1月前
|
机器学习/深度学习 算法 Python
探索机器学习中的决策树算法:从理论到实践
【10月更文挑战第5天】本文旨在通过浅显易懂的语言,带领读者了解并实现一个基础的决策树模型。我们将从决策树的基本概念出发,逐步深入其构建过程,包括特征选择、树的生成与剪枝等关键技术点,并以一个简单的例子演示如何用Python代码实现一个决策树分类器。文章不仅注重理论阐述,更侧重于实际操作,以期帮助初学者快速入门并在真实数据上应用这一算法。
|
20天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的决策树算法
【10月更文挑战第29天】本文将深入浅出地介绍决策树算法,一种在机器学习中广泛使用的分类和回归方法。我们将从基础概念出发,逐步深入到算法的实际应用,最后通过一个代码示例来直观展示如何利用决策树解决实际问题。无论你是机器学习的初学者还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和指导。

热门文章

最新文章

下一篇
无影云桌面