【机器学习实战】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
    # 1
    for 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_pred
        test += test_pred / kf.n_splits
        cv_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, test

cat_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.mfbz.cn/a/773238.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣206

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输…

flask的进阶使用方法

【 一 】一对多关系 # 1 一对一 [本质就是一对多--》多的那个唯一] # 2 一对多 # 3 多对多1.1 关系 #### 一对多关系 class Hobby(Base):__tablename__ hobbyid Column(Integer, primary_keyTrue)caption Column(String(50), default篮球)def __str__(self):return sel…

vue中一周的时间选择多个阶段(手动表格选择)

先给大家看一下效果图 源代码 <template><div style"width: 45%"><div style"width: 100%"><div class"time"><div class"timeleft">星期/时间</div><div class"timeright"><…

算法金 | 我最常用的两个数据可视化软件,强烈推荐

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 抱个拳&#xff0c;送个礼 预警&#xff1a;今天文章的描述可能会让你有点别扭&#xff1b;如感到不适&#xff0c;请及时停止 在我行…

macos下搭建minikube dashboard的启动

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

如何用手机拍出高级感黑白色调照片?华为Pura70系列XMAGE演绎黑白艺术

在影像的世界里&#xff0c;色彩可以让画面更丰富&#xff0c;更具有表现力&#xff0c;往往也能带来更多的视觉冲击。但有时候&#xff0c;黑白却有着一种独特的魅力。华为Pura 70系列XMAGE黑白风格&#xff0c;则给我们了一把通过纯粹艺术大门的钥匙。 XMAGE黑白并非简单的色…

2024 年第十四届 APMCM 亚太地区大学生数学建模A题 飞行器外形的优化问题--完整思路代码分享(仅供学习)

飞行器是在大气层内或大气层外空间飞行的器。飞行器可以分为:航空器航天器、火箭和导弹。在大气层内飞行的称为航空器&#xff0c;如气球、飞艇、飞机等。它们靠空气的静浮力或空气相对运动产生的空气动力升空飞行。在太空飞行的称为航天器&#xff0c;如人造地球卫星、载人飞船…

05-《猪笼草》

猪笼草 猪笼草是猪笼草属全体物种的总称。属于热带食虫植物&#xff0c;原产地主要为旧大陆热带地区。其拥有一个独特的吸取营养的器官——捕虫笼&#xff0c;捕虫笼呈圆筒形&#xff0c;下半部稍膨大&#xff0c;笼口上具有盖子&#xff0c;因其形状像猪笼而得名。 猪笼草 形…

开源协作wiki和文档软件Docmost

什么是 Docmost &#xff1f; Docmost 是一款开源协作 wiki 和文档软件。它是 Confluence 和 Notion 等软件的开源替代品。使用 Docmost 可以无缝创建、协作和共享知识。非常适合管理您的 wiki、知识库、文档等。目前 Docmost 处于测试阶段。 软件的主要特点 安装 在群晖上以 …

从OpenAI停服看中国市场:国产替代崛起的机遇与挑战

一、OpenAI 停服事件背景 OpenAI 自 2020 年推出 GPT-3 以来&#xff0c;在全球范围内引起了极大的反响。其强大的自然语言处理能力使其成为许多企业和开发者的首选工具。然而&#xff0c;2024 年 6 月 25 日&#xff0c;许多中国用户收到了一封来自 OpenAI 的邮件&#xff0c…

《地平线开发板小技巧》-- 备份与恢复SD卡镜像

在我们的机器人系统开发过程中&#xff0c;需要提前安装配置操作系统和依赖项&#xff0c;将这些依赖全部安装完成后&#xff0c;将系统镜像备份。在之后的系统安装中只要将备份好的镜像烧录进开发板中&#xff0c;岂不快哉~ 下面讲的便是地地平线开发板中镜像备份与恢复过程 …

人脸识别考勤系统

人脸识别考勤系统是一种利用生物识别技术进行自动身份验证的现代解决方案&#xff0c;它通过分析和比对人脸特征来进行员工的出勤记录。这种系统不仅提升了工作效率&#xff0c;还大大减少了人为错误和欺诈行为的可能性。 一、工作原理 人脸识别考勤系统的核心在于其生物识别…

Vue3进度条nprogress(手机端、PC端通用)

Vue3进度条nprogress是一个用于显示页面加载进度的库。要在Vue3项目中使用nprogress&#xff0c;需要先安装它&#xff0c;然后在你的项目中引入和使用。 安装nprogress npm install nprogress --save配置nprogress 在目录src下创建nprogress文件夹&#xff0c;里面创建nprogr…

Python面试宝典第6题:有效的括号

题目 给定一个只包括 (、)、{、}、[、] 这些字符的字符串&#xff0c;判断该字符串是否有效。有效字符串需要满足以下的条件。 1、左括号必须用相同类型的右括号闭合。 2、左括号必须以正确的顺序闭合。 3、每个右括号都有一个对应的相同类型的左括号。 注意&#xff1a;空字符…

九浅一深Jemalloc5.3.0 -- ⑨浅*gc

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。 另外&#xff0c;单讲实现代码是极其枯燥的&#xff0c;…

拆解COLA框架

COLA 是 Clean Object-Oriented and Layered Architecture的缩写&#xff0c;代表“整洁面向对象分层架构”。由阿里大佬张建飞所提出的一种基于DDD和代码整洁理论所诞生的实践理论框架&#xff0c;详细内容可阅读《程序员的底层思维》和相关git代码去了解 项目地址&#xff1a…

在地图上根据经纬度,画一个矩型围栏,设置每个点的经纬度

在做一个需求时有一个小点就是添加一个配送区域(5公里直径内的)矩形围栏 我做的比较简单 大家看看有没有帮助, 也是精简代码。测试效果上相对是精准的 //谷歌&#xff0c;根据经纬度获取以它为中心半径为5公里内的矩形的四个点经纬度getDefalutPoints (lng: number, lat: num…

lt6911UXC 国产原装 高性能HDMI2.0转MIPI DSI / CSI芯片方案 提供LT 开发资料包及在线软硬件技术支持!

1.说明 LT6911UXC是一款高性能HDMI2.0到MIPI DSI / CSI转换器&#xff0c;用于VR&#xff0c;智能电话&#xff0c;显示应用。 HDMI2.0输入支持高达6Gbps的数据速率&#xff0c;从而为4k 60Hz视频提供足够的带宽。还支持HDCP2.2进行数据解密。 对于MIPI DSI / CSI输出&#xf…

企业数据API平台:获取企业多维度信息

数据API平台是指提供一系列预先定义的接口、协议与工具&#xff0c;允许不同应用程序或系统之间进行数据交换和通信的平台。这些接口被称为数据API&#xff08;Data Application Programming Interface&#xff09;&#xff0c;是数据管理系统或应用程序提供的一组开放式接口。…

Linux手动安装JDK1.8

1、下载要安装的jdk安装包文件 官网下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/ 2、上传jdk安装包至要安装服务器 3、在要安装jdk位置使用命令解压安装包 安装路径: /usr/local/java 解压安装包&#xff0c;解压命令 tar -zxvf /install…