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

如何转换Pandas DataFrame列以适配SVC等算法的二元分类

把回归任务转成二元分类的具体步骤

首先别担心,把回归转成分类其实就是给每个样本打个明确的二元标签——告诉模型“这行数据属于Sample1,那行属于Sample2”,之后的流程就和常规分类任务一致了。我给你拆解成具体可落地的步骤:

1. 先搞定二元标签的生成

这一步是核心,你需要根据Sample1和Sample2列的实际含义,确定每行数据的类别归属,生成一个单独的标签列。常见的两种场景对应不同的处理方式:

场景A:Sample1/Sample2是二选一的标记列(比如One-Hot形式)

如果你的DataFrame里,Sample1列值为1表示该行属于Sample1,0表示不属于;Sample2列则相反(互斥),那直接生成标签列就行:

# 生成字符串标签(直观易读)
df['label'] = df.apply(lambda row: 'Sample1' if row['Sample1'] == 1 else 'Sample2', axis=1)

# 或者生成数值标签(Sklearn模型更偏好,计算效率更高)
df['label'] = df['Sample1'].astype(int)  # 因为Sample1=1时Sample2必然是0,直接用Sample1列当0/1标签

场景B:Sample1/Sample2是对应样本的测量值(比如强度、峰值)

如果这两列是同一特征在两个样本中的数值(比如某峰在Sample1的强度是Sample1列的值,Sample2同理),那你需要先定义分类规则——比如哪个样本的数值更高就归为哪个类别,或者根据业务需求设定阈值:

# 示例:以Sample1和Sample2的数值大小判断归属
df['label'] = df.apply(lambda row: 'Sample1' if row['Sample1'] > row['Sample2'] else 'Sample2', axis=1)

# 如果有业务阈值,比如Sample1的强度超过500才算Sample1,否则是Sample2
# df['label'] = df.apply(lambda row: 'Sample1' if row['Sample1'] > 500 else 'Sample2', axis=1)

如果需要把字符串标签转成模型更友好的数值(0/1),可以用LabelEncoder做映射:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['label'] = le.fit_transform(df['label'])
# 之后可以用le.classes_查看标签映射关系:比如输出['Sample1', 'Sample2'],对应0和1

2. 划分特征与标签,准备模型输入

接下来把你的特征列(intensity、mzmin、mzmax等)和新生成的标签列分开:

# 替换成你所有的特征列名称
X = df[['intensity', 'mzmin', 'mzmax']]
y = df['label']

3. 训练SVC(或其他分类模型)

SVC对特征的尺度很敏感,所以一定要先做标准化处理,然后划分训练测试集开始训练:

from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 特征标准化(SVC必须步骤,不然结果会偏差很大)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 初始化并训练SVC模型
svc_model = SVC(kernel='rbf')  # 常用rbf核,你也可以试试linear等
svc_model.fit(X_train_scaled, y_train)

# 预测并评估效果
y_pred = svc_model.predict(X_test_scaled)
print(f"模型准确率: {accuracy_score(y_test, y_pred):.2f}")

几个关键注意点

  • 避免特征泄漏:生成标签后,记得把Sample1和Sample2列从特征X中移除(如果它们不是特征的话),不然模型会直接通过这两列“作弊”预测。
  • 检查标签平衡性:如果Sample1和Sample2的样本数量差距很大(比如9:1),可以考虑用欠采样、过采样或者调整模型的class_weight参数(比如SVC的class_weight='balanced')。
  • 尝试其他模型:除了SVC,你也可以试试逻辑回归、RandomForestClassifier等,对比不同模型的效果。

内容的提问来源于stack exchange,提问作者Chigure Sacred Dances

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:11:06