【人工智能】利用大语言模型(LLM)实现机器学习模型选择与实验的自动化

devtools/2024/11/13 21:01:57/

文章目录

    • 引言
    • 环境准备
      • 数据集说明
    • 项目结构
      • 主要文件说明
    • 导入必要的软件包
      • 软件包功能简述
    • 辅助函数定义
      • 加载配置文件
      • 加载数据集
      • 预处理数据集
      • 函数功能详解
    • 集成LLM进行模型选择
      • 调用LLM的函数定义
      • 函数功能详解
    • 清理和验证LLM的输出
      • 清理超参数建议
      • 提取模型名称
      • 验证超参数
      • 修正超参数
      • 函数功能详解
    • 模型训练与评估
      • 训练与评估函数定义
      • 函数功能详解
    • 自动化流程实现
      • 自动化流程函数定义
      • 函数功能详解
    • 主函数
      • 主函数定义
      • 函数功能详解
    • 执行代码
      • 前置步骤
      • 执行命令
    • 示例输出
      • 输出解释
      • 主要优势
      • 更多文章
      • 结语

引言

机器学习项目中,模型选择和实验设计是至关重要的步骤。传统方法依赖于开发者手动选择合适的模型并进行调优,这不仅耗时且容易出错。随着模型数量和复杂性的增加,手动优化变得愈加困难和低效。借助LLM的强大能力,我们可以自动化这些过程,简化工作流程,并确保模型性能的最优化。

本文将介绍如何使用LLM(以GPT-4为例)来自动选择最佳模型,并进行超参数调优。通过自动化流程,我们可以大幅提升实验效率,减少人为错误,并快速迭代优化模型性能。
在这里插入图片描述

环境准备

在开始之前,我们需要准备项目所需的环境和数据集。具体步骤包括:

  1. 安装必要的软件包:确保你的环境中安装了必要的Python包。
  2. 下载和预处理数据集:以Kaggle的信用卡欺诈检测数据集为例,我们需要对数据进行预处理,以便后续模型训练。大模型聚集地-ChatMoss & ChatGPT中文版

以下是预处理数据集的代码示例:

import pandas as pd# 读取数据集
df = pd.read_csv('fraud_data.csv')# 删除不必要的列
df = df.drop(['trans_date_trans_time', 'merchant', 'dob', 'trans_num', 'merch_lat', 'merch_long'], axis=1)# 丢弃缺失值
df = df.dropna().reset_index(drop=True)# 保存预处理后的数据
df.to_csv('fraud_data.csv', index=False)

数据集说明

Kaggle的信用卡欺诈检测数据集包含了大量的交易记录,每条记录包含多个特征,如交易金额、时间、商家信息等。其中,is_fraud 列是目标变量,表示该交易是否为欺诈行为。通过删除一些不必要的列和丢弃含有缺失值的记录,我们简化了数据集,使其更加适合后续的建模工作。

注意:以上预处理步骤只是一个简单的示例。在实际项目中,你可能需要进行更复杂的数据清洗和特征工程,以提升模型的性能。

项目结构

为确保项目的组织结构清晰,我们建议创建一个专门的项目文件夹,并在其中存放所有相关文件。以下是推荐的项目结构:

automated_model_selection/
│
├── data/
│   └── fraud_data.csv
│
├── config.yaml
├── requirements.txt
├── automated_model_llm.py
│
├── README.md
└── .gitignore

主要文件说明

  • data/: 存放数据集的文件夹。
  • config.yaml: 存储项目配置和元数据的YAML文件。
  • requirements.txt: 列出项目所需的Python包,以便快速安装依赖。
  • automated_model_llm.py: 主脚本文件,包含自动化模型选择和实验的所有代码。
  • README.md: 项目说明文件。
  • .gitignore: Git忽略文件配置,防止不必要的文件被提交到版本控制系统。

通过这种结构化的组织方式,我们可以更方便地管理项目文件,并确保各部分功能模块化,便于维护和扩展。

导入必要的软件包

在主代码文件中,我们需要导入所有必要的软件包,并定义模型映射关系。这些软件包包括:

  • pandas:用于数据处理和分析。
  • yaml:用于加载配置文件。
  • reast:用于处理字符串和解析字典。
  • sklearn:提供机器学习模型和评估工具。
  • openai:用于调用OpenAI的GPT-4模型。

