4.sklearn-K近邻算法、模型选择与调优

文章目录

  • 环境配置(必看)
  • 头文件引用
    • 1.sklearn转换器和估计器
        • [1.1 转换器 - 特征工程的父类](#1.1 转换器 - 特征工程的父类)
        • [1.2 估计器(sklearn机器学习算法的实现)](#1.2 估计器(sklearn机器学习算法的实现))
    • 2.K-近邻算法
      • [2.1 简介:](#2.1 简介:)
      • [2.2 K-近邻算法API](#2.2 K-近邻算法API)
      • [2.3 K-近邻算法代码](#2.3 K-近邻算法代码)
      • [2.4 运行结果](#2.4 运行结果)
      • [2.5 K-近邻算法优缺点](#2.5 K-近邻算法优缺点)
    • 3.模型选择与调优
      • [3.1 交叉验证(cross validation)](#3.1 交叉验证(cross validation))
      • [3.2 网格搜索(Grid Search)](#3.2 网格搜索(Grid Search))
      • [3.3 交叉验证,网格搜索(模型选择与调优)API:](#3.3 交叉验证,网格搜索(模型选择与调优)API:)
      • [3.4 代码](#3.4 代码)
      • [3.5 运行结果](#3.5 运行结果)
  • 本章学习资源

环境配置(必看)

Anaconda-创建虚拟环境的手把手教程相关环境配置看此篇文章,本专栏深度学习相关的版本和配置,均按照此篇文章进行安装。

头文件引用

python 复制代码
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

1.sklearn转换器和估计器

1.1 转换器 - 特征工程的父类
c 复制代码
1 实例化 (实例化的是一个转换器类(Transformer))
2 调用fit_transform(对于文档建立分类词频矩阵,不能同时调用)
  标准化:
  		(x - mean) / std	(特征 - 均值)/ 标准差
  		fit_transform()
  		fit()           	计算 每一列的平均值、标准差
  		transform()     	(x - mean) / std进行最终的转换
1.2 估计器(sklearn机器学习算法的实现)
c 复制代码
1 实例化一个estimator
2 estimator.fit(x_train, y_train) 计算
  ------ 调用完毕,模型生成
3 模型评估:
	1)直接比对真实值和预测值
   		y_predict = estimator.predict(x_test)
        y_test == y_predict
    2)计算准确率
        accuracy = estimator.score(x_test, y_test)

2.K-近邻算法

2.1 简介:

c 复制代码
KNN核心思想:
   你的"邻居"来推断出你的类别
    1 K-近邻算法(KNN)原理
      k = 1
      容易受到异常点的影响
   如何确定谁是邻居?
       计算距离:
        	距离公式
        	欧氏距离  --  算法默认的是使用欧式距离
        	曼哈顿距离 绝对值距离
        	明可夫斯基距离

	如果取的k值不一样?会是什么结果?
        k 值取得过小,容易受到异常点的影响
        k 值取得过大,样本不均衡的影响

2.2 K-近邻算法API

python 复制代码
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

API注释:

python 复制代码
n_neighbors:
	int,可选(默认= 5),k_neighbors查询默认使用的邻居数
algorithm:{'auto','ball_tree','kd_tree','brute'}
	快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。除此之外,用户也可以自己指定搜索算法ball_tree、kd_tree、brute方法进行搜索,
brute:
	是蛮力搜索,也就是线性扫描,当训练集很大时,计算非常耗时。
kd_tree:
	构造kd树存储数据以便对其进行快速检索的树形数据结构,kd树也就是数据结构中的二叉树。以中值切分构造的树,每个结点是一个超矩形,在维数小于20时效率高。
ball tree:
	是为了克服kd树高维失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体

2.3 K-近邻算法代码

分析:

  1. x_test = transfer.transform(x_test),测试集只是使用transform进行标准化,是因为要和训练集x_train 做一样的处理,训练集调用transfer.fit_transform()计算出的均值,标准差的值均在模型中,x_test = transfer.transform(x_test)就是直接使用测试集的参数进行计算。
python 复制代码
def knn_iris():
    """
    用KNN算法对鸢尾花进行分类
    :return:
    """

    # 1.获取数据
    iris = load_iris()
    # 2.划分数据集  参数:特征值,目标值,随机数种子
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
    # 3.特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)                                 
    # 4.KNN算法预估器  n_neighbors=3就是K值等于3
    estimator = KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train, y_train)
    # 5.模型评估
    # 方法1: 直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print(f"y_predict:\n{y_predict}")
    print(f"直接比对真实值和预测值: {y_test == y_predict}")
    # 方法2: 计算准确率
    score = estimator.score(x_test, y_test)
    print(f"准确率为: {score}")

    return None

2.4 运行结果

2.5 K-近邻算法优缺点

python 复制代码
优点:简单,易于理解,易于实现,无需训练
缺点:
    1)必须指定K值,K值选择不当则分类精度不能保证
    2)懒惰算法,对测试样本分类时的计算量大,内存开销大
    使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试

3.模型选择与调优

3.1 交叉验证(cross validation)

python 复制代码
交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换
不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证。

3.2 网格搜索(Grid Search)

python 复制代码
通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。
每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。

3.3 交叉验证,网格搜索(模型选择与调优)API:

python 复制代码
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
对估计器的指定参数值进行详尽搜索
	estimator:估计器对象
	param_grid:估计器参数(dict){"n_neighbors":[1,3,5]}
	cv:指定几折交叉验证
	fit:输入训练数据
	score:准确率
结果分析:
	bestscore__:在交叉验证中验证的最好结果
	bestestimator:最好的参数模型
	cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果

3.4 代码

python 复制代码
def knn_iris_gscv():
    """
    用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证
    :return:
    """

    # 1.获取数据
    iris = load_iris()

    # 2.划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=20)

    # 3.特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4.KNN算法预估器
    estimator = KNeighborsClassifier()

    # 加入网格搜索和交叉验证
    # 参数准备
    param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}   # 网格搜索
    # cv=10 代表10折运算(交叉验证)
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)
    estimator.fit(x_train, y_train)

    # 5.模型评估
    # 方法1: 直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print(f"y_predict:\n{y_predict}")
    print(f"直接比对真实值和预测值: {y_test == y_predict}")
    # 方法2: 计算准确率
    score = estimator.score(x_test, y_test)
    print(f"准确率为: {score}")

    # 最佳参数:
    print("最佳参数: \n", estimator.best_params_)
    # 最佳结果:
    print("最佳结果: \n", estimator.best_score_)
    # 最佳参数:
    print("最佳估计器: \n", estimator.best_estimator_)
    # 交叉验证结果:
    print("交叉验证结果: \n", estimator.cv_results_)
    return None

3.5 运行结果

本章学习资源

黑马程序员3天快速入门python机器学习

我是跟着视频进行的学习,欢迎大家一起来学习!

相关推荐
HyperAI超神经2 小时前
【TVM 教程】使用 Tensorize 来利用硬件内联函数
人工智能·深度学习·自然语言处理·tvm·计算机技术·编程开发·编译框架
埃菲尔铁塔_CV算法6 小时前
深度学习神经网络创新点方向
人工智能·深度学习·神经网络
图片转成excel表格7 小时前
WPS Office Excel 转 PDF 后图片丢失的解决方法
人工智能·科技·深度学习
李歘歘8 小时前
万字长文解读深度学习——多模态模型CLIP、BLIP、ViLT
人工智能·深度学习
B站计算机毕业设计超人9 小时前
计算机毕业设计Python+大模型农产品价格预测 ARIMA自回归模型 农产品可视化 农产品爬虫 机器学习 深度学习 大数据毕业设计 Django Flask
大数据·爬虫·python·深度学习·机器学习·课程设计·数据可视化
新手小白勇闯新世界9 小时前
深度学习知识点5-马尔可夫链
人工智能·深度学习·计算机视觉
热爱生活的五柒10 小时前
深度学习:利用随机数据更快地测试一个新的模型在自己数据格式很复杂的时候
人工智能·深度学习
科研实践课堂(公众号名称)10 小时前
基于OpenFOAM和深度学习驱动的流体力学计算与应用
人工智能·深度学习
LittroInno11 小时前
TofuAI处理BT1120时序视频要求
深度学习·计算机视觉·tofu