【机器学习实战】Baseline精读笔记

比赛用到的库

  1. numpy:提供(多维)数组操作

  2. pandas:提供数据结构、数据分析

  3. catboost:用于机器学习的库,特别是分类和回归任务

  4. sklearn.model_selection:包含模型选择的多种方法,如交叉验证

  5. sklearn.metrics:包含评估模型性能的多种指标,提供如accuracy_score这样的方法

  6. sklearn.feature_extraction.text:提供将文本转换为特征向量的TF-idf向量化器

  7. rdkit:化学信息学和机器学习软件,处理化学结构

  8. tqdm:用于在长循环中添加进度条的库

  9. sys:与Python解释器密切相关的模块和由解释器使用或维护的变量和函数

  10. os:提供与操作系统交互的功能

  11. gc:垃圾收集器接口:用于手动标记对象为可删除

  12. re:正则表达式库,用于字符串搜索和替换

  13. argparse:用于编写用户友好的命令行接口

  14. warnings:用于发出警告,或忽略警告。

使用到的关键的库文档链接:

numpy:NumPy 参考 — NumPy v2.0 手册

pandas:API reference — pandas 2.2.2 documentation (pydata.org)

catboost:CatBoost | CatBoost

sklearn:API Reference — scikit-learn 1.5.1 documentation

rdkit:RDKit中文教程 — RDKit 中文教程 2020.09 文档 (chenzhaoqiang.com)

sys:sys — System-specific parameters and functions — Python 3.12.4 documentation

库的导入

import numpy as np
import pandas as pd
from catboost import CatBoostClassifier
from sklearn.model_selection import StratifiedKFold, KFold, GroupKFold
from sklearn.metrics import f1_score
from rdkit import Chem
from rdkit.Chem import Descriptors
from sklearn.feature_extraction.text import TfidfVectorizer
import tqdm, sys, os, gc, re, argparse, warnings
warnings.filterwarnings('ignore') # 忽略警告

数据预处理

train = pd.read_excel('./dataset-new/traindata-new.xlsx')
test = pd.read_excel('./dataset-new/testdata-new.xlsx')# test数据不包含 DC50 (nM) 和 Dmax (%)
train = train.drop(['DC50 (nM)', 'Dmax (%)'], axis=1)# 定义了一个空列表drop_cols,用于存储在测试数据集中非空值小于10个的列名。
drop_cols = []
for f in test.columns:if test[f].notnull().sum() < 10:drop_cols.append(f)# 使用drop方法从训练集和测试集中删除了这些列,以避免在后续的分析或建模中使用这些包含大量缺失值的列
train = train.drop(drop_cols, axis=1)
test = test.drop(drop_cols, axis=1)# 使用pd.concat将清洗后的训练集和测试集合并成一个名为data的DataFrame,便于进行统一的特征工程处理
data = pd.concat([train, test], axis=0, ignore_index=True)
cols = data.columns[2:]

除此之外,数据预处理可以使用数据增强、数据清洗、手动扩充等方法。

特征工程

# 将SMILES转换为分子对象列表,并转换为SMILES字符串列表
data['smiles_list'] = data['Smiles'].apply(lambda x:[Chem.MolToSmiles(mol, isomericSmiles=True) for mol in [Chem.MolFromSmiles(x)]])
data['smiles_list'] = data['smiles_list'].map(lambda x: ' '.join(x))  # 使用TfidfVectorizer计算TF-IDF
tfidf = TfidfVectorizer(max_df = 0.9, min_df = 1, sublinear_tf = True)
res = tfidf.fit_transform(data['smiles_list'])# 将结果转为dataframe格式
tfidf_df = pd.DataFrame(res.toarray())
tfidf_df.columns = [f'smiles_tfidf_{i}' for i in range(tfidf_df.shape[1])]# 按列合并到data数据
data = pd.concat([data, tfidf_df], axis=1)# 自然数编码
def label_encode(series):unique = list(series.unique())return series.map(dict(zip(unique, range(series.nunique()))))for col in cols:if data[col].dtype == 'object':data[col]  = label_encode(data[col])train = data[data.Label.notnull()].reset_index(drop=True)
test = data[data.Label.isnull()].reset_index(drop=True)# 特征筛选
features = [f for f in train.columns if f not in ['uuid','Label','smiles_list']]# 构建训练集和测试集
x_train = train[features]
x_test = test[features]# 训练集标签
y_train = train['Label'].astype(int)