以下是导入软件包和定义模型映射的代码示例:

import pandas as pd
import yaml
import ast
import re
import sklearn
from openai import OpenAI
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score# 模型映射
model_mapping = {"LogisticRegression": LogisticRegression,"DecisionTreeClassifier": DecisionTreeClassifier,"RandomForestClassifier": RandomForestClassifier
}

软件包功能简述

  • pandas:处理数据集,进行数据清洗和预处理。
  • yaml:读取和解析配置文件,以便动态加载参数。
  • reast:处理LLM生成的文本输出,提取有用的信息。
  • sklearn:提供各种分类模型和评估指标,支持模型训练和评估。
  • openai:用于与OpenAI的GPT-4模型进行交互,获取模型选择和超参数建议。

辅助函数定义

为了简化流程,我们定义了一些辅助函数,包括加载配置、加载数据、预处理数据等。这些函数模块化地处理各个阶段的任务,使主流程代码更加简洁和易于维护。

加载配置文件

def load_config(config_path='config.yaml'):"""加载配置文件参数:config_path (str): 配置文件路径返回:dict: 配置内容"""with open(config_path, 'r') as file:config = yaml.safe_load(file)return config

加载数据集

def load_data(dataset_path):"""加载数据集参数:dataset_path (str): 数据集路径返回:DataFrame: 加载的数据集"""return pd.read_csv(dataset_path)

预处理数据集

def preprocess_data(df):"""预处理数据集参数:df (DataFrame): 原始数据集返回:DataFrame: 预处理后的数据集dict: 标签编码器"""label_encoders = {}for column in df.select_dtypes(include=['object']).columns:le = LabelEncoder()df[column] = le.fit_transform(df[column])label_encoders[column] = lereturn df, label_encoders

函数功能详解

  • load_config:读取并解析YAML格式的配置文件,返回配置内容的字典。
  • load_data:读取CSV格式的数据集,返回DataFrame对象。
  • preprocess_data:对数据集进行预处理,主要包括标签编码,将类别型特征转换为数值型,以便于模型处理。

这些辅助函数的定义确保了代码的模块化和可重用性,增强了代码的可维护性。

集成LLM进行模型选择

在同一个文件中,我们设置LLM(如GPT-4)作为机器学习专家,用于评估和选择最佳模型。通过与LLM的对话,我们可以让其根据模型的性能指标推荐最优的模型和相应的超参数。大模型聚集地-ChatMoss & ChatGPT中文版

调用LLM的函数定义

def call_llm(prompt, api_key):"""调用LLM生成响应参数:prompt (str): 提示语api_key (str): OpenAI API密钥返回:str: LLM生成的响应内容"""client = OpenAI(api_key=api_key)response = client.chat.completions.create(model="gpt-4",messages=[{"role": "system", "content": "You are an expert in machine learning and able to evaluate the model well."},{"role": "user", "content": prompt}])return response.choices[0].message.content.strip()

函数功能详解

  • call_llm:接受提示语和API密钥,通过OpenAI的API调用GPT-4模型,获取生成的响应内容。系统提示中明确了LLM的角色为机器学习专家,使其在响应时更加专业和准确。

使用场景示例

prompt = (f"I have trained the following models with these metrics: {model_performance}. ""Which model should I select based on the best performance?"
)
best_model_response = call_llm(prompt, config['llm_api_key'])
print(f"LLM response for best model selection:\n{best_model_response}")

在上述示例中,我们向LLM提供了各个模型的性能指标,询问其基于最佳性能推荐哪个模型。这一过程自动化了模型选择的决策,减少了人为干预和偏见。

清理和验证LLM的输出

LLM生成的响应通常是以自然语言形式呈现,可能包含噪音或额外的信息。为了确保输出能够被后续流程有效利用,我们需要对其进行清理和验证。

清理超参数建议

def clean_hyperparameter_suggestion(suggestion):"""清理LLM生成的超参数建议参数:suggestion (str): LLM生成的超参数建议返回:str: 清理后的建议字典字符串,或None"""pattern = r'\{.*?\}'match = re.search(pattern, suggestion, re.DOTALL)if match:cleaned_suggestion = match.group(0)return cleaned_suggestionelse:print("Could not find a dictionary in the hyperparameter suggestion.")return None

