当前位置: 首页 > news >正文

机器学习算法介绍二

今天要介绍的算法是机器学习中的逻辑回归和决策树算法。

逻辑回归啊

原理:将线性回归的输出,作为激活函数Sigmoid的输入,通过激活函数将输出值映射到(0, 1)区间内,然后设置阈值完成分类。
在这里插入图片描述

Sigmoid函数的数学表达式为:f(x)=11+e−x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+ex1

基本思想:

  1. 利用线性模型f(x) = W^T + b根据特征的重要性计算出一个值。
  2. 在使用Sigmoid函数将值映射为概率值
    • 设置阈值为0.6,输出概率值大于0.6,则将未知样本输出为1类。
    • 否则输出为0类
  3. 逻辑回归的假设函数:W(x) = Sigmoid(W^T + b)

逻辑回归的损失函数:Loss(L)=−∑i=1n(yilog⁡(pi)+(1−yi)log⁡(1−pi)) \text{Loss}(L) = -\sum_{i=1}^{n} \left( y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right) Loss(L)=i=1n(yilog(pi)+(1yi)log(1pi))

在损失函数中,Yi表示的是真实标签值,Pi是模型对第i个样本对应类别(通常是正类)的预测概率。通过公式我们不难得出如下结论:

  1. 当Yi = 1时,预测概率越接近1,损失越小。预测概率越接近0,损失越大。
  2. 当Yi = 0时,与Yi = 1恰好相反,预测概率越接近0,损失越小。预测概率越接近1,损失越大。

逻辑回归的API:sklearn.linear_model.LogisticRegression

分类算法评估

逻辑回归主要用于二分类模型中,而对于分类算法,都可以统一使用混淆矩阵、精确率、召回率、F1-分数来对模型进行评估。而除混淆矩阵外,其余所有评估标准均可以使用混淆矩阵得出,因此混淆矩阵的重要性不言而喻。

混淆矩阵(Confusion Matrix)是分类模型评估的一种工具,用来衡量模型预测结果与真实值之间的对比关系。通常是一个二维矩阵,其行表示真实类别,列表示模型预测类别。根据实际情况,它会包含以下四个重要的指标:

  1. 真正例 (True Positives, TP): 被模型正确预测为正类的样本数。即,实际是正类且模型预测为正类的样本。
  2. 假正例 (False Positives, FP): 被模型错误预测为正类的样本数。即,实际是负类但模型预测为正类的样本。
  3. 真负例 (True Negatives, TN): 被模型正确预测为负类的样本数。即,实际是负类且模型预测为负类的样本。
  4. 假负例 (False Negatives, FN): 被模型错误预测为负类的样本数。即,实际是正类但模型预测为负类的样本。

混淆矩阵的结构如下:

预测为正类预测为负类
实际为正类真正例TP伪反例FN
实际为父类伪正例FP真反例TN

前面提到,除混淆矩阵外,其余所有模型评估指标均是基于混淆矩阵常用指标:

  1. 准确率:模型预测正确的比例。计算公式为:Accuracy=TP+TNTP+FP+TN+FN Accuracy = \frac{TP + TN}{TP + FP + TN + FN} Accuracy=TP+FP+TN+FNTP+TN
  2. 精确率:被预测为正类样本中,实际为正类的比例。精确率越高,则意味着误报(将负类预测为正类的错误)较少。计算公式为:Precision=TPTP+FP Precision = \frac{TP}{TP + FP} Precision=TP+FPTP
  3. 召回率:实际为正类样本中,被预测为正类的比例。找回率越高,则意味着模型漏掉的正类样本较少。计算公式为:Recall=TPTP+FN Recall = \frac{TP}{TP + FN} Recall=TP+FNTP
  4. F1-Score:精确率和召回率的调和平均数。计算公式为:F1=2×Precision×RecallPrecision+Recall F1 = 2 \times \frac{Precision \times Recall}{Precision + Recall} F1=2×Precision+RecallPrecision×Recall

API接口:from sklearn.metrics import confusion_matrix(混淆矩阵), accuracy_score(准确率), precision_score(精确率), recall_score(召回率), f1_score(F1-分数)

