KNN算法用做分类问题的总结

总结:

  1. 数据集:原始数据(不一定为SVM结构)
  2. 样本集:SVM结构,并且是数值处理过的二维表格。
  3. 样本拆分目的:评价模型的好坏,一般测试集:训练集=2:8或3:7或6.666:3.333。训练集比测试集多。
  4. 拆分原则:训练集和测试集不能叠加 训练集:训练算法 测试集:验证模型的预测效果 。
  5. 样本标签:研究的数据目标(target、class、label)
  6. 机器学习的种类划分:按照是否有标签分为有监督学习,无监督学习,半监督学习。
  7. 分类模型:标签类型是离散的,如:性别预测
  8. 回归模型:标签类型是连续的,如:房价预测
  9. KNN原理:根据预测样本点附近的K个点的情况来给出预测结果。
  10. 特征空间:由样本集数据特征展开的空间,所有的样本数据都属于这个空间。
  11. 主要解决的是:如何查找带预测样本附近的点. 欧氏距离(Euclidean distance):dis(X,Y)=np.sqrt((Xi-Yi)**2.sum()) 。二维平面上点a(x1,y1)与b(x2,y2)间的欧氏距离类似勾股定理。通过欧氏距离找到距离待预测样本点最近的K个点,由这K个点的情况给出预测结果。
  12. KNN的优缺点:KNN是一个惰性学习法,学习过程可以忽略,只是简单存储数据,KNN会把时间消耗在预测阶段,学习过程很快,对异常数据不敏感,所以往往给出一些更高的准确率,可以用作base model来作为一个模型调优的底线。KNN既支持分类也支持回归。(做训练的时候只做存储,现用现查。)

模型评价的方法:准去率
准确率:预测正确的个数/预测数据的总数
评价模型不仅要看测试集评分,也要看训练集评分。
原则:测试集评分越高越好,训练集评分与测试集越接近越好。
测试集评分:model.score(X_test,y_test)
训练集评分:model.score(X_train,y_train)

模型调优的几个实现路径

  1. 样本集的拆分策略:保证模型评价的公平。【注意】:不能只拆一次,应该尽量保证样本集的分布是均衡的,保证拆分的顺序是一致的。
  2. 超参调整:在一组可选的参数内,选择最合适的参数,通过评价策略去衡量最优参数。
  3. 特征工程:让样本集具备更低的学习难度。(包含数据清洗)

机器学习原理包含:

  1. 损失函数(Loss Function):用来描述y`与y之间的差别的函数。
  2. 代价函数(Cost Function):损失函数针对一个训练数据,对于所有的训练数据,用代价函数描述整体的损失。
  3. 目标函数:由于代价函数表示的是整个模型付出的代价,所以代价越小越好,因此产生了一个学习目标,就是找到目标函数。
  4. 优化算法:使得J(θ)达到最小。

补充:做分类边界的绘制
目的:展示模型预测能力的一种方式,实验常用的方式,一般不会作为线上产品展示。
重点在meshgrid()函数的使用

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier

iris=load_iris()
data=iris.data
target=iris.target

#原始数据的分布是一个四维特征,提取其中的前两维特征,绘制平面图像
colors=sns.color_palette('husl')
from matplotlib.colors import ListedColormap
#提取前三种颜色
cmap=ListedColormap(colors[:3])
#cmap做颜色映射
plt.scatter(data[:,0],data[:,1],c=target,cmap=cmap)
plt.show()

#构造两个模型
knn1=KNeighborsClassifier(n_neighbors=1)
knn2=KNeighborsClassifier(n_neighbors=7)
#不调优,所以不做拆分
X=data[:,:2]
y=target
knn1.fit(X,y)
knn2.fit(X,y)

#找画布中的所有点,x,y轴的边界即最大最小值
xmin,xmax=X[:,0].min(),X[:,0].max()
ymin,ymax=X[:,1].min(),X[:,1].max()

#做等差数列划分,切割密度为100。
x=np.linspace(xmin,xmax,100)
y=np.linspace(ymin,ymax,100)

#对x,y做网格交叉,网格切割,得到两个二维数组
xx,yy=np.meshgrid(x,y)
#结果示例x=[1,2,3],变为xx=array{[[1,2,3],[1,2,3],[1,2,3]]}
#y=[4,5,6],yy=array{[[4,5,6],[4,5,6],[4,5,6]]}

#做扁平化处理,二维降为一维
xx.ravel()
#结果示例:array{[1,2,3,1,2,3,1,2,3]}
yy.ravel()

#np.c_[]是级连,变为二维数组。
X_test=np.c_[xx.ravel(),yy.ravel()]
#结果示例:array{[[1,4],[2,5],[3,6],[1,4],···,[3,6]]}
y1_ = knn1.predict(X_test)
y2_ = knn2.predict(X_test)
plt.scatter(X_test[:,0],X_test[:,1],c=y1_)
plt.scatter(data[:,0],data[:,1],c=target,cmap=cmap)
plt.show()

plt.scatter(X_test[:,0],X_test[:,1],c=y2_)
plt.scatter(data[:,0],data[:,1],c=target,cmap=cmap)
plt.show()

#结论:第二个模型具备更强的范化能力,第二个模型比第一个更好

图1:
图1

图2:
K=1

图3:
K=7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值