提取模型名称

def extract_model_name(llm_response, available_models):"""从LLM响应中提取模型名称参数:llm_response (str): LLM生成的响应内容available_models (list): 可用模型列表返回:str: 提取到的模型名称,或None"""for model in available_models:pattern = r'\b' + re.escape(model) + r'\b'if re.search(pattern, llm_response, re.IGNORECASE):return modelreturn None

验证超参数

def validate_hyperparameters(model_class, hyperparameters):"""验证超参数的有效性参数:model_class (class): 模型类hyperparameters (dict): 超参数字典返回:bool: 超参数是否有效"""valid_params = model_class().get_params()invalid_params = []for param, value in hyperparameters.items():if param not in valid_params:invalid_params.append(param)else:if param == 'max_features' and value == 'auto':print(f"Invalid value for parameter '{param}': '{value}'")invalid_params.append(param)if invalid_params:print(f"Invalid hyperparameters for {model_class.__name__}: {invalid_params}")return Falsereturn True

修正超参数

def correct_hyperparameters(hyperparameters, model_name):"""修正不合法的超参数参数:hyperparameters (dict): 原始超参数model_name (str): 模型名称返回:tuple: 修正后的超参数字典和是否进行了修正的布尔值"""corrected = Falseif model_name == "RandomForestClassifier":if 'max_features' in hyperparameters and hyperparameters['max_features'] == 'auto':print("Correcting 'max_features' from 'auto' to 'sqrt' for RandomForestClassifier.")hyperparameters['max_features'] = 'sqrt'corrected = Truereturn hyperparameters, corrected

函数功能详解

  • clean_hyperparameter_suggestion:使用正则表达式提取LLM响应中的字典形式的超参数建议。如果未找到有效的字典,则返回None并输出错误信息。

  • extract_model_name:从LLM的响应中提取出推荐的模型名称。它会遍历可用模型列表,并匹配响应中的模型名称,确保提取到的是有效的模型。

  • validate_hyperparameters:验证LLM建议的超参数是否与模型类兼容。会检查超参数名称是否存在于模型的参数列表中,并过滤掉不合法或弃用的参数值。

  • correct_hyperparameters:根据模型名称对不合法的超参数值进行修正。例如,RandomForestClassifier的max_features参数不能设为'auto',应改为'sqrt'

这些函数确保了LLM生成的建议能被准确解析和应用,防止因无效的超参数导致模型训练失败或性能下降。

模型训练与评估

接下来,我们定义一个函数,用于训练和评估给定模型,并返回评估指标。这个过程涉及数据的分割、模型的实例化、训练、预测和评估。

大模型聚集地-ChatMoss & ChatGPT中文版

训练与评估函数定义

def train_and_evaluate(X_train, X_test, y_train, y_test, model_name, hyperparameters=None):"""训练并评估模型参数:X_train (DataFrame): 训练特征X_test (DataFrame): 测试特征y_train (Series): 训练标签y_test (Series): 测试标签model_name (str): 模型名称hyperparameters (dict, optional): 超参数字典返回:dict: 评估指标model: 训练好的模型"""if model_name not in model_mapping:print(f"Valid model names are: {list(model_mapping.keys())}")return None, Nonemodel_class = model_mapping.get(model_name)try:if hyperparameters:hyperparameters, corrected = correct_hyperparameters(hyperparameters, model_name)if not validate_hyperparameters(model_class, hyperparameters):return None, Nonemodel = model_class(**hyperparameters)else:model = model_class()except Exception as e:print(f"Error instantiating model with hyperparameters: {e}")return None, Nonetry:model.fit(X_train, y_train)except Exception as e:print(f"Error during model fitting: {e}")return None, Noney_pred = model.predict(X_test)metrics = {"accuracy": accuracy_score(y_test, y_pred),"precision": precision_score(y_test, y_pred, average='weighted', zero_division=0),"recall": recall_score(y_test, y_pred, average='weighted', zero_division=0),"f1_score": f1_score(y_test, y_pred, average='weighted', zero_division=0)}return metrics, model

