我在项目中使用了来自Python优秀的Scikit-Learn库的RandomForestRegressor,它给我带来了不错的结果,但我认为我可以做得更好。当我将特征传递给’fit(..)’函数时,是否应该将分类特征转换为二进制特征呢?
例如:而不是这样:
===========continent |=========== 1 |=========== 2 |=========== 3 |=========== 2 |===========
可以这样做:
===========================is_europe | is_asia | ...=========================== 1 | 0 |=========================== 0 | 1 |===========================
因为它是以树的形式工作的,所以第二种选项可能更好,或者第一种选项会同样有效吗?非常感谢!
回答:
将分类变量二值化是高度推荐的,预计会比没有二值化转换的模型表现更好。如果scikit-learn
将continent = [1, 2, 3, 2]
视为数值(连续变量[定量]而不是分类[定性]),它会对该特征施加人为的顺序约束。例如,假设continent=1
表示is_europe
,continent=2
表示is_asia
,continent=3
表示is_america
,那么这意味着is_asia
总是介于is_europe
和is_america
之间,当检查continent特征
与你的响应变量y
的关系时,这不一定是正确的,并且有可能会降低模型的有效性。相反,将其转换为虚拟变量就没有这样的问题,scikit-learn
会分别处理每个二进制特征。
要在scikit-learn
中将你的分类变量二值化,你可以使用LabelBinarizer
。
from sklearn.preprocessing import LabelBinarizer# 你的数据# ===========================continent = [1, 2, 3, 2]continent_dict = {1:'is_europe', 2:'is_asia', 3:'is_america'}print(continent_dict){1: 'is_europe', 2: 'is_asia', 3: 'is_america'}# 处理# =============================binarizer = LabelBinarizer()# 拟合分类特征continent_dummy = binarizer.fit_transform(continent)print(continent_dummy)[[1 0 0] [0 1 0] [0 0 1] [0 1 0]]
如果你在pandas
中处理数据,那么它的顶级函数pandas.get_dummies
也很有帮助。