示例代码

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import pandas as pd
import joblib
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_scoredef Cancer_Classification_Prediction():# 1、读取数据df = pd.read_csv('../../../../data/breast-cancer-wisconsin - 副本.csv')# 2、数据预处理# 2.1、处理异常数据data = df.replace('?', np.nan)data = data.dropna()# 2.2、将数据进行分组feature = data.iloc[:, 0:10]label = data.iloc[:, 10]x_train, x_test, y_train, y_test = train_test_split(feature, label, test_size=0.2, random_state=22)# 3、特征工程 - 数据标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 4、模型的训练estimator = LogisticRegression()estimator.fit(x_train, y_train)# 5、模型的评估y_predict = estimator.predict(x_test)# 5.1 准确率score = accuracy_score(y_test, y_predict)print(f"score -> {score}")# 5.2 混淆矩阵Confusion_Matrix = confusion_matrix(y_test, y_predict, labels=[4, 2])Confusion_Matrix = pd.DataFrame(Confusion_Matrix, index=['恶性(正例)', '良性(假例)'], columns=['恶性(正例)', '良性(假例)'])print(f"confusion_matrix -> \n{Confusion_Matrix}")# 5.3 精确率、召回率和F1-Scoreprint(f"precision_score -> {precision_score(y_test, y_predict, pos_label=4)}")print(f"recall_score -> {recall_score(y_test, y_predict, pos_label=4)}")print(f"F1-Score -> {f1_score(y_test, y_predict, pos_label=4)}")if __name__ == '__main__':Cancer_Classification_Prediction()

决策树

决策树(Decision Tree)是一种常用于分类和回归任务的机器学习模型,它通过树形结构来表示决策过程。每一个内部节点代表一个特征,每一个叶子节点代表一个标签。

ID3树

常用指标:

  1. 熵(信息熵):衡量一个数据集的不确定性和混乱程度的度量。在信息论中,熵用于表示一个随机变量的平均信息量。熵越大,表示数据集不确定或越混乱;熵越小,表示数据集越纯净或确定。计算公式为:Ent(D)=−∑i=1kpilog⁡2pi Ent(D) = -\sum_{i=1}^k p_i \log_2 p_i Ent(D)=i=1kpilog2pi
  2. 条件熵:是在给定一个特征A后,样本集中,剩余总样本的信息熵。计算公式为:Ent(D∣A)=∑v=1V∣Dv∣∣D∣Ent(Dv) Ent(D|A) = \sum_{v=1}^V \frac{|D_v|}{|D|} Ent(D_v) Ent(DA)=v=1VDDvEnt(Dv)
  3. 信息增益:衡量一个特征对分类结果所带来信息量提升的指标。它表示在对数据集按照某个特征进行划分后,样本集合的不确定性(熵)减少了多少。信息增益 = 信息熵 - 条件熵

ID3树就是根据样本的信息增益指标来进行分类的,信息增益越大的特征,优先作为分类特征作为决策树的内部节点。其具体的构建思路如下:

  1. 计算数据集的信息熵:先计算整体样本的不确定性。
  2. 对每个特征列计算其信息增益:计算该特征划分后,样本集熵的减少量。
  3. 选择信息增益最大的特征:把这个特征作为当前节点的划分属性。
  4. 划分数据集:按照特征的不同取值,把数据集划分若干个子集。
  5. 递归生成子树:对每个子集重复上述步骤,继续选择信息增益最大的特征进行划分。
  6. 停止条件:如果某个子集内的样本已经全部属于同一类,则生成叶子节点。或者没有特征可以继续划分时,用多数类作为叶子节点的类别。

C4.5树

根据ID3树的信息增益计算公式不难看出,ID3树总是倾向于选择特征列数量较多的列作为当前节点的划分属性。这样会增加模型的复杂度,从而容易造成过拟合的情况。因此为了应对ID3树选择特征列数量过多的情况,诞生了C4.5树。其选择特征作为当前节点的规则是选择信息增益率大的特征作为当前节点。计算公式如下:信息增益率 = 信息增益/特征熵

特征熵是衡量整个数据集是整体不确定性,用于描述数据集中类别的分布的混乱程度,不依赖于任何特征的划分。其计算公式为:H(D)=−∑i=1mpilog⁡2pi H(D) = - \sum_{i=1}^{m} p_i \log_2 p_i H(D)=i=1mpilog2pi