函数功能详解

  • train_and_evaluate

    1. 模型实例化:根据传入的模型名称,从model_mapping中获取相应的模型类。如果提供了超参数,则在实例化模型时传入这些参数;否则使用默认参数。

    2. 模型训练:使用训练数据(X_trainy_train)对模型进行训练。

    3. 模型预测:使用测试数据(X_test)进行预测,得到预测结果y_pred

    4. 指标评估:计算并返回模型在测试集上的各项评估指标,包括准确率(accuracy)、精确率(precision)、召回率(recall)和F1分数(f1_score)。

通过这个函数,我们可以轻松地对不同的模型进行训练和评估,并获取一致的性能指标,便于后续的比较和选择。

自动化流程实现

现在,我们将上述功能整合起来,实现整个自动化的模型选择与实验流程。该流程包括以下几个关键步骤:

  1. 训练并评估所有模型:对配置文件中指定的所有模型进行训练和评估,记录各自的性能指标。
  2. LLM选择最佳模型:将各个模型的性能指标输入LLM,询问其推荐最佳模型。
  3. 检查最佳模型的超参数调优:询问LLM针对最佳模型的超参数建议。
  4. 自动运行超参数调优:如果LLM提供了有效的超参数建议,自动应用这些参数并重新训练评估模型。

自动化流程函数定义

def run_llm_based_model_selection_experiment(df, config):"""运行基于LLM的模型选择和实验自动化流程参数:df (DataFrame): 预处理后的数据集config (dict): 配置字典"""# 数据拆分X = df.drop("is_fraud", axis=1)y = df["is_fraud"]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)available_models = config['default_models']model_performance = {}# 训练并评估所有模型for model_name in available_models:print(f"训练模型: {model_name}")metrics, _ = train_and_evaluate(X_train, X_test, y_train, y_test, model_name)model_performance[model_name] = metricsprint(f"模型: {model_name} | 评估指标: {metrics}")# 使用LLM选择最佳模型sklearn_version = sklearn.__version__prompt = (f"我训练了以下模型,并获得了这些评估指标: {model_performance}. ""基于最佳性能,我应该选择哪个模型?")best_model_response = call_llm(prompt, config['llm_api_key'])print(f"LLM选择的最佳模型:\n{best_model_response}")best_model = extract_model_name(best_model_response, available_models)if not best_model:print("错误: 无法从LLM响应中提取有效的模型名称。")returnprint(f"LLM选择的最佳模型: {best_model}")# 检查并建议超参数调优prompt_tuning = (f"选择的模型是 {best_model}。你能建议一些超参数以提升性能吗? ""请以Python字典格式提供,例如 {{'max_depth': 5, 'min_samples_split': 4}}。"f"确保所有建议的超参数在scikit-learn版本 {sklearn_version} 中是有效的,""并避免使用已弃用或无效的值,例如 'max_features': 'auto'。""不要提供任何解释或以其他格式返回。")tuning_suggestion = call_llm(prompt_tuning, config['llm_api_key'])print(f"超参数调优建议:\n{tuning_suggestion}")cleaned_suggestion = clean_hyperparameter_suggestion(tuning_suggestion)if cleaned_suggestion is None:suggested_params = Noneelse:try:suggested_params = ast.literal_eval(cleaned_suggestion)if not isinstance(suggested_params, dict):print("超参数建议不是有效的字典。")suggested_params = Noneexcept (ValueError, SyntaxError) as e:print(f"解析超参数建议时出错: {e}")suggested_params = None# 根据建议自动运行超参数调优if suggested_params:print(f"使用建议的超参数运行 {best_model}: {suggested_params}")tuned_metrics, _ = train_and_evaluate(X_train, X_test, y_train, y_test, best_model, hyperparameters=suggested_params)print(f"调优后的评估指标: {tuned_metrics}")else:print("未提供有效的超参数进行调优。")

函数功能详解

  1. 数据拆分:将数据集划分为训练集和测试集,比例为70%训练,30%测试。这里使用了random_state=42以确保结果的可重复性。

  2. 训练并评估所有模型

    • 遍历配置文件中指定的所有模型。
    • 对每个模型调用train_and_evaluate函数,获取其性能指标,并将结果记录在model_performance字典中。
    • 打印每个模型的评估指标,便于实时监控训练进程。
  3. 使用LLM选择最佳模型

    • 构建一个提示语,包含各个模型的性能指标,询问LLM推荐哪个模型。
    • 调用call_llm函数获取LLM的响应。
    • 使用extract_model_name函数从LLM响应中提取出推荐的模型名称。
    • 打印并确认LLM选择的最佳模型。
  4. 检查并建议超参数调优

    • 基于LLM选择的最佳模型,构建一个新的提示语,请求LLM提供超参数调优建议。
    • 调用call_llm函数获取LLM的超参数建议。
    • 使用clean_hyperparameter_suggestion函数清理LLM的响应,提取出有效的超参数字典。
  5. 自动运行超参数调优

    • 如果LLM提供了有效的超参数建议,调用train_and_evaluate函数重新训练模型,并评价其调优后的性能。
    • 打印调优后的评估指标,以便对比和验证性能提升效果。