特征工程是构建一个良好的机器学习模型的关键步骤。有用的特征使得模型表现更好。

在这个特征工程中,使用了具有关键特征的简单模型,要想用最佳方式完成特征工程,必须对问题的领域有一定的了解,并且很大程度上取决于相关数据。

特征方程不仅仅是创建新特征,还包括不同类型的归一化和转换。

在这一段代码里,没有归一化流程,只有转换。

常见的归一化手段:

  • Min-Max缩放
  • Z-score标准化
  • Robust缩放

而在这段代码里:

  • SMILES转换:使用RDKit库将数据集中的SMILES字符串转换回字符串的列表。这是特征工程的一部分:这是为了便于下一步特征的提取,SMILES可以使用TF-IDF计算方法。这是一种数据预处理的手段。

  • 字符串处理:将SMILES字符串列表转换为单个字符串,每个SMILES之间用空格分隔。

  • TF-IDF计算:使用TfidfVectorizer从处理后的SMILES字符串创建TF-IDF特征矩阵,TF-IDF是一种词文本的统计学方法,用于统计词文本在文件中出现的频率,衡量该词条的重要程度。这是一种特征提取手段。

  • 自然数编码:定义了一个函数label_encode,将分类特征(对象类型)转换为整数编码。首先,它接受一个pandas Series作为输入,获取Series中的唯一值列表,然后创建一个字典,将每个唯一值映射到一个整数,最后使用这个字典将原始Series中的每个值映射到相应的整数。检测到object类型,就应用label_encode进行编码。这样的编码方式比较直观,同时符合需要顺序的特点。

  • 特征和标签准备:对于所有的特征列(cols),如果它们的数据类型是对象(通常表示为字符串),则应用自然数编码;从合并后的数据集中分离出训练集和测试集,其中训练集包含标签(Label),测试集不包含。

  • 特征和标签的筛选:由于不需要uuid、Label和smiles_list,剔除并提取标签列。

  • 数据类型转换:将Label转换为整数类型,便于训练。

模型训练与预测

def cv_model(clf, train_x, train_y, test_x, clf_name, seed=2022):kf = KFold(n_splits=5, shuffle=True, random_state=seed)train = np.zeros(train_x.shape[0])test = np.zeros(test_x.shape[0])cv_scores = []# 100, 1 2 3 4 5# 1 2 3 4    5# 1 2 3 5。  4# 1for i, (train_index, valid_index) in enumerate(kf.split(train_x, train_y)):print('************************************ {} {}************************************'.format(str(i+1), str(seed)))trn_x, trn_y, val_x, val_y = train_x.iloc[train_index], train_y[train_index], train_x.iloc[valid_index], train_y[valid_index]params = {'learning_rate': 0.1, 'depth': 6, 'l2_leaf_reg': 10, 'bootstrap_type':'Bernoulli','random_seed':seed,'od_type': 'Iter', 'od_wait': 100, 'allow_writing_files': False, 'task_type':'CPU'}model = clf(iterations=20000, **params, eval_metric='AUC')model.fit(trn_x, trn_y, eval_set=(val_x, val_y),metric_period=100,cat_features=[], use_best_model=True, verbose=1)val_pred  = model.predict_proba(val_x)[:,1]test_pred = model.predict_proba(test_x)[:,1]train[valid_index] = val_predtest += test_pred / kf.n_splitscv_scores.append(f1_score(val_y, np.where(val_pred>0.5, 1, 0)))print(cv_scores)print("%s_score_list:" % clf_name, cv_scores)print("%s_score_mean:" % clf_name, np.mean(cv_scores))print("%s_score_std:" % clf_name, np.std(cv_scores))return train, testcat_train, cat_test = cv_model(CatBoostClassifier, x_train, y_train, x_test, "cat")pd.DataFrame({'uuid': test['uuid'],'Label': np.where(cat_test>0.5, 1, 0)}
).to_csv('submit.csv', index=None)

