微信公众号:龙跃十二
我是小玉,一个平平无奇的小天才。
最近在研究机器学习的一些算法,说到这里,最先少不了的就是监督学习里的一些分类算法,比如:朴素贝叶斯(naive_bayes)、KNN、决策树、随机森林、SVM。我也把最近学的这些算法用来练练手,做一个数据集的分类,以下代码仅供参考奥!
今天先来讲讲利用KNN算法来做一个wine数据集的分类,后边还会持续更新每一个算法哦,多多关注我的博客,也欢迎大家关注小玉和龙叔的微信公众号【龙跃十二】,更多干货持续更新,只为和你一起学习,共同进步。
什么是KNN算法,你可别被这几个简单的字母吓到了,KNN其实是指K-Nearest Neighbor,字面意思就是最近的邻居,它是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。我们来看一张图:
从图中我们可以看出,要想知道蓝衣男孩的位置,我们需要计算跟他临近的四个邻居之间的距离,这样一来,我们就可以间接确定蓝衣男孩的具体位置。
关于KNN算法,总结起来就一句话:根据你的邻居来判断你的类型。
就上边这一句话很好的阐述了KNN算法的精华,你仔细品品。
我们平时主要用到三种距离公式:
这三种距离的计算我就不多说了,都是一些简单的数学问题,不明白的小伙伴baidu一下去!
1、K的取值:
k取值过大,更易受样本不均衡的影响。
k取值过小,更容易受异常点的影响。
为了解决这个问题,我们往往在运用该算法解决实际问题的时候,会使机器进行自动选择最优的K值,一会在后边的实例中给大家详解哦
2、优点与缺点:
优点:简单,算法核心易于理解,且在使用过程中不用训练模型。
缺点:K的取值非常麻烦
KNN算法属于一种懒惰算法,当测试样本过大时,该算法所占用的内存开销过大,时间复杂度也很高。
——基于KNN算法对鸢尾花iris数据集进行分类
数据集来源:可以在uci或者kaggle上下载,也可以直接在sklearn中直接调取。以下使用的是在sklearn中直接load
鸢尾花灰Iris数据集中有150个样本,每个样本有4个特征,1个标签。其中,鸢尾花种类可取0、1、2,分别代表山鸢尾setosa、变色鸢尾versicolor、维吉尼亚鸢尾virginica。
# 导入数据
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
def knn_iris_gscv():
#添加网格搜索和交叉验证
iris = load_iris()
# 数据集打乱划分为训练集和测试机
X_train, X_test, y_train, y_test = train_test_split(iris['data'],
iris['target'],
test_size=0.25,
random_state=14)
# 标准化处理:
transfer = StandardScaler()
X_train = transfer.fit_transform(X_train)
X_test = transfer.transform(X_test)
estimator = KNeighborsClassifier()
#加入网格搜索和交叉验证:
estimator = GridSearchCV(estimator = estimator,param_grid={'n_neighbors':[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]},cv= 10)
estimator.fit(X_train, y_train)
# <1>直接对比真实值与预测值
y_pred = estimator.predict(X_test) # 1 X 20 向量
print("预测值为:\n {}", y_pred)
print("真实值和预测值", y_test == y_pred)
# <2>计算准确率:
score = estimator.score(X_test, y_test)
print("准确率为:\n", score)
# <3>查看最佳结果:
print("最佳参数:\n",estimator.best_params_)
print("最佳结果:\n", estimator.best_score_)
print("最佳估计器:\n", estimator.best_estimator_)
print("交叉验证结果:\n", estimator.cv_results_)
return None
if __name__ == "__main__":
knn_iris_gscv()
在上边,我们通过添加网格搜索和交叉验证,来达到一个使K值不断循环,最后取最优K值的目的,这样做的目的也可以进一步的提升识别率。
我们使用了sklearn 中的很多封装好的函数,其具备的功能都非常全面,在这里,我建议大家可以多看看sklearn的一下函数和包,会有利于后边的编程速度。
关于上边的内容,大家有什么问题可以随时给我留言哦。也可以关注小玉和龙叔的微信公众号【龙跃十二】,添加小玉微信,和小玉一起学习。
我是小玉,一个平平无奇的小天才。