You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将分类值转为数值并同步至原数据集,及HCV数据集建模咨询

问题与解决方案

问题概述

我有13列的HCV数据集,想把'Category'列作为预测目标,其余列作为特征用于训练。已尝试将'Sex'列的分类值(m/f)转为数值(1/0),但转换后原数据集未发生变化,同时不清楚后续操作步骤,也不确定是否要将所有object类型列放入测试集,希望了解该数据集的最优训练测试方案。

解决数值转换不生效的问题

你当前的代码只是把转换后的Sex列存在了sex_new变量里,没有替换回原数据集df_,所以原数据集不会有变化。两种修改方式:

# 方式1:直接在原列上完成转换
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
df_['Sex'] = le.fit_transform(df_['Sex'])

# 方式2:将已转换的sex_new替换回原数据集
df_['Sex'] = sex_new['Sex']

执行后查看df_['Sex'].unique(),就能看到原数据集的Sex列已经变成数值型。

训练集/测试集的正确划分逻辑

你之前的表述存在混淆:不是把单独一列作为测试集,而是要把整个数据集划分为「训练集」和「测试集」两部分,其中:

  • 所有列(除了'Category')是特征(X):用来输入模型学习规律
  • 'Category'是目标变量(y):模型要预测的结果

用sklearn的train_test_split完成划分(示例按8:2比例拆分):

from sklearn.model_selection import train_test_split

# 定义特征和目标
X = df_.drop('Category', axis=1)
y = df_['Category']

# 划分训练集和测试集,random_state保证结果可复现
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

关于object类型列的处理

不需要把所有object列放入测试集,而是要对所有分类特征(object类型)做数值化处理——因为机器学习模型只能处理数值数据:

  1. 先查看所有列的类型:
print(df_.dtypes)
  1. 比如该数据集中的'Category'本身也是object类型(包含'0=Blood Donor'等分类),作为目标变量,同样可以用LabelEncoder转换:
y = le.fit_transform(y)

如果是多分类任务,也可以用OneHotEncoder,但LabelEncoder更适合目标变量的处理。

HCV数据集的最优训练建议

  1. 缺失值处理:先检查并处理缺失值:
# 查看各列缺失值数量
print(df_.isnull().sum())
# 用中位数填充数值型缺失值
df_['ALP'] = df_['ALP'].fillna(df_['ALP'].median())
# 或者直接删除缺失行
df_ = df_.dropna()
  1. 特征标准化:数值特征(如Age、ALB、ALP等)尺度差异大,建议做标准化,提升模型收敛速度和效果:
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
# 只在训练集上拟合,避免数据泄露
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
  1. 模型选择与评估:这是分类任务,先从基础模型入手,再尝试复杂模型:
# 示例:随机森林分类器
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report

model = RandomForestClassifier(random_state=42)
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)

# 查看评估指标
print(f"准确率: {accuracy_score(y_test, y_pred)}")
print(classification_report(y_test, y_pred))
  1. 类别不平衡优化:检查目标变量的分布,如果类别不平衡(比如献血者样本远多于患者),可以通过类权重调整或过采样优化:
# 查看类别分布
print(df_['Category'].value_counts())
# 训练模型时指定类权重
model = RandomForestClassifier(class_weight='balanced', random_state=42)

内容的提问来源于stack exchange,提问作者adstrumm_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:45:38