特征工程技巧——OneHot编码

news2025/7/9 20:48:08

我们以Kaggle比赛里面的一个数据集跟一个公开代码为例去解释我们的OneHot编码。

简单来说,独热编码是一种将类别型变量转换为二进制表示的方法,其中每个类别被表示为一个向量,向量的长度等于类别的数量,其中只有一个元素为1,其余元素为0。例如,如果有三个类别(A、B、C),则独热编码可能如下所示:

  • A: [1, 0, 0]
  • B: [0, 1, 0]
  • C: [0, 0, 1]

独热编码的主要优点是它将类别之间的关系消除,使得数据更适合用于机器学习算法,因为它避免了算法误认为类别之间存在顺序或距离关系。

训练集

测试集

 1、导入我们相应的包

!pip install rdkit

RDKit是一个开源的化学信息学工具包,用于分子建模和化学信息处理。它提供了一系列功能强大的工具,可以用于分子描述符计算、药物设计、虚拟筛选、化学信息的可视化等任务。

!pip install duckdb

DuckDB是一个嵌入式的SQL数据库管理系统(DBMS),旨在提供高性能的数据查询和分析。它主要用于处理大规模数据集和分析任务,并且可以与现有的数据科学工具和应用程序集成。

2、数据准备

import duckdb
import pandas as pd

train_path = '/kaggle/input/leash-predict-chemical-bindings/train.parquet'
test_path = '/kaggle/input/leash-predict-chemical-bindings/test.parquet'

con = duckdb.connect()

df = con.query(f"""(SELECT *
                        FROM parquet_scan('{train_path}')
                        WHERE binds = 0
                        ORDER BY random()
                        LIMIT 30000)
                        UNION ALL
                        (SELECT *
                        FROM parquet_scan('{train_path}')
                        WHERE binds = 1
                        ORDER BY random()
                        LIMIT 30000)""").df()

con.close()
  • 这部分代码连接到了一个DuckDB数据库,并从训练数据的parquet文件中获取数据。它选择了相等数量的绑定(binds=1)和非绑定(binds=0)的样本,以避免模型对某一类别的偏好。
  • 查询语句将绑定为0和绑定为1的样本合并到一个DataFrame中,每个类别各30000个样本。最终的DataFrame包含了分子数据以及其对应的标签。
  • con.query() 用于执行 SQL 查询,该查询从指定的 .parquet 文件中检索数据。
  • con.close()是用于关闭与数据库的连接,它的作用是释放资源并断开与数据库的通信连接。在使用数据库时,连接是有限资源,因此在不再需要连接时应该显式地关闭它,以释放资源并避免资源泄露。

2、特征预处理

  • from rdkit import Chem
    from rdkit.Chem import AllChem
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import average_precision_score
    from sklearn.preprocessing import OneHotEncoder
    import xgboost as xgb
    
    # Convert SMILES to RDKit molecules
    df['molecule'] = df['molecule_smiles'].apply(Chem.MolFromSmiles)
    
    # Generate ECFPs
    def generate_ecfp(molecule, radius=2, bits=1024):
        if molecule is None:
            return None
        return list(AllChem.GetMorganFingerprintAsBitVect(molecule, radius, nBits=bits))
    
    df['ecfp'] = df['molecule'].apply(generate_ecfp)
  • 这部分代码使用RDKit库将SMILES字符串转换为RDKit的分子对象,并定义了一个函数generate_ecfp来生成ECFP特征

  • generate_ecfp函数计算了每个分子的ECFP特征,并将其作为新的特征列添加到DataFrame中。

3、模型训练

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# One-hot encode the protein_name
onehot_encoder = OneHotEncoder(sparse_output=False)
protein_onehot = onehot_encoder.fit_transform(df['protein_name'].values.reshape(-1, 1))

# Combine ECFPs and one-hot encoded protein_name
X = [ecfp + protein for ecfp, protein in zip(df['ecfp'].tolist(), protein_onehot.tolist())]
y = df['binds'].tolist()