代码定义了一个名为cv_model的函数,用于交叉验证和预测。这段代码的核心是交叉验证和CatBoost训练模型。

K折交叉验证

交叉检验是评估模型性能的常用方法。交叉检验是使用训练数据集来训练模型,然后使用测试数据集来评估模型性能。*一轮交叉验证包括将数据样本划分为互补子集,对一个子集(称为训练集)执行分析,并在另一个子集(称为验证集或测试集)上验证分析结果。为了减少可变性,在大多数方法中,使用不同的分区执行多轮交叉验证,并且在这些回合中验证结果被组合(例如,平均)以估计最终的预测模型。(引自:维基百科)*作者使用了暂留集(hold-out set)这种方法:在一部分上训练模型,然后在另一部分上检查其性能。这也是交叉检验的一种。

选择正确的交叉检验取决于所处理的数据集。在一个数据集上适用的交叉检验并不一定就适合别的数据集。

有几种交叉检验技术最为流行和广泛使用:

  • k折交叉检验

  • 分层k折交叉检验

  • 留一交叉检验

  • 分组k折交叉检验

交叉检验是将训练数据分层几个部分,在一部分上训练模型,在其余部分上测试。

得到一个数据集来构建机器学习模型时,可以把他们分为两个不同的集:训练集和验证集。训练集用来训练模型,验证集用来评估模型。实际上很多人会用第三个集:测试集,在下述代码中只使用两个集。

我们可以将数据分为k个互不关联的不同集合,即所谓的k折交叉验证。这样每一个不同的集合称为一个“褶皱”。

注意,交叉验证非常强大,几乎所有类型的数据集都可以使用此流程。

在本例Baseline里,Kfold进行了5折交叉验证。

CatBoost分类器训练模型

最大迭代次数是iterations=20000,eval_metric=‘AUC’,表示使用AUC作为评估指标。

AUC(Area Under the ROC Curve)是一种评价二分类模型性能的指标之一,ROC(Receiver Operating Characteristic)曲线是基于不同的分类阈值计算得出的,展示了在各种阈值下真阳性率(True Positive Rate,即召回率)和假阳性率(False Positive Rate)之间的权衡。

具体来说:

  • ROC 曲线:ROC 曲线是以假阳性率(FPR)为横轴,真阳性率(TPR)为纵轴绘制的曲线。在理想情况下,ROC 曲线应该尽量靠近左上角,表示在保持高真阳性率的同时,尽量低假阳性率。

  • AUC 值:AUC 值是 ROC 曲线下的面积,即 Area Under the ROC Curve。AUC 的取值范围在 0 到 1 之间,通常用来表示分类器的性能。AUC 值越大,说明模型在不同阈值下的性能越好。

接着,使用验证集val_xval_y对模型进行评估,获取预测概率val_pred。

使用测试集test_x获取测试集预测概率test_pred

F1_score(F1分数): F 1 = 2 ∗ T F 2 ∗ T F + F P + F N F1=\frac{2*TF}{2*TF+FP+FN} F1=2TF+FP+FN2TF,它是精确度和召回率的调和平均值,是衡量测试准确度的标准。可能的最高值为1,表示完美的精确度和召回率。

精准率(P,Precision):它用于衡量模型的查准性能,正确预测的样本中,预测为正的样本的比例。

召回率(R,Recall):它用于衡量模型的查全性能,预测为正的样本中,实际为正的样本的比例。

CatBoost 是一种高效的梯度提升算法(Gradient Boosting),专为处理分类特征和提高机器学习模型性能而设计。以下是 CatBoost 的主要特点和使用说明:

1. 梯度提升算法

CatBoost 属于梯度提升算法家族,通过迭代训练一组弱学习器(通常是决策树)来提高预测准确性。每一步都会根据前一步模型的错误来改进当前模型。

2. 处理分类特征

CatBoost 的一个显著优势是能够直接处理分类特征,无需将它们转换为数值形式(如独热编码)。CatBoost 采用了专门的技术来编码分类特征,简化了数据预处理过程,并且往往能提升模型性能。

