1. Введение
本文让我们一起看一看基于scikit-learn如何快速的实现kNN算法。
scikit-learn内置了很多数据集,就不用我们自己编造假数据了,下面我们分别选用鸢尾花和手写数字识别的数据集。
首先导入需要的库
from sklearn import datasets # 数据集
from sklearn.neighbors import KNeighborsClassifier # knn分类算法
from sklearn.model_selection import train_test_split # 训练集和测试集划分
import numpy as np
获取鸢尾花数据集
iris = datasets.load_iris()
iris_x = iris.data # .data属性,是得到数据集的特征部分,数据格式为[[],[],[].....]
iris_y = iris.target # .target属性,是得到数据集的标签部分,数据格式为[x,x,x,x......]
使用train_test_split()函数划分训练集和测试集,这里随机种子传了666
x_train,x_test,y_train,y_test = train_test_split(iris_x,
iris_y,
test_size=0.2,
random_state = 666)
接下来初始化kNN分类器,并且进行fit操作,由于kNN算法比较简单,fit操作只是把训练数据填进去,复杂一点的fit函数里对于数据有更多的处理。
# 先用训练数据把knn分类模型构建好
knn = KNeighborsClassifier() # 类KNeighborsClassifier的初始化对象
knn.fit(x_train,y_train)
接下来便可以通过score方法查看分类的结果,也可以输出预测集进行查看
# 然后用测试数据检验分类模型的效果(及准确率)
y_predict = knn.predict(x_test)
knn.score(x_test, y_test) # 这里应该是knn.score(y_predict,y_test)
2/полный код
# 鸢尾花识别
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import numpy as np
# 鸢尾花识别
iris = datasets.load_iris()
iris_x = iris.data
iris_y = iris.target
x_train,x_test,y_train,y_test = train_test_split(iris_x,
iris_y,
test_size=0.2,
random_state=666)
knn = KNeighborsClassifier()
knn.fit(x_train, y_train)
y_predict = knn.predict(x_test)
knn.score(x_test, y_test) # 看score得分,也就是看模型的效果
# 手写体数字识别
# 同样的配方,同样的味道,接下来看看手写数字识别
# 鸢尾花数据集有150组数据,而手写数字识别有2000多组可用数据。
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import numpy as np
digits = datasets.load_digits()
digits_x = digits.data
digits_y = digits.target
x_train,x_test,y_train,y_test = train_test_split(digits_x,
digits_y,
test_size=0.2,
random_state=666)
knn = KNeighborsClassifier()
knn.fit(x_train, y_train)
y_predict = knn.predict(x_test)
knn.score(x_test, y_test)
3/регулировка параметров
参数有2种,分别是超参数和模型参数。
超参数:是指在运行机器学习算法之前需要指定的参数。
可以使用循环搜索的方法来选择出最好的超参数。
knn没有模型参数。
所以这里我们只需要调整超参数即可。
k近邻(kNN)的超参数一个是k值的选择,另一个是距离的权重。
我们将距离的倒数作为距离的权重,在sklearn中k近邻算法有一个weights参数,其默认值为uniform,此时是不考虑距离权重的,当weights=distance时,sklearn就会考虑距离的权重
Попробуйте найти лучшее k
# 通过遍历的方式,得到score最高的k值
best_score = 0.0
best_k = -1
for k in range(1,11) :
knn_clf = KNeighborsClassifier(n_neighbors=k)
knn_clf.fit(X_train, y_train)
score = knn_clf.score(x_test, y_test)
if score > best_score:
best_k = k
best_score = score
# 得到score最高的k值
print("best_k = " + str(best_k))
print("best_score = " + str(best_score))
Попробуйте найти лучший k по форме и расстоянию
best_method = ""
best_score = 0.0
best_k = -1
for method in ["uniform", "distance"] :
for k in range(1, 11) :
knn_clf = KNeighborsClassifier(n_neighbors=k, weights=method)
knn_clf.fit(X_train, y_train)
score = knn_clf.score(x_test, y_test)
if score > best_score:
best_k = k
best_score = score
best_method = method
print("best_k = " + str(best_k))
print("best_score = " + str(best_score))
print("best_method = " + best_method)