- 构建此模型只需要保存训练集即可。
要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近的k个数据点,然后将找到的数据点的标签(投票法)赋值给这个新数据点。
k近邻分类
- k近邻分类算法是在neighbors模块的KNeighborsClassifier类中实现的。我们需要将这个类实例化为一个对象,然后才能使用这个模型。
k近邻回归
- 用于回归的k近邻算法是在scikit-learn的KNeighborsRegressor类中实现的。
- 对于回归问题,clf.score()方法返回的是R^2系数,也叫做决定系数,是回归模型预测的优度度量,位于0-1之间。决定系数等于1对应完美预测,等于0对应常数模型,即总是预测训练集响应(y_train)的平均值。
总结
- KNeighbors有2个重要参数:
① 邻居个数:在实践中,3-5个邻居个数往往可以得到较好的结果
②数据点之间距离的度量方法:默认使用欧氏距离
-
如何设置超参数:
① train-test-valid
② 交叉验证:Split data into folds , try each fold as validation and average the results
-
优点:容易理解、构建速度快
-
缺点:如果训练集很大,预测速度会比较慢;对于有很多特征(几百或更多)的数据集往往表现不好,对于大多数特征的大多数取值为0的数据集(稀疏数据集)来说效果尤其不好。
实例
完整代码:k近邻分类算法
代码框架:认识数据->划分数据->构建模型->保存训练集->计算距离->预测标签->调整最优参数k(交叉验证)
#交叉验证(选择最优参数k)
for k in k_choices:
curr_acc=[]
for i in np.arange(num_folds):
indx = np.array([j for j in range(num_folds) if j!=i])
X_test_n=X_train_folds[i]
y_test_n=y_train_folds[i]
X_train_folds[indx]
X_train_n=np.concatenate(X_train_folds[indx],axis=0)
y_train_n=np.concatenate(y_train_folds[indx],axis=None)
classifier = KNearestNeighbor()
classifier.train(X_train_n, y_train_n)
dists = classifier.compute_distances_no_loops(X_test_n)#计算数据点之间的距离
y_test_n_pred = classifier.predict_labels(dists, k)#根据距离预测
num_correct = np.sum(y_test_n_pred == y_test_n)
accuracy = float(num_correct) / len(y_test_n)
curr_acc.append(accuracy)
k_to_accuracies[k]=curr_acc