邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。判断邻居就是用向量距离大小来刻画。
算法流程
缺点
import numpy as np import matplotlib.pyplot as plt #绘图import pandas as pd
再导入数据集
以excel格式为例,我的iris目标文件存储在
"D://test_knn"中
url = "D://test_knn./iris.csv" #url path# Assign column names to the datasetnames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']# Read dataset to pandas dataframedataset = pd.read_csv(url, names=names)
可以用下面函数检验导入是否成功
dataset.head() #默认读取前五行
输出结果如下: sepal-length sepal-width petal-length petal-width Class0 5.1 3.5 1.4 0.2 Iris-setosa1 4.9 3.0 1.4 0.2 Iris-setosa2 4.7 3.2 1.3 0.2 Iris-setosa3 4.6 3.1 1.5 0.2 Iris-setosa4 5.0 3.6 1.4 0.2 Iris-setosa
2.Preprocessing the dataset 数据预处理
x= dataset.iloc[:, :-1].values #x 属性 #第一个冒号是所有列,第二个是所有行,除了最后一个(Purchased) y = dataset.iloc[:, 4].values #y 标签 # 只取最后一个作为依赖变量。
3.Train Test Split
把数据划分成训练集和测试集
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)
80%的数据划分到训练集,20%的数据划分到测试集
4.Feature scaling
from sklearn.preprocessing import StandardScaler #导入库 这个不知道可以去查查用法scaler = StandardScaler() scaler.fit(X_train)X_train = scaler.transform(X_train) X_test = scaler.transform(X_test)
5.Training and Predictions 训练预测
from sklearn.neighbors import KNeighborsClassifier classifier = KNeighborsClassifier(n_neighbors=5) # k=5classifier.fit(X_train, y_train) y_pred=classifier.predict(X_test)
6.Evaluating the algorithm
from sklearn.metrics import classification_report, confusion_matrix print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))
预期输出结果如下:
The output of the above script looks like this:[[11 0 0] 0 13 0] 0 1 6]] precision recall f1-score support Iris-setosa 1.00 1.00 1.00 11Iris-versicolor 1.00 1.00 1.00 13 Iris-virginica 1.00 1.00 1.00 6 avg/total 1.00 1.00 1.00 30
7.Comparing Error Rate with the K Value
把各种可能的k的取值,及其对应的分类误差率(error rate)绘制在一张图上。
error = []# Calculating error for K values between 1 and 40for i in range(1, 40): knn = KNeighborsClassifier(n_neighbors=i) knn.fit(X_train, y_train) pred_i = knn.predict(X_test) error.append(np.mean(pred_i != y_test))
plt.figure(figsize=(12, 6)) plt.plot(range(1, 40), error, color='red', linestyle='dashed', marker='o', markerfacecolor='blue', markersize=10)plt.title('Error Rate K Value') plt.xlabel('K Value') plt.ylabel('Mean Error')
输出结果预期如下:
至此, 这套knn算法就实现了,现在体会到python工具包的强大了,好多底层的算法都不需要自己写函数实现。
搜了一下用C实现knn,代码很繁琐,但是很直观,每一步干什么很清楚。python写的话呢,如果对这些库不熟悉,那就很头秃了,需要一个一个函数查它的用法,不过,如果真的掌握了可以更快更轻松地实现。就是这样子了!
刚开始做的时候看到一堆代码,一脸懵逼,感觉在看文言文一样。其实只要耐心看,真的只是了解一点库函数用法,算法本身思想很简单!
第一个机器学习算法笔记,开心!