寻找做网站,员工管理系统,电子商务外包公司,网页设计师证书报名官网K近邻分类器#xff08;KNN#xff09;#xff08;4-2#xff09; K近邻分类器#xff08;K-Nearest Neighbor#xff0c;简称KNN#xff09;是一种基本的机器学习分类算法。它的工作原理是#xff1a;在特征空间中#xff0c;如果一个样本在特征空间中的K个最相邻的样…K近邻分类器KNN4-2 K近邻分类器K-Nearest Neighbor简称KNN是一种基本的机器学习分类算法。它的工作原理是在特征空间中如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别则该样本也属于这个类别。
具体来说KNN算法首先计算待分类样本与其他所有样本的距离然后按照距离的递增关系进行排序选取距离最小的K个样本最后根据这K个样本的类别通过多数投票等方式进行预测。当K1时KNN算法又称为最近邻算法。
KNN算法的优点包括
思想简单易于理解和实现。对数据分布没有假设完全基于距离度量进行分类。适用范围广可以用于多分类问题。
然而KNN算法也存在一些缺点
对距离度量函数和K值的选择敏感不同的距离度量函数和K值可能会产生不同的分类结果。计算量大需要计算待分类样本与所有训练样本的距离。内存需求大需要存储所有的训练样本。可解释性不强无法给出决策边界等直观的解释。
KNN算法的应用场景非常广泛包括但不限于
垃圾邮件识别可以将邮件分为“垃圾邮件”或“正常邮件”两类。图像内容识别由于图像的内容种类可能很多因此这是一个多类分类问题。文本情感分析既可以作为二分类问题褒贬两种情感也可以作为多类分类问题如十分消极、消极、积极、十分积极等。
此外KNN算法还可以用于其他机器学习任务如手写数字识别、鸢尾花分类等。在这些任务中KNN算法都表现出了较好的性能。
数据实例
IDAgeExperienceIncomeZIP CodeFamilyCCAvgEducationMortgagePersonal LoanSecurities AccountCD AccountOnlineCreditCard1251499110741.6100100024519349008931.5100100033915119472011100000043591009411212.720000005358459133041200000163713299212140.421550001075327729171121.5200001085024229394310.3300000193510819008930.6210400010103491809302318.930100001165391059471042.4300000012295459027730.120000101348231149310623.83001000145932409492042.5200001015674111291741121001000166030229505411.530000111738141309501044.7313410000184218819430542.410000001946211939160428.13010000205528219472010.52001001215631259401540.9211100010225727639009532300001023295629027711.2126000010244418439132020.71163010002536111529552123.9115900001264319299430530.519700010274016839506440.230000002846201589006412.41000011295630489453912.230000113038131199410413.32010111315935359310611.23122000103240162994117122000010335328419480120.631930000034306189133030.9300000035315509403541.83000010364824819264730.710000003759351219472012.91000001385125719581411.431980000039421814194114353011110403813809411540.7328500010415732849267231.6300100042349609412232.31000000433271329001941.1241210010443915459561610.710000104546201049406515.71000011465731529472042.51000001473914439501430.72153000104837121949138040.2321111111495626819574724.53000001504016499237311.810000015132889209340.720010105261371319472012.9100001053306729400510.11207000005450261909024532.132401001055295449581910.2300001056411713994022281000010575530299400530.120011105856311319561621.2301000059282939406520.21000000603151889132024.5145500000614924399040431.720010106247211259340715.7111201000634218229008911100000064421732945234020000106547231059002423.310000006659351319136013.810000116762361059567022.8133600000685323459512342313201000694721609340732.11000011705329209004540.210000107142181159133513.510000017253296993907412000010734420130920071510000017441168594606143000011752831359461123.31000001763171359490143.82010111
使用第1题中的Universal Bank数据集。
注意数据集中的编号ID和邮政编码ZIP CODE特征因为在分类模型中无意义所以在数据预处理阶段将它们删除。
使用KNN对数据进行分类
使用留出法划分数据集训练集:测试集为7:3。
# 使用留出法划分数据集训练集:测试集为7:3
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state42)
使用KNN对训练集进行训练
# 使用KNN算法对训练集进行训练最近邻的数量K设置为5
model KNeighborsClassifier(n_neighbors5)
model.fit(X_train, y_train)
最近邻的数量K设置为5。
使用训练好的模型对测试集进行预测并输出预测结果和模型准确度
# 使用训练好的模型对测试集进行预测
y_pred model.predict(X_test)# 输出预测结果
for item in y_pred:print(item, end\n) # 每项后面都换行这样就不会合并在一起
print(预测结果:)
print(y_pred)# 输出模型准确度
accuracy accuracy_score(y_test, y_pred)
print(模型准确度:, accuracy) 完整代码
# 导入所需的库
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import pprint# 禁用输出省略
pd.set_option(display.max_rows, None)
pd.set_option(display.max_columns, None)
pd.set_option(display.width, None)
pd.set_option(display.max_colwidth, None)# 读取数据集
data pd.read_csv(universalbank.csv)# 数据预处理删除无意义特征
data data.drop(columns[ID, ZIP Code])# 划分特征和标签
X data.drop(columns[Personal Loan])
y data[Personal Loan]# 使用留出法划分数据集训练集:测试集为7:3
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state42)# 使用KNN算法对训练集进行训练最近邻的数量K设置为5
model KNeighborsClassifier(n_neighbors5)
model.fit(X_train, y_train)# 使用训练好的模型对测试集进行预测
y_pred model.predict(X_test)# 输出预测结果
for item in y_pred:print(item, end\n) # 每项后面都换行这样就不会合并在一起
print(预测结果:)
print(y_pred)# 输出模型准确度
accuracy accuracy_score(y_test, y_pred)
print(模型准确度:, accuracy)