KNN,也称K最周边(K-nearest neighbour),是一种监督学习算法,可用于分类和转头问题,是最粗浅的机器学习算法之一。K最周边瑕瑜参数的,即不合基础数据作念出任何假定,也被称为惰性算法,因为它在进修阶段不学习,而是存储数据点自慰 英文,在测试阶段进行学习,它是一种基于距离的算法。
KNN算法旨趣K最周边是一种用于转头和分类的监督学习算法。它试图通过计较测试数据与统统进修点之间的距离,选择与测试数据最接近的K个点来瞻望测试数据的正确类别。
在分类情况下,KNN算法计较测试数据属于K个进修数据类别的概率,并选择具有最高概率的类别。在转头的情况下,值是所选K个进修点的平均值。
算法经由:
设定K值计较统统进修点与新测试数据点之间的距离将距离按升序排序选择前K个距离的进修点,如果分类任务,则新测试点的类别是K个进修点最高概率的类别(出现次数最多的类);如果转头任务,则新测试点的值是K个进修点的平均值。让咱们可视化上述算法经由,如下图进修数据集有3个不同相貌的类别,咱们开动用KNN瞻望灰色点的类别。
图片
缔造K便是3,计较灰色点与统统进修数据集的距离:
图片
人体艺术摄影凭证距离升序进行排序:
图片
统计前3个距离的类别分散,有2个黄色点和1个绿色点,因此灰色点瞻望为黄色类。
图片
距离界说KNN算法需要计较新点与每个进修点之间的距离。有多种计较距离的身手,其中最常见的身手是欧几里得距离、曼哈顿距离(用于连气儿数据),以及汉明距离(用于分类数据)。假定两个点分别为,维度是k。
欧几里得距离(Euclidean Distance)便是两个点差的频频和的频频根,也常用于计较转头模子的蚀本,距离界说:曼哈顿距离(Manhattan Distance)便是两个点各维度之差的统统值频频和。距离界说:汉明距离(Hamming Distance)用于分类变量,便是两个点的维度重量值不畸形的个数。距离界说:如1001和1111的汉明距离便是2.
奈何选择K值K值是KNN算法中最热切的参数,如下图,缔造K=3,距离瞻望点(ID11)最近的点是ID1、ID5和ID6。
图片
已知ID1、ID5和ID6的信息(如下表),求ID11的体重。
ID身高年齿体重15457754.840726453660凭证KNN算法,ID11的瞻望体重:
若缔造K=5,距离ID11最近的点是ID1,ID4,ID5,ID6,ID10。
图片
ID身高年齿体重15457745.9345954.8407265.83660105.63258KD11的瞻望体重:
咱们防备到,不同的K值有不同的瞻望限度。那么奈何找出最好的K值呢?咱们凭证进修集邪恶和考证集邪恶来决定(毕竟,最小化荒唐是咱们的最终见识!)
下图分别暗意不同K值下的进修邪恶(蓝色线)和考证邪恶(红色线):
图片
图片
当k值很低(假定k=1)时,模子会对进修数据过度拟合,导致考证集上的荒唐率很高。另一方面,关于较高的k值,模子在进修集和考证集上推崇欠安。如果您仔细不雅察,您会发现考证邪恶弧线在k = 9时达到最小值。这个k值是模子的最好值(关于不同的数据集,它会有所不同)。野心东说念主员频频使用肘部弧线来详情k值,这个名字着手于它相通于手肘的体式。
转头瞻望实战到刻下为止,你一定一经对算法有了确认的挽回。如果你对此有任何疑问,我很乐意回话你的著述探求,刻下咱们在一个 Big Mart 数据集上冷静的完了KNN算法。(数据集下载流畅: https://pan.baidu.com/s/1_YC1M3Zhd1ulL73BbihNRw?pwd=qt6p 提真金不怕火码: qt6p)
1.加载数据
import pandas as pddf = pd.read_csv('train.csv')df.head()清晰前5行数据:
图片
2.缺失值补全
咱们领先统计特征项的缺失情况:
df.isnull().sum()
输出:
图片
凭证统计情况,Item_Weight特征和Outlet_Size特征有缺失值。
Item_Weight特征项的缺失值,通过平均值进行补全。
mean = df['Item_Weight'].mean() # 该特征项的平均值df['Item_Weight'].fillna(mean, inplace =True) # 缺失值补全Outlet_Size特征项的缺失值,通过众数进行补全,众数的含义是出现次数最多的值。
mode = df['Outlet_Size'].mode() # 众数df['Outlet_Size'].fillna(mode[0], inplace =True) # 补全
3.去掉不需要的特征:
df.drop(['Item_Identifier', 'Outlet_Identifier'], axis=1, inplace=True)df = pd.get_dummies(df)4.数据集分手
进修数据集和测试数据集以7:3的比例分手,并将特征项'Item_Outlet_Sales'手脚瞻望变量。
from sklearn.model_selection import train_test_splittrain , test = train_test_split(df, test_size = 0.3)x_train = train.drop('Item_Outlet_Sales', axis=1)y_train = train['Item_Outlet_Sales']x_test = test.drop('Item_Outlet_Sales', axis = 1)y_test = test['Item_Outlet_Sales']
5.特征预处置之归一化
将每个特征项的步调齐归一化再0~1的界限。
from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler(feature_range=(0, 1))x_train_scaled = scaler.fit_transform(x_train)x_train = pd.DataFrame(x_train_scaled)x_test_scaled = scaler.fit_transform(x_test)x_test = pd.DataFrame(x_test_scaled)6.计较不同K值下的蚀本函数
由于瞻望值是连气儿属性,蚀本函数接管均方根邪恶暗意。
rmse_val = [] #to store rmse values for different kfor K in range(20): K = K+1 model = neighbors.KNeighborsRegressor(n_neighbors = K) model.fit(x_train, y_train) #fit the model pred=model.predict(x_test) #make prediction on test set error = sqrt(mean_squared_error(y_test,pred)) #calculate rmse rmse_val.append(error) #store rmse values print('RMSE value for k= ' , K , 'is:', error)
输出不同K值下的蚀本值:
图片
7.画图蚀本弧线图
# 画图不同k值下的均方根蚀本curve = pd.DataFrame(rmse_val) #elbow curve curve.plot()后果图:
图片
凭证弧线可知,当咱们取 k=1 时,取得了一个止境高的 RMSE 值。跟着 k 值的增多,RMSE 值逐步减小。当 k=7 时,RMSE 约为1219.06,在进一步增多 k 值时 RMSE 值会急剧增多。咱们不错负拖累地说,在这种情况下 k=7 将给咱们最好的限度。
8.网格搜索法详情K值
为了详情最优K值,每次齐绘掣肘部弧线是一项繁琐且乏味的过程,你不错粗浅地使用网格搜索来找到最好的参数值。
from sklearn.model_selection import GridSearchCVparams = {'n_neighbors':[2,3,4,5,6,7,8,9]}knn = neighbors.KNeighborsRegressor()model = GridSearchCV(knn, params, cv=6)model.fit(x_train,y_train)model.best_params_
输出限度:
{'n_neighbors': 7}因此肘部弧线和网格搜索的最优参数一致,齐是7.
可视化KNN分类模子的决议界限为了更直不雅的挽回KNN模子后果,咱们可视化KNN分类模子的决议界限。
1. 加载包
import matplotlib.pyplot as pltimport pandas as pdfrom sklearn import datasets, neighborsfrom mlxtend.plotting import plot_decision_regions
2.画图不同K参数下的模子决议界限函数
def knn_comparison(data, k): x = data[['X','Y']].values y = data['class'].astype(int).values clf = neighbors.KNeighborsClassifier(n_neighbors=k) clf.fit(x, y) # 画图决议界限 plot_decision_regions(x, y, clf=clf, legend=2) # 增多标注 plt.xlabel('X') plt.ylabel('Y') plt.title('Knn with K='+ str(k)) plt.show()进口函数:
data1 = pd.read_csv('ushape.csv’)for i in [1,5,20,30,40,80]: knn_comparison(data1, i)
不同K下的决议界限函数:
图片
优点和症结优点:
咱们不错狂放地完了该算法。通过对 k 个最周边进行平均,它对噪声数据止境有用。在处置大数据时推崇邃密。酿成的决议界限不错是放肆体式的。症结:自慰 英文
维度横祸,且可能被无关属性主导距离。无意找到正确的 k 值可能会消耗时辰。由于其距离度量,计较本钱止境高。 本站仅提供存储就业,统统本体均由用户发布,如发现存害或侵权本体,请点击举报。- 2024-12-08羽田爱qvod 2025世俱杯分组抽签出炉 曼城尤文两强同组
- 2024-12-08拳交 twitter 好意思方复兴韩国戒严令对两国干系影响:好意思韩同盟干系不限于个别总统或政府
- 2024-12-08hongkongdoll sex 云南首个!京东健康线上线下一体化医药零卖模式落地阳宗海
- 2024-12-07羽田爱qvod 结束多项合营 华为全面牵手“数字安徽”_大皖新闻 | 安徽网
- 2024-12-07magic_sex5 世华科技(688093.SH):拟22亿元投建“高性能光学材料制造基地名堂”