多分类svm算法,svm和knn结合的分类器
1.简介,相关概念1,算法原理2,算法超参数3,算法步骤4,如何测量距离?5.KD树6。权重计算方法2。基于KNN协议3的分类。基于KNN的回归预测。
简介:学习KNN算法原理的超级参数调整;KNN算法应用;一.相关概念
我们先来看一个例子:
importnumpyasnpimportmatplotlib . pyplotasplt . RC params[ font . family ]= sim hei PLT . RC params[ axes . unico OMS=12 good=NP . array([95,93 ]、[ 90,92]、[91,96]) Medium=NP。)(Unknown=NP.array ([83] label=中学生)PLT.scatter (bad [:0],bad [:1],color=b ,label=劣等生)
关于橙色未知数据,可以分为哪些类型?绿色接近中学生,所以我觉得可能在80-90的范围。这也是knn算法的思想。
1.算法原理是“朱者赤附近”。当具有高相似性的样本被映射到N维空间时,它们在距离上比具有低相似性的样本更近。这是KNN算法的中心思想。
KNN(k-nearestneighborhood)或K-nearest neighborhood算法,由样本的K-nearest neighbor决定。如果需要未知样本。KNN可用于回归和分类问题。
用于分类时,以K个邻居中类别数(或权重最大的类别数)的回归作为预测结果时,以K个邻居的平均值(或加权平均值)作为预测结果。2.算法超参数是指训练模型的超参数不能像模型内部获得的参数一样在训练中获得,必须提前指定,对模型的效果影响很大。
k值:其选择过小,模型过于依赖相邻样本,灵敏度较好,但稳定性较弱,容易过拟合。K值过大,稳定性增加,但灵敏度减弱,容易欠拟合。
要获得适当的值,请使用交叉检查。也就是说,大部分样本数据、训练集和少量测试集是用来验证分类模型的正确性的。k值一般在小范围内选取,验证集中精度最高的确定为最接近的k值。
3.算法步骤1,确定算法的超参数:
确定邻居数量的k;确定距离测量模式的权重计算方法
2.对于最近的K个邻居,哪个分类最多,属于哪个分类对象。4.如何测量距离?欧氏距离:二维空间中两点之间的距离;
在两点n维空间中:
曼哈顿距离:常用于几何空间。
闵可夫斯基距离:不是一个距离,而是一系列距离的定义。p=1时为曼哈顿距离,p=2时为kwdbm距离,p变为无穷大时为yqddx距离。Sklearn默认使用这种距离计算方法。
Yqddx距离:两个坐标值之差的最大绝对值,max(x1-y1,x2-y2)。
余弦距离(实际计算的是两个向量之间的夹角,方向上计算两者之差,对数值不敏感。在兴趣关系中,角度关系比距离的绝对值更重要,所以余弦距离可以用来衡量用户对内容兴趣的分化程度。(例如,检索推荐)
5.为了减少KD树计算距离的次数,提高KNN的搜索效率,提出了KD树。KD树是以K维空间划分数据点的数据结构。在KD树的结构中,每个节点都是K维数值点的二叉树。由于是二叉树,二叉树可以添加、删除、修改,检索效率大大提高。可以直接在sklearn调用。
6.权重计算方法均匀权重:距离相同的所有样本的权重:样本权重与预测样本距离成反比。2.以KNN分类的孔径数据集为例,利用KNN算法实现分类任务。为方便起见,只取两个特征。
froms klearn . neighborsimportknighborsclassiferfromskneel . datasetsimportload _ irisfromskneel . model _ selectionionimporatorort iris=load _ iris(x=iris . data[:2]y=iris . targetx _ tra iita
=0.25,random _ state=0)KNN=KNeighborsClassifier(n _ neighbors=3,权重= uniform )KNN。fit(x火车,y火车)y帽子=KNN。predict(x _ test)print(分类_报告(y _ test,y _ hat))输出:精确召回f1-分数支持0 1.00 1.00 1.00 13 1 0.78 0.44 0.56 16 2 0.44 0.78 0.56 9准确度0.71 38宏观平均值0.74 0.74 0.71 38加权平均值0.77 0.71 0.71 38不同的超参数值,对模型的分类效果影响不同,我们通过决策边界来看一下:
来自matplotlib.colors导入ListedColormapdef plot _ decision _ boundary(model,x,y): color=[r , g , b] marker=[o , v , x ]class _ label=NP。unique(y)cmap=listed colormap(color[:len(class _ label)])x1 _ min,x2_min=np.min(x,axis=0)x1 _ max=NP。max(x,axis=0) x1=np.arange(x1_min-1使用砝码与抢人头的笛卡尔积组合,这样可以使用单层循环取代嵌套循环,增加代码可读性与可理解性:for i,(w,k)in enumerate(product(weights,ks),start=1): plt.subplot(2,2,i) plt.title(fk值:{k}权重:{ w } )KNN=KNeighborsClassifier(n _ neighbors=k,weights=w) knn.fit(x,y) plot_decision_boundary(knn,x_train,y_train)
通过决策边界可以看出,k值越小,模型敏感性越强,敏感性越弱,模型也就越复杂,容易过拟合;反之容易欠拟合。
在实际中很难通过直觉就能找到合适的超参数,这时可以通过网格交叉验证的方式找出效果最好的参数。
#网格验证寻找合适的参数从sklearn.model_selection导入GridSearchCVknn=KNeighborsClassifier()#定义需要尝试的超参数组合grid={n_neighbors:range(1,11,1), weights:[uniform , distance ]} GS=GridSearchCV(estimator=KNN,param_grid=grid,scoring=accuracy ,n_jobs=-11,cv=5,verbose=10,iid=True)gs.fit(x_train,y_train)输出:为20名候选人中的每一名拟合5次折叠,总共100次拟合略…………太多了` ` python#最好的分值打印(gs.best_score_)#最好的参数组合print(gs.best_params_)#使用最好的超参数训练好的模型打印(gs.best_estimator_)输出:0.8035714285714286 { n _ neighbors :7, weights : uniform } KNeighborsClassifier(algorithm= auto ,leaf_size=30,metric=无聊的小懒虫,metric_params=None,n_jobs=None,n_neighbors=7,p=2,weights=uniform) #使用最好的模型在测试集上进行测试,实现最后的经验估计量=GS。最佳估计量。predict(x _ test)print(分类_报告(y _ test,y _ hat))输出:精确召回f1-分数支持0 1.00 1.00 1.00 13 1 0.80 0.50 0.62 16 2 0.47 0.78 0.58 9准确度0.74 38宏观平均值0.76 0.76 0.73 38加权平均值0.79 0.74 0.74 38三、使用近邻算法回归预测使用波士顿房价数据集进行近邻算法算法回归预测,同时使用线性回归算法进行比较:
from sklearn.datasets导入load _ Boston From sk learn . neighborsregressorfrom sk learn . linear _ model导入LinearRegressionX,Y=load _ Boston(return _ X _ Y=True)X _ train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.25,Random _ state=0)KNN=kneighborsregressor(n _ neighbors=3,weights= uniform )KNN . fit(X _ train,y _ train) print()原因是KNN在训练参数时是基于距离的,而线性回归不是。也就是说,如果特征之间的维数(数量级)不同,那么较大的维数将占优势,因此算法将忽略较小的维数,最终影响模型拟合效果,但线性回归不受影响。
这不仅适用于KNN,也适用于许多算法。因此,在使用算法之前,需要将数据转换为相同的维度。我们称这个过程为数据标准化。
在sklearn中,常用的标准化方法有mean StandardScaler和MinMaxScaler。
来自sklearn。预处理导入标准scaler,minmaxscaler=[standard scaler(),minmaxscaler ()] desc=[均值标准差标准化,最小和最大标准化]for s,d in zip(scaler,desc):X _ train _ scale=s . fit _ transform(X _ train)X _ test _ scale=s . transform(X _ test)KNN=KNeighborsRegressor(n _ neighbors=3,Weights= uniform) KNN。适合(x _ train _ scale,y _ train)打印(d,KNN。SCORE (x _ test _ scale,y _ test))输出:平均值的标准偏差被归一化为0.6865,最小和最大值被归一化为0.6860161861
装配线(省略)
KD树
函数构造中的重要参数见图中第二部分。
家庭作业:
1.在iris数据集中,使用KNN和logistic回归进行比较,并绘制ROC曲线来衡量效果。
2.想想KNN是如何预测概率的?
3.调最后一个程序找最佳参数?
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。