CART树

定义:CART是由Beriman等人在1984年提出的一种决策树算法,能够同时用于分类问题和回归问题。

  • 分类树:目标变量是离散型,通过决策树进行分类。
  • 回归树:目标变量是连续型,通过树结构预测数值。

CART树的核心思想是通过二叉树不断划分数据集,使每个子节点的纯度尽可能高(分类问题)或方差尽可能小(回归问题)

基本特点

  1. 二叉树结构:每个节点最多只有两个子节点。
  2. 递归分裂:通过贪心算法选择最哟特征和切分点来划分数据。
  3. 可用于分类和回归:分别采用不同的分裂标准。
  4. 剪枝机制:通过兼职减少过拟合,提升泛化能力。

分类和回归树流程:

  1. 选择最佳分裂特征和分裂点
    • 在回归树中,使用的是最小平方误差(MSE):MSE=1N∑i=1N(yi−yˉ)2 MSE = \frac{1}{N} \sum_{i=1}^{N} (y_i - \bar{y})^2 MSE=N1i=1N(yiyˉ)2划分后选择是的子节点总和MSE最小的特征和分裂点。
    • 在分类树中,使用的是基尼指数作为节点纯度指标,计算公式为:Gini(D)=1−∑k=1Kpk2 Gini(D) = 1 - \sum_{k=1}^{K} p_k^2 Gini(D)=1k=1Kpk2其中pk为节点中属于类别k的概率。
  2. 递归划分数据:对每个子节点重复步骤1,直到满足停止条件(节点样本数小于阈值或者纯度达到最大)。
  3. 剪枝:为避免过拟合,可以使用剪枝操作。

在决策树中,为了防止过拟合,通常会对树进行剪枝。剪枝的目的是减少树的复杂度,提升泛化能力。剪枝方法主要分为两类:预剪枝和后剪枝。

特性预剪枝(Pre-Pruning)后剪枝(Post-Pruning)
剪枝时间在树生成过程中在生成完整树之后
计算量较小较大
过拟合风险中等,可能出现欠拟合较低,更好控制过拟合
实现难度简单较复杂
泛化能力较弱较强
优点节省时间,防止树过深保留重要分支,泛化能力强
缺点可能错过全局最优,欠拟合风险计算量大,训练时间长

三种决策树的对比(分类问题)

特性ID3树C4.5树CART树
特征类型离散特征离散和连续特征离散和连续特征
划分标准信息增益,信息增益大的优先分类信息增益率,信息增益率大的优先分类基尼指数,基尼指数小的优先分类
树的结构多叉树多叉树二叉树
处理缺失值能力
剪枝方式不支持后剪枝支持预剪枝和后剪枝
优点简单易懂改进了ID3的偏向性,适用性强可用于回归和分类,泛化能力强
缺点只能处理离散特征,容易过拟合计算复杂,训练速度较慢生成完全二叉树计算量大,训练时间长

决策树的API接口:klearn.tree.DecisionTreeClassifier

实现代码实例

import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn.metrics import classification_report
from sklearn.tree import DecisionTreeClassifier, plot_treedef Titanic_DecisionTreeClassifier():# 1、读取数据data = pd.read_csv('../../../../data/train.csv')# 2、数据预处理feature = data[['Age', 'Sex', 'Pclass', 'Parch']]feature = feature.copy()feature_name = ['Age', 'Sex', 'Pclass', 'Parch']label = data['Survived']# 2.1、用平均年龄填充缺失值feature['Age'] = feature['Age'].fillna(feature['Age'].mean())# 2.2、对Sex进行热编码处理feature = pd.get_dummies(feature)feature.drop(columns='Sex_male', axis=1, inplace=True)# 2.3、划分数据集和验证集x_train, x_test, y_train, y_test = train_test_split(feature, label, test_size=0.2, random_state=22)# 3、特征工程--数据标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 4、训练模型# todo DecisionTreeClassifier类中criterion参数的默认值是'gini'代表树的类型为CART树# todo 在机器学习中,没有专门的API实现ID3和C4.5树,因此只能使用CART树的接口,修改criterion参数为'entropy',且树的类型只有二叉树没有多叉树estimator = DecisionTreeClassifier()estimator.fit(x_train, y_train)y_predict = estimator.predict(x_test)# 5、模型评估# 获取模型评估的各项指标print(f"score -> {estimator.score(x_test, y_test)}")print(classification_report(y_test, y_predict))# 6、决策树可视化plt.figure(figsize=(50, 30))plot_tree(estimator,feature_names=feature_name,max_depth=10,filled=True,class_names=['died', 'Survived'])plt.show()if __name__ == '__main__':Titanic_DecisionTreeClassifier()# Titanic_LogisticRegression()# Titanic_KNN()

