机器学习笔记(1)-K近邻
K近邻算法
什么是k近邻算法
(k近邻算法又叫做knn算法):大概意思就是根据你的邻居来判断的的类别。
如果一个样本在特征空间中的k个最相似(即特征空间中最近邻)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
这里面相似性的度量可以根据欧式距离来计算。欧式距离也就是高中学的两点之间的距离。
算法流程:
1.计算已知类别数据集中的点与当前点之间的距离
2.按距离递增次序排序
3.选取与当前点距离最小的k个点
4.统计前k个点所在的类别出现的频率
5.返回前k个点出现频率最高的类别作为当前点的预测分类
总结:
k近邻算法就是计算未知点和已知点之间的距离,距离通过欧式距离来计算,然后找相近的来判断自己属于类别的概率。
scikit-learn
scikit-learn包含的内容:
分类、聚类、回归
特征工程
模型选择、调优
K近邻算法API
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
案例
机器学习算法步骤
1)获取数据集
2)数据预处理
3)特征工程
4)机器学习
5)模型评估
k值的选择
k值过小:容易受到异常值的影响
k值过大:受到样本均衡的影响(每个类别的数据多少不一样)
k值的减小模型整体变得复杂,容易过拟合
k值增大则模型整体变得简单,使得预测错误。
实际应用中一般取较小的k值
近似误差:关注训练集,容易过拟合
估计误差:关注测试集,模型本身接近最佳模型
鸢尾花数据集种类预测
获取数据集
from sklearn.datasets import load_iris
iris=load_iris()
特征预处理
特征的单位或者大小相差较大的话,容易影响目标结果。
主要包含归一化和标准化
归一化:将原始数据进行变化映射到[0,1]之间。(通过最大值最小值让数据变化)
最大最小值容易受到异常点的影响,鲁棒性较差,只适合传统精确小数据场景。
from sklearn.preprocessing import MinMaxScaler
ma=MinMaxScaler()
data=ma.fit_transform(data)
标准化:通过对原始数据进行变化把原始数据变化到均值为0,标准差为1的范围内。
from sklearn.preprocessing import StandardScaler
标准化:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景
鸢尾花数据集案例实现
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
#1.获取数据集
iris=load_iris()
#2.数据基本处理,也就是将原始数据划分训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris,target,test_size=0.2,random_state=22)
#3.特征工程
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
#4,机器学习(模型训练)
estimator=KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train,y_train)
#5,模型评估
y_predict=estimator.predict(x_test)
#计算准确率
score=estimator.score(x_test,y_test)
交叉验证
交叉验证:将拿到的训练数据,分为训练集和验证集(将书分为4份,其中一份作为验证集。然后经过四组测试,每次更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证)
交叉验证的目的:为了让被评估的模型更加准确可信。
网格搜索
:通过交叉验证评估模型的一些参数。
from sklearn.model_selection import GridSearchCV
estimator=KNeighborsClassifier()
#准备要调的超参数
param_dict={'n_neighbors':[1,3,5]}
estimator=GridSearchCV(estimator,param_grid=param_dict,cv=3)
estimator.fit(x_train,x_test)
#在交叉验证中最好的结果
estimator.best_score_
#最好的参数模型
estimator.best_estimator_
#每次验证后的准确率结果
estimator.cv_results_