使用独热编码器构建决策树:分类数据处理入门求助
用Pandas独热编码+Scikit-learn构建决策树(全分类数据场景)
完全明白你的需求,我直接给你一个从头到尾的可运行示例,覆盖从全分类数据集创建到决策树训练的全流程,用的就是你提到的Pandas get_dummies 方法,完美适配Scikit-learn的数值型输入要求。
步骤1:导入所需库
先把要用到的工具库都导进来:
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score, classification_report from sklearn.preprocessing import LabelEncoder # 用于处理分类标签
步骤2:创建全分类的示例数据集
模拟一个所有特征和标签都是分类类型的数据集,比如用户购买行为预测场景:
# 构建样本数据 data = { '性别': ['男', '女', '男', '女', '男', '女', '男', '女', '男', '女'], '职业': ['学生', '上班族', '上班族', '学生', '自由职业', '上班族', '学生', '自由职业', '上班族', '学生'], '学历': ['本科', '硕士', '本科', '大专', '硕士', '本科', '大专', '硕士', '本科', '大专'], '是否购买': ['是', '否', '是', '否', '是', '是', '否', '是', '否', '是'] # 标签列 } df = pd.DataFrame(data) print("原始数据集:") print(df)
步骤3:拆分特征与标签,处理分类标签
Scikit-learn的模型要求标签是数值型,所以先把标签列转成0/1(两种方式任选其一即可):
# 拆分特征X和标签y X = df.drop('是否购买', axis=1) y = df['是否购买'] # 方式1:用LabelEncoder自动编码 le = LabelEncoder() y = le.fit_transform(y) # 方式2:手动映射(适合标签取值明确的场景) # y = y.map({'否': 0, '是': 1})
步骤4:用Pandas get_dummies做独热编码
这一步是核心,get_dummies会自动识别所有分类特征列,生成对应的二进制编码列,完全满足Scikit-learn的数值输入要求:
# 对特征进行独热编码 X_encoded = pd.get_dummies(X) print("\n独热编码后的特征:") print(X_encoded)
你会看到原来的每个分类特征的不同取值,都变成了单独的二进制列(比如性别_男、性别_女),既保留了所有分类信息,又不会引入数值顺序的误导。
步骤5:拆分训练集和测试集
把编码后的数据拆分成训练用和测试用的子集:
X_train, X_test, y_train, y_test = train_test_split(X_encoded, y, test_size=0.2, random_state=42)
步骤6:训练并评估决策树模型
现在就可以用Scikit-learn的决策树模型正常训练了:
# 初始化决策树分类器 clf = DecisionTreeClassifier(random_state=42) # 训练模型 clf.fit(X_train, y_train) # 预测测试集 y_pred = clf.predict(X_test) # 评估模型性能 print("\n模型准确率:", accuracy_score(y_test, y_pred)) print("\n分类报告:") print(classification_report(y_test, y_pred, target_names=le.classes_))
一些实用小提示
- 如果你的数据里有部分列不需要编码,可以用
get_dummies的columns参数指定要编码的列,比如pd.get_dummies(X, columns=['性别', '职业']) - 独热编码后不会引入数值型特征的尺度问题,完美适配决策树这类对特征尺度不敏感的模型
- 如果标签是多分类(超过2类),上述流程同样适用,只需要保持标签的数值编码即可
内容的提问来源于stack exchange,提问作者JCF
相关产品推荐
相关产品推荐