3. 高性能
  • 优化的计算效率:CatBoost 进行了许多优化,能够高效地进行梯度提升训练。
  • 支持并行计算和 GPU 加速:CatBoost 支持多线程计算和 GPU 加速,能显著缩短训练时间。
4. 正则化

CatBoost 默认包含 L2 正则化等技术来防止模型过拟合,提高模型的泛化能力。

5. 兼容性

CatBoost 支持分类(如二分类、多分类)和回归任务。你可以在 CPU 或 GPU 上训练模型,适用于各种硬件配置。

CatBoost接收的主要的参数有最大迭代次数iterations,最大深度depth,学习率learning_rate(梯度学习算法中控制每棵树贡献的步长大小的参数,通常小于1),分类特征cat_features,它是一个用于指定哪些特征是分类变量的列表。CatBoost可以直接处理这些分类特征,而不依赖于数值转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/39937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 监听网络状态变化(无切换中间态版)

需求&#xff1a; 获取当前的网络状态与类型&#xff08;WIFI、数据流量&#xff09;监听网络状态真正变化监听网络类型发生变化 业务场景&#xff1a; 用户打开 App 时、使用过程中&#xff0c;出现无网络时&#xff0c;显示 Toast 提示。但当 wifi、数据流量 互相切换的过…

ppt接单渠道大公开‼️

PPT 接单主要分两种&#xff1a;PPT 模板投稿和PPT 定制接单&#xff0c;我们先从简单的 PPT 模板投稿说起。 PPT 模板投稿 利用业余时间&#xff0c;做一些 PPT 模板上传到平台&#xff0c;只要有人下载你的模板&#xff0c;你就有收入。如果模板质量高&#xff0c;简直就是一…

【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)

文章目录 定义结构Demo | 代码Subject目标类Observer抽象观察者观察者1 | CPU监听器观察者2 | 内存监听器客户端 | Client 优点适合场景 定义 所谓观察者模式就是你是被观察的那个对象&#xff0c;你爸爸妈妈就是观察者&#xff0c;一天24h盯着你&#xff0c;一旦你不听话&…

【BUUCTF-PWN】7-[第五空间2019 决赛]PWN5

参考&#xff1a;BUU pwn [第五空间2019 决赛]PWN5 //格式化字符串漏洞 - Nemuzuki - 博客园 (cnblogs.com) 格式化字符串漏洞原理详解_printf 任意内存读取-CSDN博客 32位小端排序&#xff0c;有栈溢出保护 运行效果&#xff1a; 查看main函数 存在格式化字符串漏洞 输…

SQL二次注入原理分析

二次注入在测试的时候比较少见&#xff0c;或者说很难被测出来&#xff0c;因为测的时候首先要去找注入的位置&#xff0c;其次是去判断第一次执行的SQL语句&#xff0c;然后还要去判断第二次进行调用的 SQL 语句。而关键问题就出在第二次的调用上面。 下面以一个常用过滤方法…

macos下搭建minikube dashboard的启动

背景 最近在复习一下k8s环境相关的知识&#xff0c;需要在自己电脑上搭建一个minikube的环境供自己使用。但是因为docker的镜像仓库最近被墙了&#xff0c;因此在执行minikube dashboard的时候&#xff0c;拉不到相应的镜像&#xff0c;就导致页面看不到相应的一些信息因此本文…

【PYG】dataloader和densedataloader

DenseDataLoader 是专门用于处理稠密图数据的&#xff0c;而 DataLoader 通常用于处理稀疏图数据。两者的主要区别在于它们的输入数据格式和处理方式。DenseDataLoader 适合处理固定大小的邻接矩阵和节点特征矩阵的数据&#xff0c;而 DataLoader 更加灵活&#xff0c;可以处理…

flask中解决图片不显示的问题(很细微的点)

我在编写flask项目的时候&#xff0c;在编写html的时候&#xff0c;发现不管我的图片路径如何变化&#xff0c;其就是显示不出来。如下图我框中的地方。 我尝试过使用浏览器打开&#xff0c;是可以的。 一旦运行这个flask项目&#xff0c;就无法显示了。 我查阅资料后。发现…

简易版async/await