通过这一流程,整个模型选择和调优过程实现了高度自动化,极大地提升了工作效率,并减少了人为错误的可能性。

主函数

最后,定义主函数以运行整个自动化流程。主函数负责加载配置文件、加载和预处理数据集,并调用自动化流程函数。

主函数定义

def main():"""主函数,运行整个自动化模型选择与实验流程"""# 加载配置文件config = load_config()# 加载数据集df = load_data(config['dataset_path'])# 预处理数据集df, _ = preprocess_data(df)# 运行自动化流程run_llm_based_model_selection_experiment(df, config)if __name__ == "__main__":main()

函数功能详解

  • 加载配置文件:调用load_config函数读取config.yaml中的配置信息,包括LLM API密钥、待测试的模型列表、评估指标和数据集路径。

  • 加载数据集:调用load_data函数读取预处理后的数据集。

  • 预处理数据集:调用preprocess_data函数对数据进行进一步处理,如标签编码,以确保模型能够正确处理数据。

  • 运行自动化流程:调用run_llm_based_model_selection_experiment函数,执行整个模型选择与实验的自动化流程。

通过主函数的调用,整个流程得以顺利运行,实现从数据加载到模型选择和调优的全自动化

执行代码

确保所有文件准备就绪后,你可以通过以下命令运行整个自动化过程:

python automated_model_llm.py

前置步骤

  1. 安装依赖:确保安装了requirements.txt中列出的所有软件包。你可以使用以下命令快速安装:

    pip install -r requirements.txt
    
  2. 配置文件设置:在config.yaml中填入你的OpenAI API密钥,并根据需求调整模型列表和评估指标。

    llm_api_key: "YOUR-OPENAI-API-KEY"
    default_models:- LogisticRegression- DecisionTreeClassifier- RandomForestClassifier
    metrics: ["accuracy", "precision", "recall", "f1_score"]
    dataset_path: "fraud_data.csv"
    
  3. 数据集准备:将预处理后的fraud_data.csv放入data/文件夹中。

执行命令

python automated_model_llm.py

运行命令后,脚本将依次执行各个步骤,最终输出模型选择和调优的结果。

示例输出

以下是一个示例输出,展示了自动化流程的运行结果:

训练模型: LogisticRegression
模型: LogisticRegression | 评估指标: {'accuracy': 0.954, 'precision': 0.952, 'recall': 0.954, 'f1_score': 0.953}
训练模型: DecisionTreeClassifier
模型: DecisionTreeClassifier | 评估指标: {'accuracy': 0.912, 'precision': 0.910, 'recall': 0.912, 'f1_score': 0.911}
训练模型: RandomForestClassifier
模型: RandomForestClassifier | 评估指标: {'accuracy': 0.970, 'precision': 0.968, 'recall': 0.970, 'f1_score': 0.969}LLM选择的最佳模型:
根据以上评估指标,我推荐选择RandomForestClassifier,因为它在所有评估指标上表现最佳。LLM选择的最佳模型: RandomForestClassifier
超参数调优建议:
{
'n_estimators': 100,
'max_depth': None,
'min_samples_split': 2,
'min_samples_leaf': 1,
'max_features': 'sqrt',
'bootstrap': True
}
使用建议的超参数运行 RandomForestClassifier: {'n_estimators': 100, 'max_depth': None, 'min_samples_split': 2, 'min_samples_leaf': 1, 'max_features': 'sqrt', 'bootstrap': True}
调优后的评估指标: {'accuracy': 0.973, 'precision': 0.972, 'recall': 0.973, 'f1_score': 0.972}

