KNN、决策树的初步认识

本文介绍了K近邻(KNN)分类器的基本思想、参数设置及其在鸢尾花数据集上的应用。接着,详细阐述了决策树的学习过程,包括特征选择、决策树生成与剪枝,以及信息增益和信息增益比的概念。KNN算法中的关键参数k的选择对分类效果有直接影响,而决策树通过递归选择最优特征进行划分,并通过剪枝避免过拟合。
摘要由CSDN通过智能技术生成
  • 分类:

    • K近邻分类器(KNN)
      算法思想:通过计算待分类点和已知类别数据点间的距离,选取距离最小的前k个值,根据少数服从多数的原则,将待分类点纳入到点出现最多的那个类别中去;
      算法分类器封装在sklearn.neighbors.KNeighborsClassifier中
      其中参数设置:
      n_neighbors:用于指定分类器中k的大小,与K_means算法不同,k-means中指定的是最后聚类结果中簇的个数,而KNN中的k表示的是选取之间距离最小的前k个点,依据少数服从多数的原则来进行分类;
      weights:设置前k个点对分类结果影响的权重系数,默认为uniform,也可以自定义
      algorithm:用于寻找邻近点的算法,当数据量很大的时候,选取出距离小的前k个点很困难,需要进行算法优化,选项可以为ball_tree,kd_tree、brute等,默认为auto,根据数据集z自动选择;

      k近邻算法是最近邻算法的改进,最近邻算法易受到噪声的干扰;
      kNN算法K的选取:
      K过小,向最近邻算法转化,易受到噪点干扰
      K过大,距离较远的点也会影响分类的效果

      对鸢尾花数据集进行KNN分类

          import numpy as np
          import pandas as pd
          from sklearn.datasets import load_iris
          from sklearn.model_selection import train_test_split
          from sklearn.neighbors import KNeighborsClassifier
          
          iris = load_iris()
          X = iris.data
          y = iris.target
          
          # 划分训练集和测试集
          X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
          
          # 实例化KNN分类器
          knn = KNeighborsClassifier(n_neighbors=4)
          knn.fit(X_train, y_train)
          
          # 进行预测分类
          y_predict = knn.predict(X_test)
          print('预测结果为:', y_predict)
          print('正确结果为:', y_test)
          print('正确率为:', np.mean(y_predict == y_test))
      
    • 决策树算法
      在分类问题中,决策树模型可以当作if-then规则,主要优点是速度快、可读性强;
      决策树学习的三步骤:
      1)特征选择
      2)决策树生成
      3)决策树剪枝

      决策树模型由两部分组成:
      1)结点(分为内部节点和叶子节点,内部节点表示选取的特征,而叶子结点表示一个类别)
      2)有向边 (判断的条件)

      决策树与条件概率:
      决策树还表示在给定特征条件下类的条件概率分布;根据if-then规则将特征空间划分成若干部分,每一块即对应决策树中的一条路径;在最后叶子节点出的判定类别是比较条件概率的大小,一般来说各个叶子节点上的条件概率会偏向某一个类别,即比较P(y=category1|x=(特征集合))、P(y=category2|x=(特征集合))、……、P(y=categoryn|x=(特征集合)),选取条件概率大的那个类别作为分类结果

      决策树的学习:
      实质上就是拟合基于特征空间划分的类的条件概率模型,通俗讲就是学习一套if-then分类规则;
      决策树的学习算法采用递归的思想:
      1)选取最优特征进行划分,若各个子集有一个较好的分类,则构建叶子节点将子集放入其中,
      子集的划分效果可以通过分类纯度来判定
      2) 若子集分类效果不明显,在选取余下特征中的最优特征进行划分,如此递归下去,
      直至子集能被很好的划分或者已没有可供选择的特征为止;
      3)可能数据过于细分,会发生过拟合现象而模型的泛化能力不足,这时候我们需要
      进行决策树的剪枝,剔除过于细分的叶节点,回退到父节点或者祖先节点;
      【决策树的生成只考虑局部最优,而决策树的剪枝考虑全局最优】
      三步骤:
      特征选取:
      选取对训练数据具有分类能力的特征,这能提高决策树的学习效率,特征选择是决定用什么特征来划分特征空间的,对应的是if-then规则的if条件
      特征选择的准则为:信息增益、信息增益比
      好的特征选择:训练数据按照这一个特征来划分成各个子集,使得各个子集在当前条件下有 较好的分类
      信息增益:
      表示在特征X已知情况下使得Y的不确定性减少的程度;
      熵:表示随机变量不确定性的度量,熵的取值越大,随机变量的不确定性就越大;
      离散随机变量X的条件概率分布为P(X=xi)=pi , i=1,2,3,4,……,n
      则随机变量X的熵为H(X) = -sum(Pilogpi) i取遍1~n
      可以从上述看出,X的熵的大小与X的取值无关,至于随机变量X的概率分布相关
      所以H(X)也可以记作H§ = -sum(Pi
      logpi) i取遍1~n
      条件熵:H(Y|X)表示在一直X的条件下随机变量Y的不确定性度量
      X,Y的联合概率密度函数为 P(X=xi,Y=yi)=pij i取遍1~n 、j取遍1~n
      条件熵 = 在X给定条件下Y的条件概率分布的熵对X的数学期望
      H(Y|X) = sum(pi*H(Y|X=xi)) i取遍1~n
      当熵和条件熵概率是由样本估计所得时,我们称之为经验熵、经验条件熵;
      信息增益 g(Y,X) = H(Y) - H(Y|X)
      信息增益大的特征具有更强的分类能力
      信息增益比:
      当分类问题规模较大,分类任务规模较为复杂时,往往信息增益会偏大;
      反之,信息增益会偏小;为对此进行校正,出现了信息增益比;
      信息增益比 = 信息增益/经验熵 即g_rate(D,A) = g(D,A)/H(D)
      在这里插入图片描述

  • 决策树的生成
    ID3算法:使用信息增益来选择特征
    1)选定训练数据、特征集、信息增益的阈值
    2)当训练数据属于同一类时,返回单节点树,并将这一类置为该节点的类标签
    3)当特征集为空时,返回单节点树,并将该节点中实例数最大的所属的类作为类标记
    4)否则计算各个特征的信息增益,挑选最优特征进行划分
    5)如果信息增益小于规定的阈值,则返回单节点数,以实例数最大的所属类作为类标记
    6)对数据集合按最最优特征进行分割,以每个子集中实例数最大的作为类标记,创建子节点
    7)在剩下的特征中计算信息增益,挑选最优特征,对上述步骤进行递归调用;
    note:该算法中只有决策树的生成,无剪枝过程,易产生过拟合;

    C4.5算法:使用信息增益比来选择特征
    算法思想与ID3算法一致;

    CART算法:暂时略

    • 决策树的剪枝
      将已经生成的树进行简化的过程,为了防止过拟合现象;
      决策树的剪枝通过极小化决策树的整体损失函数或者代价函数,同时考虑了预测误差和模型复杂度的关系;
      损失函数: Cα(T) = C(T) + α|T|
      算法流程:
      1)计算每个节点的经验熵
      2)递归从数叶节点向上回缩
      3)回缩之前、之后的整体书分别为Ta 和Tb,当Tb的损失函数值小于Ta的,则进行剪枝

          import numpy as np
          import pandas as pd
          from sklearn.datasets import load_iris
          from sklearn.model_selection import cross_val_score
          from sklearn.tree import DecisionTreeClassifier
          
          iris = load_iris()
          X = iris.data
          y = iris.target
          
          # 进行模型的拟合
          clf = DecisionTreeClassifier()
          # 采用10折交叉验证
          result = cross_val_score(clf, X, y, cv=10)
          # print(result)
      
