如何转换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
相关产品推荐
相关产品推荐

