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

Pandas过滤Object类型目标列及构建四类分类器的技术问询

Pandas过滤与多分类器构建指南

针对你的100000行×200列数据集,我来一步步帮你解决过滤和分类的问题:

第一步:用Pandas过滤目标行

因为你的目标列names是字符串类型,要保留指定的4个类别,最高效且简洁的方法是使用isin()方法——尤其适合处理大数据集,性能表现很好。

具体代码:

import pandas as pd

# 假设你的数据集已经加载为df
df = pd.read_csv("your_dataset.csv")  # 替换成你的数据加载方式

# 定义需要保留的目标名称列表
target_names = ['John', 'Mary', 'Chris', 'Anna']

# 执行过滤,生成新的数据集(推荐用新变量,避免修改原数据)
filtered_df = df[df['names'].isin(target_names)].copy()

可选的替代写法:

如果你偏爱SQL风格的语法,可以用query()方法,代码更直观:

filtered_df = df.query("names in ['John', 'Mary', 'Chris', 'Anna']").copy()

验证过滤结果:

过滤后可以检查一下是否只有目标类别:

print(filtered_df['names'].unique())
# 输出应该是 array(['John', 'Mary', 'Chris', 'Anna'], dtype=object)

第二步:构建四类分类器

过滤完成后,我们需要把字符串类型的目标列转化为模型可处理的数值,再结合特征构建分类器。

1. 分离特征与目标变量

首先把特征和目标列分开:

# X是所有特征(去掉names列),y是目标变量
X = filtered_df.drop('names', axis=1)
y = filtered_df['names']

2. 编码目标变量

分类模型无法直接处理字符串标签,用LabelEncoder把每个类别映射为0-3的数值:

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
y_encoded = le.fit_transform(y)
# 之后如果需要把预测结果转回字符串,可以用 le.inverse_transform(predicted_values)

3. 预处理特征(关键步骤)

你的数据集有200列,肯定混合了数值型和类别型特征,需要分别处理:

  • 数值特征:标准化(让特征处于同一量级,提升模型性能)
  • 类别特征:独热编码(避免模型把类别当成有序数值)

用ColumnTransformer和Pipeline可以优雅地处理不同类型的特征:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.pipeline import Pipeline

# 区分数值和类别特征
numeric_features = X.select_dtypes(include=['int64', 'float64']).columns
categorical_features = X.select_dtypes(include=['object']).columns

# 构建预处理管道
preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numeric_features),
        ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)
    ])

4. 选择并训练分类器

针对你的大数据集,推荐用随机森林或XGBoost/LightGBM(效率高、鲁棒性强),这里以随机森林为例,构建完整的训练管道:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

# 划分训练集和测试集(stratify保证类别分布一致)
X_train, X_test, y_train, y_test = train_test_split(
    X, y_encoded, test_size=0.2, random_state=42, stratify=y_encoded
)

# 组装预处理+分类器的完整管道
clf = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('classifier', RandomForestClassifier(n_estimators=100, random_state=42))
])

# 训练模型
clf.fit(X_train, y_train)

# 评估模型
y_pred = clf.predict(X_test)
print(f"模型准确率: {accuracy_score(y_test, y_pred):.2f}")
# 输出详细分类报告(包含每个类别的精确率、召回率)
print(classification_report(y_test, y_pred, target_names=le.classes_))

额外优化建议:

  • 如果类别分布不平衡(比如某类样本远少于其他类),可以给分类器加上class_weight='balanced'参数,或者用SMOTE算法做样本均衡。
  • 大数据集训练慢的话,可以尝试减少随机森林的n_estimators,或者改用LightGBM/XGBoost(支持并行训练,速度更快)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:28:03