文章转载自:

http://JRdiLMRh.ghyyt.cn
http://g8IbrmKj.ghyyt.cn
http://6fmZ6fNe.ghyyt.cn
http://pF6wciSh.ghyyt.cn
http://LgNp2w0A.ghyyt.cn
http://XqpK50GY.ghyyt.cn
http://FQDLgWT2.ghyyt.cn
http://DJYmQGiU.ghyyt.cn
http://dYOl3pTB.ghyyt.cn
http://YI8XDiR9.ghyyt.cn
http://bsVNtEQY.ghyyt.cn
http://DNZUzHP5.ghyyt.cn
http://XehH7jfT.ghyyt.cn
http://NompGElU.ghyyt.cn
http://PYGqAYKe.ghyyt.cn
http://bu7O9cuS.ghyyt.cn
http://ESb3qHIz.ghyyt.cn
http://wuCaIQNw.ghyyt.cn
http://6qMRItnT.ghyyt.cn
http://cuut9rnx.ghyyt.cn
http://IQE5IcvC.ghyyt.cn
http://HQV92RqP.ghyyt.cn
http://D3sOovY9.ghyyt.cn
http://XUvD9F91.ghyyt.cn
http://sg6moBPW.ghyyt.cn
http://HeFK96S7.ghyyt.cn
http://JPjWqpDV.ghyyt.cn
http://ccmvMYXv.ghyyt.cn
http://lTBazAtb.ghyyt.cn
http://pdWbB7ev.ghyyt.cn
http://www.dtcms.com/a/368628.html

相关文章:

  • 【MYSQL | 高级篇 日志、主从复制与读写分离】
  • IO进程线程;多线程;线程互斥同步;互斥锁;无名信号量;条件变量;0905
  • 虚拟机详细图文教程系列15、Linux虚拟机Centos8系统部署禅道开源项目
  • uniapp开发小程序,列表 点击后加载更多数据
  • 云市场周报 (2025.09.05):解读腾讯云AI安全、阿里数据湖与KubeVela
  • 一键生成PPT的AI工具排名:2025年能读懂你思路的AI演示工具
  • 【数据结构、java学习】数组(Array)
  • 越南电网3D地图
  • 大数据毕业设计选题推荐-基于大数据的分化型甲状腺癌复发数据可视化分析系统-Spark-Hadoop-Bigdata
  • Kubernetes 全景指南:从核心概念到云原生未来
  • 视频监控展示插件-js,支持多种视频格式
  • 2025年国家高新技术企业认定:申报材料和流程详解
  • 【面试场景题】spring应用启动时出现内存溢出怎么排查
  • 【NVIDIA AIQ】自定义函数实践
  • 【RelayMQ】基于 Java 实现轻量级消息队列(六)
  • 解锁 Claude Code 终极工作流:从基础到进阶的全流程指南
  • 深入浅出 全面剖析消息队列(Kafka,RabbitMQ,RocketMQ 等)
  • 工业HMI:人机交互的核心与智能制造的桥梁
  • 解决rt_pin_get返回错误码的问题
  • 基于单片机汽车防撞系统设计
  • Java 提取 PDF 文件内容:告别手动复制粘贴,拥抱自动化解析!
  • 【AI总结】Python BERT 向量化入门指南
  • 《sklearn机器学习——回归指标2》
  • 投资储能项目能赚多少钱?小程序帮你测算
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的公益课引流策略研究
  • 医疗问诊陪诊小程序:以人性化设计构建健康服务新生态
  • modbus_tcp和modbus_rtu对比移植AT-socket,modbus_tcp杂记
  • 云手机的空间会占用本地内存吗
  • HTML 各种事件的使用说明书
  • docker 部署RustDesk服务