wordpress常常被用来做什么网站,合肥seo服务商,网站怎么做qq授权登录界面,整形网站专题素材KNN (K-Nearest Neihbor,KNN)K近邻是机器学习算法中理论最简单,最好理解的算法,是一个 非常适合入门的算法,拥有如下特性:
思想极度简单,应用数学知识少(近乎为零),对于很多不擅长数学的小伙伴十分友好虽然算法简单,但效果也不错
KNN算法原理 上图是每一个点都是一个肿瘤病例…KNN (K-Nearest Neihbor,KNN)K近邻是机器学习算法中理论最简单,最好理解的算法,是一个 非常适合入门的算法,拥有如下特性:
思想极度简单,应用数学知识少(近乎为零),对于很多不擅长数学的小伙伴十分友好虽然算法简单,但效果也不错
KNN算法原理 上图是每一个点都是一个肿瘤病例
横轴表示肿瘤的大小, 纵轴表示肿瘤发现的时间红色表示肿瘤是良性, 蓝色表示肿瘤是恶性
现在新来了一个病人, 用绿色表示, 那么如何判断他是良性还是恶性 简单来说, K邻近算法就是通过K个最佳的样本来判断未知样本的类别
从上面的例子可以总结出K邻近算法的原理:
保存所有已知算法的样本点输入未知样本点选择参数K计算未知样本与所有已知样本的距离选择最近的K个样本进行投票, 未知样本归于票数最多的类别
影响KNN算法的三要素:
K值的选择距离的度量方法分类决策准则
距离度量的方法
1. 欧式距离 欧式距离 这是最常见的距离计算方法, 在中学的数学中就已经使用这种方法来计算, 不过多赘述
2.曼哈顿距离 样本中有多个特征,每一个特征都有自己的定义域和取值范围,他们对距离计算也是不同的,如取 值较大的影响力会盖过取值较小的参数。因此,为了公平,样本参数必须做一些归一化处理,将不 同的特征都缩放到相同的区间或者分布内。 归一化:
将一列数据变化到某个固定区间(范围)中通常这个区间是[0, 1]广义的讲可以是各种区间比如映射到[01]一样可以继续映射到其他范围图像中可能会映射到[0,255]其他情况可能映射到[-1,1] 在sklearn中已经有了归一化的API
from sklearn.preprocessing import MinMaxScalerdef test01():data [[20,30,90],[80,60,10],[50,45,40]]print(data)tranformer MinMaxScaler()data tranformer.fit_transform(data)print(data)if __name__ __main__:test01() 标准化
将数据变换为均值为0标准差为1的分布切记并非一定是正态的 from sklearn.preprocessing import StandardScalerdef test01():data [[20,30,90],[80,60,10],[50,45,40]]print(data)tranformer StandardScaler()data tranformer.fit_transform(data)print(data)if __name__ __main__:test01() KNN算法api 数据集的划分
1.留出法
将数据集划分为训练集和测试集, 比例一般为:0.8:0.2
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 collections import Counter
# 导入鸢尾花数据集
X,y load_iris(return_X_yTrue)# 划分训练集和测试集
X_train,X_test,y_train,y_test train_test_split(X,y,test_size0.2,random_state42,stratifyy)
print(Counter(y_train),Counter(y_test)) sklearn库提供相关的api, 可以直接使用train_test_split()来划分 参数: 数据的特征X 数据的标签y test_size: 测试集的比例 random_state: 随机数种子, 设置随机数种子可以确保每次运行划分相同, 结论可以复现 stratify: 若设置stratifyy, 确保训练集和测试集在目标变量标签上的分布相同 shuffle:参数控制数据在分割之前是否需要打乱顺序。默认值是 True这意味着在将数据划分为训练集和测试集之前会先随机打乱数据。这可以防止由于数据的原始顺序例如如果数据是按照某种规则排列的导致的偏差 返回结果:四个数据集, X_train, X_test, y_train, y_test 没设置stratify 设置stratifyy 2.交叉验证法 spliter StratifiedShuffleSplit(n_splits5,test_size0.2,random_state42)
for train,test in spliter.split(X,y):print(Counter(y[test])) 模型的评估 评估指标
sklearn库提供了许多相关的评估指标, 在这里介绍accuracy_score准确度, 传入预测y_test, y_pred即可获得准确率
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from collections import Counter
from sklearn.metrics import accuracy_score
# 导入鸢尾花数据集
X,y load_iris(return_X_yTrue)# 数据标准化
Scaler StandardScaler()
X Scaler.fit_transform(X)# 划分数据集
X_train,X_test,y_train,y_test train_test_split(X,y,test_size0.2,random_state42,stratifyy)# 训练模型
estimator KNeighborsClassifier(n_neighbors3)
estimator.fit(X_train,y_train)y_pred estimator.predict(X_test)
print(accuracy_score(y_test,y_pred)) 网格搜索最佳参数
了解KNN算法的原理后, 我们知道K值对模型训练的影响非常大, 应该如何选择K值, 才能让我们的准确率更高?
sklearn提供了网格搜索工具GridSearchCV, 可以帮助我们找到最佳参数,
param_grid 为一个字典, 包括你要搜索的参数的不同值
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 导入鸢尾花数据集
X,y load_iris(return_X_yTrue)# 数据标准化
Scaler StandardScaler()
X Scaler.fit_transform(X)# 划分数据集
X_train,X_test,y_train,y_test train_test_split(X,y,test_size0.2,random_state42,stratifyy)# 训练模型
estimator KNeighborsClassifier(n_neighbors3)
param_grid {n_neighbors:[1,3,5,7,9]
}
estimator GridSearchCV(estimator, param_gridparam_grid,cv5)
estimator.fit(X_train,y_train)
print(最佳参数:,estimator.best_estimator_, 最佳得分,estimator.best_score_)