# Split the data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Create and train the random forest model
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
  • 这部分代码使用随机森林分类器对数据进行训练。首先,使用 fit_transform 方法对DataFrame中的 'protein_name' 列进行编码,并将结果存储在 protein_onehot 中。对蛋白质名称进行了独热编码.values.reshape(-1, 1)这部分代码将选定的列中的数据转换为 NumPy 数组,并对其进行重塑,将其变成一个列向量。.values 将 DataFrame 列转换为 NumPy 数组,.reshape(-1, 1) 将数组重塑为一个列向量,其中 -1 表示未知的行数,而 1 表示只有一列。
  • 通过使用列表推导式,将每个ECFPs特征向量和对应的独热编码蛋白质名称逐一组合,并将结果存储在 X 中,作为模型的输入特征。
  • 训练数据被划分为训练集和验证集,并使用随机森林模型进行训练。
  • random_state=42 用于设置随机种子,保证划分的结果可以重现。

4、模型评估

from sklearn.metrics import average_precision_score

# Make predictions on the test set
y_pred_proba = rf_model.predict_proba(X_test)[:, 1]  # Probability of the positive class

# Calculate the mean average precision
map_score = average_precision_score(y_test, y_pred_proba)
print(f"Mean Average Precision (mAP): {map_score:.2f}")
  • 这部分代码使用训练好的随机森林模型在测试集上进行预测,得到了每个样本属于正类的概率,并将结果存储在 y_pred_proba 中。
  • 这部分代码用测试集上的预测结果评估了模型的性能。使用平均精度(Average Precision)评估模型在验证集上的性能。

5、测试预测

import os

# Process the test.parquet file chunk by chunk
test_file = '/kaggle/input/leash-predict-chemical-bindings/test.csv'
output_file = 'submission.csv'

# Read the test.parquet file into a pandas DataFrame
for df_test in pd.read_csv(test_file, chunksize=100000):

    # Generate ECFPs for the molecule_smiles
    df_test['molecule'] = df_test['molecule_smiles'].apply(Chem.MolFromSmiles)
    df_test['ecfp'] = df_test['molecule'].apply(generate_ecfp)

    # One-hot encode the protein_name
    protein_onehot = onehot_encoder.transform(df_test['protein_name'].values.reshape(-1, 1))

    # Combine ECFPs and one-hot encoded protein_name
    X_test = [ecfp + protein for ecfp, protein in zip(df_test['ecfp'].tolist(), protein_onehot.tolist())]

    # Predict the probabilities
    probabilities = rf_model.predict_proba(X_test)[:, 1]

    # Create a DataFrame with 'id' and 'probability' columns
    output_df = pd.DataFrame({'id': df_test['id'], 'binds': probabilities})

    # Save the output DataFrame to a CSV file
    output_df.to_csv(output_file, index=False, mode='a', header=not os.path.exists(output_file))

这部分代码用训练好的随机森林模型对测试数据进行预测,并将结果保存到CSV文件中。

代码地址:Leash Tutorial - ECFPs and Random Forest | Kaggle

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

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

相关文章

STM32使用ST-LINK下载程序中需要注意的几点

使用keil5的ST-link下载界面 前提是ST-LINK已经连接好,(下图中是没有连接ST-link设备),只是为了展示如何查看STlink设备是否连接的方式 下载前一定设置下载完成后自启动 这个虽然不是必须,但对立即看到新程序的现象…

基于Chisel语言的FPGA流水灯程序

目录 一、 内容概要二、 Chisel介绍三、 Chisel的使用四、 流水灯实现五、 心得体会六、 参考链接 一、 内容概要 Chisel介绍Chisel使用流程Chisel流水灯实操 二、 Chisel介绍 Chisel 是一种构建硬件描述语言(HDL)的高级编程语言,它允许硬…

2020年CSP-J入门级第一轮初赛真题

一、选择题 在内存储器中每个存储单元都被赋予一个唯一的序号,称为()。 A.地址 B. 序号 C. 下标 D. 编号 答案:A. 地址 在内存储器中,每个存储单元都有一个唯一的标识,用于区分和访问不同的存储单元。这个唯…

Day10:平面转换、渐变色

目标:使用位移、缩放、旋转、渐变效果丰富网页元素的呈现方式。 一、平面转换 1、简介 作用:为元素添加动态效果,一般与过渡配合使用。 概念:改变盒子在平面内的形态(位移、旋转、缩放、倾斜)。 平面转换…

C语言(字符和字符串函数)2

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记,在这里撰写成文一…

今日分享丨按场景定制界面

遇到问题 我们在写文档或者代码时,会遇到需要书写重复或者类似内容的情况。快捷的做法是:先复制粘贴此相似内容,再修改差异。那么开发人员在设计界面的时候,也会遇到同类型的界面有重复的特性,比如报销类型的单据&…

PostgreSQL常用插件

