合肥做网站域名的公司,太原免费建站,国内专业网站建设,网页制作模板的网站免费比赛用到的库 numpy#xff1a;提供#xff08;多维#xff09;数组操作 pandas#xff1a;提供数据结构、数据分析 catboost#xff1a;用于机器学习的库#xff0c;特别是分类和回归任务 sklearn.model_selection#xff1a;包含模型选择的多种方法#xff0c;如交…比赛用到的库 numpy提供多维数组操作 pandas提供数据结构、数据分析 catboost用于机器学习的库特别是分类和回归任务 sklearn.model_selection包含模型选择的多种方法如交叉验证 sklearn.metrics包含评估模型性能的多种指标提供如accuracy_score这样的方法 sklearn.feature_extraction.text提供将文本转换为特征向量的TF-idf向量化器 rdkit化学信息学和机器学习软件处理化学结构 tqdm用于在长循环中添加进度条的库 sys与Python解释器密切相关的模块和由解释器使用或维护的变量和函数 os提供与操作系统交互的功能 gc垃圾收集器接口用于手动标记对象为可删除 re正则表达式库用于字符串搜索和替换 argparse用于编写用户友好的命令行接口 warnings用于发出警告或忽略警告。 使用到的关键的库文档链接 numpyNumPy 参考 — NumPy v2.0 手册 pandasAPI reference — pandas 2.2.2 documentation (pydata.org) catboostCatBoost | CatBoost sklearnAPI Reference — scikit-learn 1.5.1 documentation rdkitRDKit中文教程 — RDKit 中文教程 2020.09 文档 (chenzhaoqiang.com) syssys — 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 (%)], axis1)# 定义了一个空列表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, axis1)
test test.drop(drop_cols, axis1)# 使用pd.concat将清洗后的训练集和测试集合并成一个名为data的DataFrame便于进行统一的特征工程处理
data pd.concat([train, test], axis0, ignore_indexTrue)
cols data.columns[2:]除此之外数据预处理可以使用数据增强、数据清洗、手动扩充等方法。
特征工程
# 将SMILES转换为分子对象列表,并转换为SMILES字符串列表
data[smiles_list] data[Smiles].apply(lambda x:[Chem.MolToSmiles(mol, isomericSmilesTrue) 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 [fsmiles_tfidf_{i} for i in range(tfidf_df.shape[1])]# 按列合并到data数据
data pd.concat([data, tfidf_df], axis1)# 自然数编码
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(dropTrue)
test data[data.Label.isnull()].reset_index(dropTrue)# 特征筛选
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, seed2022):kf KFold(n_splits5, shuffleTrue, random_stateseed)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(i1), 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(iterations20000, **params, eval_metricAUC)model.fit(trn_x, trn_y, eval_set(val_x, val_y),metric_period100,cat_features[], use_best_modelTrue, verbose1)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_pred0.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_test0.5, 1, 0)}
).to_csv(submit.csv, indexNone)代码定义了一个名为cv_model的函数用于交叉验证和预测。这段代码的核心是交叉验证和CatBoost训练模型。
K折交叉验证
交叉检验是评估模型性能的常用方法。交叉检验是使用训练数据集来训练模型然后使用测试数据集来评估模型性能。*一轮交叉验证包括将数据样本划分为互补子集对一个子集称为训练集执行分析并在另一个子集称为验证集或测试集上验证分析结果。为了减少可变性在大多数方法中使用不同的分区执行多轮交叉验证并且在这些回合中验证结果被组合例如平均以估计最终的预测模型。引自维基百科*作者使用了暂留集(hold-out set)这种方法在一部分上训练模型然后在另一部分上检查其性能。这也是交叉检验的一种。
选择正确的交叉检验取决于所处理的数据集。在一个数据集上适用的交叉检验并不一定就适合别的数据集。
有几种交叉检验技术最为流行和广泛使用 k折交叉检验 分层k折交叉检验 留一交叉检验 分组k折交叉检验
交叉检验是将训练数据分层几个部分在一部分上训练模型在其余部分上测试。
得到一个数据集来构建机器学习模型时可以把他们分为两个不同的集训练集和验证集。训练集用来训练模型验证集用来评估模型。实际上很多人会用第三个集测试集在下述代码中只使用两个集。
我们可以将数据分为k个互不关联的不同集合即所谓的k折交叉验证。这样每一个不同的集合称为一个“褶皱”。
注意交叉验证非常强大几乎所有类型的数据集都可以使用此流程。
在本例Baseline里Kfold进行了5折交叉验证。
CatBoost分类器训练模型
最大迭代次数是iterations20000eval_metric‘AUC’表示使用AUC作为评估指标。 AUCArea Under the ROC Curve是一种评价二分类模型性能的指标之一ROCReceiver 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_x和val_y对模型进行评估获取预测概率val_pred。
使用测试集test_x获取测试集预测概率test_pred。 F1_scoreF1分数 F 1 2 ∗ T F 2 ∗ T F F P F N F1\frac{2*TF}{2*TFFPFN} F12∗TFFPFN2∗TF它是精确度和召回率的调和平均值是衡量测试准确度的标准。可能的最高值为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可以直接处理这些分类特征而不依赖于数值转换。