如何在Scikit-learn中向DecisionTreeRegressor传入分类与数值混合特征?
在Scikit-learn的DecisionTreeRegressor中处理分类与数值混合特征
嘿,我来帮你搞定这个问题!Scikit-learn的DecisionTreeRegressor本身只能处理数值型输入,没法直接用原始的分类特征(比如字符串类型的类别标签)。不过没关系,有两种常用的预处理方法可以搞定混合特征的情况,下面我结合示例给你详细说明:
方法1:独热编码(One-Hot Encoding)
这是处理无序分类特征的首选方案,比如颜色(红/蓝/绿)、城市名称这类没有顺序关系的类别。它会把每个类别转换成一个独立的二进制列,避免模型误以为类别之间有数值上的大小关系。
示例代码:
from sklearn import tree from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder import pandas as pd # 构造含混合特征的示例数据集 data = { '数值特征1': [10, 20, 30, 40, 50], '数值特征2': [0.5, 0.7, 0.3, 0.8, 0.2], '分类特征': ['A', 'B', 'A', 'C', 'B'], '目标值': [100, 200, 150, 300, 250] } df = pd.DataFrame(data) # 拆分特征与目标变量 X = df.drop('目标值', axis=1) y = df['目标值'] # 定义预处理管道:分类特征做独热编码,数值特征直接保留 preprocessor = ColumnTransformer( transformers=[ ('cat_encoder', OneHotEncoder(sparse_output=False), ['分类特征']), ('num_passthrough', 'passthrough', ['数值特征1', '数值特征2']) ]) # 执行特征预处理 X_processed = preprocessor.fit_transform(X) # 训练决策树回归器 make_tree = tree.DecisionTreeRegressor() fit_tree = make_tree.fit(X_processed, y)
方法2:标签编码(Label Encoding)
如果你的分类特征是有序的(比如等级:低/中/高、学历:本科/硕士/博士),可以用标签编码把每个类别映射成一个整数。但要注意:无序类别绝对不能用这个方法,否则会让模型错误地认为类别之间存在数值大小关系。
示例代码:
from sklearn import tree from sklearn.preprocessing import LabelEncoder import pandas as pd # 构造含有序分类特征的示例数据集 data = { '数值特征1': [10, 20, 30, 40, 50], '数值特征2': [0.5, 0.7, 0.3, 0.8, 0.2], '分类特征': ['低', '中', '低', '高', '中'], '目标值': [100, 200, 150, 300, 250] } df = pd.DataFrame(data) # 对有序分类特征执行标签编码 le = LabelEncoder() df['分类特征_编码'] = le.fit_transform(df['分类特征']) # 拆分特征与目标变量 X = df[['数值特征1', '数值特征2', '分类特征_编码']] y = df['目标值'] # 训练决策树回归器 make_tree = tree.DecisionTreeRegressor() fit_tree = make_tree.fit(X, y)
额外提示
- 独热编码会增加特征维度,如果分类特征的类别数量极多,可以用
OneHotEncoder的drop='first'参数去掉一个冗余列,避免维度爆炸; - 决策树系列模型对特征缩放不敏感,所以数值特征不需要做标准化/归一化,这一点比线性模型省心很多!
内容的提问来源于stack exchange,提问作者sasan
相关产品推荐
相关产品推荐

