实验过程
1、了解K-近邻算法的相关概念及含义;
K-近邻算法(K-Nearest Neighbor,简称KNN算法)是一种基本的分类与回归方法。其基本思想是通过测量不同特征值之间的距离来进行分类,即在特征空间中,将距离较近的样本归为一类。具体来说,KNN算法的步骤如下:
1.计算测试样本与训练集中每个样本的距离,可以采用欧氏距离、曼哈顿距离等。
2.根据距离的大小,选取距离测试样本最近的K个样本作为候选样本。
3.对K个候选样本进行分类,可以采用投票法、加权投票法等。
2、掌握K-近邻算法求解问题的流程;
收集数据:可以通过各种手段收集数据,例如爬取网站数据、采集传感器数据等。
准备数据:将收集到的数据进行处理和预处理,包括数据清洗、特征选择、特征变换等。
分析数据:对数据进行可视化和分析,了解数据的特点和分布情况,以便选择合适的K值和距离度量方法。
训练算法:将数据集分为训练集和测试集,使用训练集对KNN模型进行训练,得到模型参数。
测试算法:使用测试集对训练好的KNN模型进行测试,并计算分类的准确率、精度等指标。
使用算法:使用训练好的KNN模型对新数据进行分类,得到预测结果。
3、能够编写出K-近邻算法求解某一问题的代码;
设计实验方案,进行仿真和预测(主要包含:导包、导入数据集、特征和标签的提取、训练集和测试集的划分、特征处理(根据实际情况可选)、K-近邻算法对象的创建、在训练集上进行学习、在测试集上进行预测)。
实验详细操作步骤
from sklearn.datasets import load_iris #加载数据Iris数据集是常用的分类实验数据集,Iris也称鸢尾花卉数据集是一类多重变量分析的数据集 # 1、获取鸢尾花数据集 iris=load_iris() ## 特征矩阵 X=iris.data # 标签向量 y=iris.target print(X[:5]) print(y[:5]) from sklearn.model_selection import train_test_split,GridSearchCV #划分数据集 # X=[[1,3],[2,4],[3,6],[4,6],[5,8],[6,8]] # y=[1,1,1,0,0,0] # 对鸢尾花数据集进行分割 # 训练集的特征值X_train 测试集的特征值X_test 训练集的目标值y_train 测试集的目标值y_test X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=2,shuffle=False) #,random_state=2,shuffle=False 不加,测试集更好 print("训练集特征值:\n", X_train) print("测试集目标值:\n", y_train) print("测试集特征值:\n", X_test) print("训练集目标值:\n", y_test) print("x_train:\n", X_train.shape) #查看形状 from sklearn.preprocessing import StandardScaler #数据训练 sc=StandardScaler() sc.fit(X_train) # print(sc.mean_) # print(sc.var_) X_train=sc.transform(X_train) X_test=sc.transform(X_test) from sklearn.neighbors import KNeighborsClassifier #数据预测 from sklearn.pipeline import Pipeline # 创建一个KNN分类器,并指定k值为5 默认为5 knn=KNeighborsClassifier() # 使用训练数据来拟合模型 knn.fit(X_train,y_train) # 对测试数据进行预测,并计算模型的准确率 y_pred = knn.predict(X_test) accuracy = knn.score(X_test, y_test) print("预测结果:", y_pred) print("模型准确率:", accuracy) # print(y_pred==y_test) # print((y_pred==y_test).mean()) # 代替 print(knn.score(X_test,y_test)) # 创建一个KNN分类器,并使用管道将标准化和KNN算法组合在一起 pipeline = Pipeline([ ('scaler', StandardScaler()), ('classifier', KNeighborsClassifier()) ]) # 定义超参数网格搜索范围 param_grid = { 'classifier__n_neighbors': [1, 3, 5, 7], } # 使用交叉验证来评估模型性能并进行超参数调优 grid_search = GridSearchCV(pipeline, param_grid=param_grid, cv=5) grid_search.fit(X_train, y_train) # 输出最佳模型的超参数和准确率 print("最佳超参数:", grid_search.best_params_) print("模型准确率:", grid_search.score(X_test, y_test)) import numpy as np #投入使用 X_new=np.array([[0.6,1.2,1.1,2.5]]) y_new=knn.predict(X_new) print(y_new) print(iris['target_names'][y_new]) print(iris['target_names'])
疑难小结
K-近邻算法是一种简单而有效的机器学习算法,可以用于分类和回归问题。在Python中实现K-近邻算法需要使用scikit-learn库。
在实验中,我遇到了以下几个问题和心得体会:
1. 数据预处理:KNN算法对数据的质量要求很高,因此需要进行数据清洗、缺失值填充等预处理操作。同时还需要将特征进行标准化或归一化,以便更好地计算距离。
2. K值选择:K值的选择对模型性能有重要影响。如果选取太小,则可能导致过拟合;如果选取太大,则可能导致欠拟合。因此需要通过交叉验证等方法选择最优的K值。
3. 距离度量:KNN算法中距离度量是非常重要的一部分,不同的距离度量方式会对模型性能产生影响。在实验中我尝试了欧氏距离、曼哈顿距离和闵可夫斯基距离等多种方式,并通过交叉验证选取最优方案。
4. 算法效率:由于KNN算法需要计算每个测试样本到所有训练样本之间的距离,因此随着数据集规模增大,算法效率会变得很低。为了解决这个问题,可以使用kd-tree等数据结构来加速KNN算法。在实验中我尝试了使用kd-tree对算法进行优化,并发现效果非常显著。
5. 模型评估:在实验中需要选择合适的指标来评估模型性能,如准确率、召回率、F1值等。同时还需要进行交叉验证和网格搜索等操作,以便确定最佳参数组合并防止过拟合。
总之,在实现KNN算法时需要注意数据预处理、参数选择、距离度量方式、算法效率和模型评估等方面的问题,并根据具体情况进行调整和优化。
此外,还有一些其他的注意事项:
6. 数据集划分:在实验中需要将数据集划分为训练集和测试集。通常情况下,可以使用随机抽样或者交叉验证等方法进行划分。同时还需要注意避免过度拟合。