PostgreSQL 拥有许多常用插件,这些插件可以大大增强其功能和性能。以下是一些常用的 PostgreSQL 插件: 性能监控和优化 pg_stat_statements 1.提供对所有 SQL 语句执行情况的统计信息。对调优和监控非常有用。 2.安装和使用: pg_stat_k…

picoLLM:大模型的量化魔术师 上

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调重新阅读。而最新科技(Mamba,xLSTM,KAN)则提供了大模…

数字孪生在气象灾害防治中的重要贡献

数字孪生技术在气象灾害防治中正发挥着越来越重要的作用。数字孪生是指通过数字化方式在虚拟空间中构建与现实世界对应的虚拟模型,通过实时数据和模拟技术进行动态映射和交互。利用数字孪生技术,气象部门可以更高效、更精准地监测、预测和应对气象灾害&a…

四川景源畅信:抖音开店怎么做好运营?

在数字化时代的浪潮中,抖音作为一个流量巨大的社交平台,为许多商家提供了展示和销售产品的新舞台。但在这个充满竞争的平台上,如何做好店铺运营,吸引并留住顾客,成为了许多商家面临的挑战。接下来的内容将围绕如何在抖…

我与C++的爱恋:vector的使用

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:我与C的爱恋 ​ 文章目录 一、vector的简单介绍二、vector的使用构造函数遍历容器对容器的操作vector 的增删查改 一、vector的简单介绍 vector是表示可变大小数组的序列容器 就像数组…

去噪扩散概率模型在现代技术中的应用:图像生成、音频处理到药物发现

去噪扩散概率模型(DDPMs)是一种先进的生成模型,它通过模拟数据的噪声化和去噪过程,展现出多方面的优势。DDPMs能够生成高质量的数据样本,这在图像合成、音频生成等领域尤为重要。它们在数据去噪方面表现出色&#xff0…

打开C语言常用的内存函数大门(二)—— memmove()函数 (内含memmove的讲解和模拟实现)

文章目录 1. 前言2. memmove()函数2.1 memmove()函数与memcpy()函数的差异2.2 memmove()函数的原型2.3 memmove()函数的使用案例 3. memmove()函数的模拟实现4. 总结 1. 前言 在之前,我向大家介绍了C语言中的一个常用的内存函数memcpy函数。如果你还没看的话&#…

算法(十一)贪婪算法

文章目录 算法简介算法概念算法举例 经典问题 -背包问题 算法简介 算法概念 贪婪算法(Greedy)是一种在每一步都采取当前状态下最好的或者最优的选择,从而希望导致结果也是全局最好或者最优的算法。贪婪算法是当下局部的最优判断&#xff0c…

【UnityShader入门精要学习笔记】第十六章 Unity中的渲染优化技术 (下)

本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更,有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 减少需要处…

报表工具DataEase技术方案(一)

一、使用场景: 企业内部系统想要快速接入报表功能,但是局限于人力资源不足,不想沿用传统的前端后端开发模式,可以尝试使用开源报表工具 DataEase。 二、架构设计: 使用最简便的报表集成方式,通过DataEase…

越洗越黑”的Pandas数据清洗

引言 先来一个脑筋急转弯活跃一下枯燥工作日常,问:“什么东西越洗越黑?” 有没有猜到的?猜不到我告诉你吧! 答案是“煤球”。那么这个脑机急转弯跟我们要讨论的话题有没有关系呢? 嗯是的,还是沾…

2024年大屏幕互动源码+动态背景图和配乐素材+搭建教程

2024年大屏幕互动源码动态背景图和配乐素材搭建教程 php宝塔搭建部署活动现场大屏幕互动系统php源码 运行环境:PHPMYSQL 下载源码地址:极速云

Leetcode刷题笔记7

69. x 的平方根 69. x 的平方根 - 力扣(LeetCode) 假设求17的平方根 解法一:暴力解法 从1开始依次尝试 比如1的平方是1,2的平方是4...直到5的平方,25>17,所以一定是4点几的平方,所以等于4…

打家劫舍I 打家劫舍II (leetcode)

个人主页:Lei宝啊 愿所有美好如期而遇 打家劫舍Ihttps://leetcode.cn/problems/Gu0c2T/打家劫舍IIhttps://leetcode.cn/problems/PzWKhm/ 状态转移方程就是这样的: i位置选择偷f[i]:f[i] g[i-1] nums[i];i位置选择不偷g[i]:g…