参考&#xff1a;https://juejin.cn/post/7007031572238958629?searchId20240704101813568E9B5B1013C881A239#heading-15 总结一下async/await的知识点 1、 await只能在async函数中使用&#xff0c;不然会报错 2、 async函数返回的是一个Promise对象&#xff0c;有无值看有…

泛微开发修炼之旅--29用计划任务定时发送邮件提醒

文章链接&#xff1a;29用计划任务定时发送邮件提醒

[单master节点k8s部署]17.监控系统构建(二)Prometheus安装

prometheus server安装 创建sa账号&#xff0c;对prometheus server进行授权。因为Prometheus是安装在pod里面&#xff0c;以pod的形式去运行的&#xff0c;因此需要创建sa&#xff0c;并对他做rbac授权。 apiVersion: v1 kind: ServiceAccount metadata:name: monitornamesp…

k8s-第九节-命名空间

命名空间 如果一个集群中部署了多个应用&#xff0c;所有应用都在一起&#xff0c;就不太好管理&#xff0c;也可以导致名字冲突等。 我们可以使用 namespace 把应用划分到不同的命名空间&#xff0c;跟代码里的 namespace 是一个概念&#xff0c;只是为了划分空间。 # 创建命…

LeetCode热题100刷题4:76. 最小覆盖子串、239. 滑动窗口最大值、53. 最大子数组和、56. 合并区间

76. 最小覆盖子串 滑动窗口解决字串问题。 labuladong的算法小抄中关于滑动窗口的算法总结&#xff1a; class Solution { public:string minWindow(string s, string t) {unordered_map<char,int> need,window;for(char c : t) {need[c];}int left 0, right 0;int …

2.8亿东亚五国建筑数据分享

数据是GIS的血液&#xff01; 我们现在为你分享东亚5国的2.8亿条建筑轮廓数据&#xff0c;该数据包括中国、日本、朝鲜、韩国和蒙古5个东亚国家完整、高质量的建筑物轮廓数据&#xff0c;你可以在文末查看领取方法。 数据介绍 虽然开源的全球的建筑数据已经有微软的建筑数据…

elementUI中table组件固定列时会渲染两次模板内容问题

今天在使用elementUI的table组件时&#xff0c;由于业务需要固定表格的前几项列&#xff0c;然后获取表格对象时发现竟然有两个对象。 查阅资料发现&#xff0c;elementUI的固定列的实现原理是将两个表格拼装而成&#xff0c;因此获取的对象也是两个。对于需要使用对象的方法的…

vxe-table的序号一样

使用vxe-table的时候&#xff0c;有的时候会出现序号相同的现象&#xff0c;这种现象一般出现在我们后面自己添加的行中&#xff0c;就像这种 此时的这三个序号是相同的&#xff0c;我来说一下原因&#xff0c;这是在添加新的一行的时候&#xff0c;有的时候数据很多&#xff0…

Mac 运行 Windows 软件,Parallels Desktop 19和 CrossOver 24全面对比

Parallels Desktop 和 CrossOver 都是能满足你「在 Mac 上运行 Windows 软件」需求的工具。可能很多人都已经知道 Parallels Desktop 是「虚拟机」&#xff0c;但 CrossOver 其实并不是「虚拟机」。这两款软件有相同的作用&#xff0c;但由于实现原理的不同&#xff0c;两者也有…

系统提示我未定义与 ‘double‘ 类型的输入参数相对应的函数 ‘finverse‘,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Kubernetes 部署简单的应用

Kubernetes 部署简单的应用 Kubernetes 是一个强大的容器编排平台&#xff0c;它可以帮助我们自动化应用程序的部署、扩展和管理。在本期文章中&#xff0c;我们将学习如何使用 Kubernetes 部署一个简单的应用程序。 1. 环境准备 确保你已经安装了 Kubernetes 集群&#xff…

【python模块】argparse

文章目录 argparse模块介绍基本用法add_argument() argparse模块介绍 argparse 模块是 Python 标准库中的一个用于编写用户友好的命令行接口&#xff08;CLI&#xff09;的模块。它允许程序定义它所需要的命令行参数&#xff0c;然后 argparse 会自动从 sys.argv 解析出那些参…