【问题标题】:Are RandomForestRegressor features handles as categories?RandomForestRegressor 特征是否作为类别处理?
【发布时间】:2015-09-30 14:50:12
【问题描述】:

我正在为我的项目使用 RandomForestRegressor(来自 python 中的伟大 Scikt-Learn 库), 它给了我很好的结果,但我认为我可以做得更好。 当我为“fit(..)”功能提供功能时, 将分类特征作为二元特征会更好吗?

示例: 而不是:

===========
continent |
===========
     1    |
===========
     2    |
===========
     3    |
===========
     2    |
===========

制作类似的东西:

===========================
is_europe | is_asia   | ...
===========================
    1     |     0     |
===========================
    0     |     1     |
===========================

因为它像一棵树一样工作,也许第二个选项更好, 还是第一个选项的工作方式相同? 非常感谢!

【问题讨论】:

    标签: python tree machine-learning scikit-learn random-forest


    【解决方案1】:

    强烈建议对分类变量进行二值化,并期望在没有二值化变换的情况下优于模型。如果scikit-learncontinent = [1, 2, 3, 2] 视为数值(连续变量 [quantitative] 而不是分类 [qualitative]),则会对该特征施加人为的顺序约束。例如,假设continent=1 表示is_europecontinent=2 表示is_asiacontinent=3 表示is_america,则意味着is_asia 在检查时总是介于is_europeis_america 之间。 continent feature 与您的响应变量 y 的关系,这不一定是正确的,并且有机会降低模型的有效性。相比之下,将其设为虚拟变量则没有这样的问题,scikit-learn 将分别处理每个二进制特征。

    要将scikit-learn 中的分类变量二值化,您可以使用LabelBinarizer

    from sklearn.preprocessing import LabelBinarizer
    
    
    # your data
    # ===========================
    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'}
    
    # processing
    # =============================
    binarizer = LabelBinarizer()
    # fit on the categorical feature
    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 也有帮助。

    【讨论】:

    • 重要的是要注意,在决策树/随机森林中有一种更自然的方式来处理像这样的分类特征,它们在 scikit-learn 中不受支持,因为库不支持支持分类特征。
    猜你喜欢
    • 2018-12-14
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2014-02-17
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多