输出解释

  1. 模型训练与评估结果

    • LogisticRegression:准确率95.4%,精确率95.2%,召回率95.4%,F1分数95.3%。
    • DecisionTreeClassifier:准确率91.2%,精确率91.0%,召回率91.2%,F1分数91.1%。
    • RandomForestClassifier:准确率97.0%,精确率96.8%,召回率97.0%,F1分数96.9%。

    从结果可以看出,RandomForestClassifier在所有评估指标上均表现最佳。

  2. LLM选择的最佳模型:基于评估指标,LLM推荐选择RandomForestClassifier。

  3. 超参数调优建议

    • n_estimators: 100
    • max_depth: None
    • min_samples_split: 2
    • min_samples_leaf: 1
    • max_features: ‘sqrt’
    • bootstrap: True
  4. 调优后的评估指标

    • RandomForestClassifier:准确率97.3%,精确率97.2%,召回率97.3%,F1分数97.2%。

    通过应用LLM建议的超参数,RandomForestClassifier的性能得到了进一步提升。

注意:实际输出可能因数据不同或LLM的响应而有所差异。你可以根据需要调整提示语和生成参数,以获得更加多样化或严格的LLM输出。

主要优势

  1. 效率提升自动化流程极大地减少了手动选择和调优模型的时间,提高了工作效率。
  2. 一致性:减少了人为错误和主观偏见,确保模型选择和调优的一致性和客观性。
  3. 可扩展性:通过调整配置文件和提示语,可以轻松扩展到更多的模型和更复杂的调优任务。

更多文章

【VScode】中文版ChatGPT编程工具-CodeMoss!教程+示例+快捷键
【VScode】VSCode中的智能编程利器,全面揭秘ChatMoss & ChatGPT中文版

结语

随着LLM能力的进一步提升,其在数据科学和机器学习领域的应用前景将更加广阔。未来,LLM可能不仅能自动选择和调优模型,还能进行更复杂的特征工程、模型解释和结果分析,全面助力数据科学家的工作。

希望本文能够帮助你理解如何利用LLM实现机器学习模型选择与实验的自动化。如果有任何问题或建议,欢迎在评论区交流讨论!


http://www.ppmy.cn/devtools/133346.html

相关文章

Qt_day7_文件IO

目录 文件IO 1. QFileDialog 文件对话框(熟悉) 2. QFileInfo 文件信息类(熟悉) 3. QFile 文件读写类(掌握) 4. UI操作与耗时操作(掌握) 5. 多线程(掌握)…

C#界面设计

C#界面设计通常指的是使用C#编程语言及其相关的图形用户界面(GUI)框架(如Windows Forms、WPF(Windows Presentation Foundation)或Uno Platform等)来创建应用程序的用户界面。以下是一些关于C#界面设计的基…

贪心算法day05(k次取反后最大数组和 田径赛马)

目录 1.k次取反后最大化的数组和 2.按身高排序 3.优势洗牌 1.k次取反后最大化的数组和 题目链接:. - 力扣(LeetCode) 思路: 代码: class Solution {public int largestSumAfterKNegations(int[] nums, int k) {//如…

详解 Dockerfile:从入门到实践

Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖包打包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。Dockerfile 是一个文本文件,其中包含了一系列命令,用…

map映射

一、Scala的map的分类:不可变,可变 二、Scala的map的常见操作:添加元素,删除元素,查询元素,修改元素,遍历。 三、Scala的不可变map 查询有两种方法:①get方法.输入key,如果找到,就…

微信小程序运营日记(第四天)

2024年11月6日-星期三-2024年45周 {微信小程序的时间板块进行一个增加,增加:2024年第45周|共53周,星期三,今年时间剩余,本周时间剩余} 开源竞争: 开源竞争(当你无法掌握一个技术就开源这个技术…

简简单单的UDP

前言 上一篇了解了TCP的三次握手过程,目的、以及如何保证可靠性、序列号与ACK的作用,最后离开的时候四次挥手的内容,这还只是TCP内容中的冰山一角,是不是觉得TCP这个协议非常复杂,这一篇我们来了解下传输层另外一个协…

PyQt5入门级超详细教程中篇

PyQt5入门级超详细教程 中篇:信号槽机制与表格数据展示 接上篇: 第4部分:事件处理与信号槽机制 4.1 什么是信号与槽? 在 PyQt5 中,信号(Signal) 和 槽(Slot) 是处理事…