荆门做微信公众号的网站,做网站赚钱但又不想开公司,网页设计网站作业,开源程序做网站任务KNN工作原理 “近朱者赤#xff0c;近墨者黑”可以说是KNN的工作原理。整个计算过程分为三步#xff1a;1:计算待分类物体与其他物体之间的距离#xff1b;2:统计距离最近的K个邻居#xff1b;3:对于K个最近的邻居#xff0c;它们属于哪个分类最多#xff0c;待分类物体就…KNN工作原理 “近朱者赤近墨者黑”可以说是KNN的工作原理。整个计算过程分为三步1:计算待分类物体与其他物体之间的距离2:统计距离最近的K个邻居3:对于K个最近的邻居它们属于哪个分类最多待分类物体就属于哪一类。K-最近邻算法K-Nearest Neighbor, KNN中的K值是一个重要的超参数不同的K值会影响模型的性能。常见的选择K值的方法包括以下几种
网格搜索Grid Search指定一组候选的K值对每个K值进行交叉验证选取平均交叉验证误差最小的K值作为最佳K值。缺点是需要进行大量的计算时间开销较大。K折交叉验证K-fold Cross Validation将训练集分成K个子集每次使用其中K-1个子集作为训练集剩下的1个子集作为验证集重复K次。对于每个K值计算K次的平均交叉验证误差选取平均交叉验证误差最小的K值作为最佳K值。这种方法的优点是可以减少模型的方差但是计算时间仍然比较长。自助法Bootstrap从训练集中有放回地随机抽取样本构建新的训练集。对于每个K值计算自助样本的平均误差选取平均误差最小的K值作为最佳K值。这种方法的优点是计算速度快但是对于小数据集来说可能会出现较大的方差。
网格搜索(Grid Search)
接下来先看看如何通过网格搜索(Grid Search)获取K值。GridSearchCV是Scikit-Learn库中用于网格搜索的函数其主要作用是在指定的超参数范围内进行穷举搜索并使用交叉验证来评估每种超参数组合的性能以找到最优的超参数组合。该函数包含多个参数具体参数以及每个参数含义如下所示
estimator通常是一个Scikit-Learn模型对象例如KNeighborsClassifier()、RandomForestClassifier()等用于表示要使用的模型。param_grid需要遍历的超参数空间是一个字典其中每个键是一个超参数名称对应的值是超参数的取值列表。例如对于KNN模型可以指定param_grid {n_neighbors: [3, 5, 7, 9], weights: [uniform, distance], p: [1, 2]}表示K值在3, 5, 7和9中选择权重方式为uniform和distance距离度量方式为曼哈顿距离和欧几里得距离。当然除了这两种距离计算方式还可以选择闵可夫斯基距离切比雪夫距离余弦距离。
scoring评价指标用于评估模型性能的指标通常是一个字符串或可调用的函数例如accuracy、f1、precision、recall等。如果需要评估多个指标则可以将评价指标指定为列表或元组。cv交叉验证的折数通常为整数或KFold对象。例如cv 5表示将数据集分成5个折其中4个用于训练1个用于验证。n_jobs并行处理的数量通常为整数指定在训练期间使用的CPU数量。如果设置为-1则使用所有可用的CPU。verbose输出详细程度通常为整数。0表示不输出任何消息1表示输出少量消息大于1表示输出更多消息。return_train_score是否返回每个超参数组合在训练集上的性能指标。默认情况下它为False表示只返回每个超参数组合在验证集上的性
下面是使用GridSearchCV执行分类任务的demo代码,运行demo代码会显示执行的交叉参数组合且给出最优的参数组合值。
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
# 加载数据集
iris load_iris()
X, y iris.data, iris.target
# 划分数据集
X_train, X_test, y_train, y_test train_test_split(X,y,test_size0.3,random_state42)
# 定义待调优的超参数及其取值范围
param_grid {n_neighbors: [3, 5, 7, 9],weights: [uniform, distance],p: [1, 2]
}
# 构建KNN模型
knn KNeighborsClassifier()
# 使用网格搜索进行超参数调优
grid_search GridSearchCV(knn, param_grid, cv5, verbose2)
grid_search.fit(X_train, y_train)
# 输出最优超参数组合及其在验证集上的性能指标
print(Best parameters: , grid_search.best_params_)
print(Best score: , grid_search.best_score_)
# 在测试集上进行评估
score grid_search.score(X_test, y_test)
print(Test score: , score)
K折交叉验证K-fold Cross Validation
KFold函数是Scikit-Learn库中用于生成K折交叉验证分割的函数。该函数的主要参数及含义如下
n_splits交叉验证折数默认值为5。shuffle是否对样本进行随机排序默认值为False。random_state随机种子数默认为None即随机种子为当前时间戳。indices指定分割的索引数组可以用于固定分割以进行可重复的交叉验证。
下面是使用KFold函数采用交叉验证进行模型评估的demo代码。
from sklearn.datasets import load_iris
from sklearn.model_selection import KFold, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
# 加载数据集
iris load_iris()
X iris.data
y iris.target
# 定义模型和超参数
knn KNeighborsClassifier(n_neighbors5, weightsuniform, p2)
# 定义交叉验证的折数
kfold KFold(n_splits10, shuffleTrue, random_state42)
# 使用交叉验证进行模型评估
scores cross_val_score(knn, X, y, cvkfold)
# 输出平均分数和标准差
print(Accuracy: %0.2f (/- %0.2f) % (scores.mean(), scores.std() * 2))
各类算法准确率对比
前面介绍了KNN算法、SVM 算法、多项式朴素贝叶斯算法等下面的demo例子使用手写数字作为训练数据观察每种算法的精确度具体code如下所示。其中sklearn.datasets是Scikit-Learn库中用于加载各种标准数据集的模块之一。load_digits函数可以加载一个手写数字数据集该数据集包含1797个8x8像素的手写数字图像。每个图像都有相应的标签表示图像中的数字。该数据集可以用于分类和降维等任务。
# 手写数字分类
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_digits
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt# 加载数据
digits load_digits()
data digits.data
# 数据探索
print(data.shape)
# 查看第一幅图像
print(digits.images[0])
# 第一幅图像代表的数字含义
print(digits.target[0])
# 将第一幅图像显示出来
plt.gray()
plt.imshow(digits.images[0])
plt.show()# 分割数据将25%的数据作为测试集其余作为训练集
train_x, test_x, train_y, test_y train_test_split(data,digits.target,test_size0.25,random_state33)# 采用Z-Score规范化
ss preprocessing.StandardScaler()
train_ss_x ss.fit_transform(train_x)
test_ss_x ss.transform(test_x)# 创建KNN分类器
knn KNeighborsClassifier()
knn.fit(train_ss_x, train_y)
predict_y knn.predict(test_ss_x)
print(KNN准确率: %.4lf % accuracy_score(test_y, predict_y))# 创建SVM分类器
svm SVC()
svm.fit(train_ss_x, train_y)
predict_y svm.predict(test_ss_x)
print(SVM准确率: %0.4lf % accuracy_score(test_y, predict_y))# 采用Min-Max规范化
mm preprocessing.MinMaxScaler()
train_mm_x mm.fit_transform(train_x)
test_mm_x mm.transform(test_x)# 创建Naive Bayes分类器
mnb MultinomialNB()
mnb.fit(train_mm_x, train_y)
predict_y mnb.predict(test_mm_x)
print(多项式朴素贝叶斯准确率: %.4lf % accuracy_score(test_y, predict_y))# 创建CART决策树分类器
dtc DecisionTreeClassifier()
dtc.fit(train_mm_x, train_y)
predict_y dtc.predict(test_mm_x)
print(CART决策树准确率: %.4lf % accuracy_score(test_y, predict_y))
实验结果如下图所示可以看到KNN和SVM准确率比较接近多项式朴素贝叶斯和CART决策树准确率稍低。