决策树是一种常见的机器学习方法,用于分类和回归任务。在决策树中,每个内部节点表示一个属性测试,每个叶节点表示一个类别或一个回归值。决策树的学习过程是通过对训练数据集进行递归划分,使得每个子节点的样本尽可能属于同一类别或具有相似的回归值。 K最近邻算法(KNN)是一种基于实例的学习方法,用于分类和回归任务。在KNN中,对于一个新的样本,通过计算其与训练集中所有样本的距离,并选择距离最近的K个样本作为邻居。然后,根据邻居的类别(对于分类任务)或平均值(对于回归任务),预测新样本的类别或回归值。 在Python中,可以使用scikit-learn库来实现KNN决策树算法。下面是一个示例代码,演示如何使用Python进行数据挖掘中的KNN决策树: ```python # 导入所需的库 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score # 加载数据集 iris = load_iris() X = iris.data y = iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建KNN分类器并进行训练和预测 knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train) knn_pred = knn.predict(X_test) # 创建决策树分类器并进行训练和预测 dt = DecisionTreeClassifier() dt.fit(X_train, y_train) dt_pred = dt.predict(X_test) # 计算准确率 knn_accuracy = accuracy_score(y_test, knn_pred) dt_accuracy = accuracy_score(y_test, dt_pred) # 打印结果 print("KNN准确率:", knn_accuracy) print("决策树准确率:", dt_accuracy) ``` 这段代码演示了如何使用KNN决策树算法对鸢尾花数据集进行分类,并计算了它们的准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值