当前位置: 首页 > 知识库问答 >
问题:

在决策树分类器中使用OneHotEncoder作为分类特征

鄂慈
2023-03-14

我是新来的ML在Python和非常困惑如何实现一个决策树与分类变量,因为他们得到自动编码的ctreeR

我想做一个具有两个分类独立特征和一个依赖类的决策树。

我使用的数据帧如下所示:

data
      title_overlap_quartile sales_rank_quartile rank_grp
    0                     Q4                  Q2    GRP 1
    1                     Q4                  Q3    GRP 1
    2                     Q2                  Q1    GRP 1
    3                     Q4                  Q1    GRP 1
    5                     Q2                  Q1    GRP 2

我知道分类特征需要使用labelencoder和/或一个热编码器在scikit learn中编码。

首先,我尝试只使用标签编码器,但这并不能解决问题,因为DecisionTreeClassifier开始将编码的变量视为连续变量。然后我从这篇文章中读到:OneHotEncoder的分类特性问题,变量应该首先使用标签编码器编码,然后再使用一个热编码器编码。

我试图以以下方式在此数据集中实现它,但得到一个错误。

def encode_features(df, columns):
    le = preprocessing.LabelEncoder()
    ohe = preprocessing.OneHotEncoder(sparse=False)
    for i in columns:
        le.fit(df[i].unique())
        df[i+'_le'] = le.transform(df[i])
        df[i+'_le'] = df[i+'_le'].values.reshape(-1, 1)
        df[i+'_le'+'_ohe'] = ohe.fit_transform(df[i+'_le'])
    return(df)

data = encode_features(data, ['title_overlap_quartile', 'sales_rank_quartile'])


  File "/Users/vaga/anaconda2/envs/py36/lib/python3.5/site-packages/pandas/core/series.py", line 2800, in _sanitize_index
    raise ValueError('Length of values does not match length of ' 'index')

ValueError: Length of values does not match length of index

当我从函数中删除ohe部分并在外部运行时,它会运行,但结果看起来很奇怪:

def encode_features(df, columns):
    le = preprocessing.LabelEncoder()
    ohe = preprocessing.OneHotEncoder(sparse=False)
    for i in columns:
        le.fit(df[i].unique())
        df[i+'_le'] = le.transform(df[i])
        # df[i+'_le'] = df[i+'_le'].values.reshape(-1, 1)
        # df[i+'_le'+'_ohe'] = ohe.fit_transform(df[i+'_le'])
    return(df)

data = encode_features(data, ['title_overlap_quartile', 'sales_rank_quartile']) 

data['title_overlap_quartile_le'] = data['title_overlap_quartile_le'].values.reshape(-1, 1)

print(ohe.fit_transform(data['title_overlap_quartile_le']))

[[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.
   1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.
   1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.
   1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]]

我还尝试使用pandas.get_dummies,它将变量转换为多列,并使用二进制编码,但决策树分类器再次将其视为连续变量。

有人能帮助我如何使用分类变量作为分类变量来拟合决策树并输出树形图吗?

拟合和绘制我使用的树的代码是:

clf = tree.DecisionTreeClassifier()
clf = clf.fit(data[['title_overlap_score', 'sales_rank_quartile']], data[['rank_grp']])

dot_data = tree.export_graphviz(clf, out_file=None, feature_names=data[['title_overlap_score', 'sales_rank_quartile']].columns,  
                         filled=True, rounded=True,  
                         special_characters=True)  

graph = graphviz.Source(dot_data)  
graph.render("new_tree")

共有1个答案

伏砚
2023-03-14

虽然决策树应该处理分类变量,但由于这个未解决的错误,sklearn的实现目前无法实现。当前的解决方法是,在将分类变量传递给分类器之前,对其进行热编码,这有点复杂。

你试过category_编码器吗?这更容易处理,也可以在管道中使用。

最新尚未正式版本的Scikit学习似乎允许字符串列类型,而无需转换为int。

 类似资料:
  • 主要内容:决策树算法应用,决策树实现步骤,决策树算法应用本节基于 Python Sklearn 机器学习算法库,对决策树这类算法做相关介绍,并对该算法的使用步骤做简单的总结,最后通过应用案例对决策树算法的代码实现进行演示。 决策树算法应用 在 sklearn 库中与决策树相关的算法都存放在 模块里,该模块提供了 4 个决策树算法,下面对这些算法做简单的介绍: 1) .DecisionTreeClassifier() 这是一个经典的决策树分类算法,它提供

  • 1 决策树理论 1.1 什么是决策树   所谓决策树,顾名思义,是一种树,一种依托于策略抉择而建立起来的树。机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。 树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,从根节点到叶节点所经历的路径对应一个判定测试序列。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。 1.2 决策树学习流

  • 问题内容: 关于如何将分类数据编码到Sklearn决策树中,有几篇文章,但是从Sklearn文档中,我们得到了这些。 决策树的一些优点是: (…) 能够处理数字和分类数据。其他技术通常专用于分析仅具有一种类型的变量的数据集。有关更多信息,请参见算法。 但是运行以下脚本 输出以下错误: 我知道在R中可以通过Sklearn传递分类数据,这可能吗? 问题答案: 与接受的答案相反,我更愿意使用Scikit

  • 本文向大家介绍python 画出使用分类器得到的决策边界,包括了python 画出使用分类器得到的决策边界的使用技巧和注意事项,需要的朋友参考一下 获取数据集,并画图代码如下: 得到图如下: 定义决策边界函数: 定义分类函数,并画出决策边界图代码如下: 画图如下: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 一、引言 在最开始的时候,我本来准备学习的是C4.5算法,后来发现C4.5算法的核心还是ID3算法,所以又辗转回到学习ID3算法了,因为C4.5是他的一个改进。至于是什么改进,在后面的描述中我会提到。 二、ID3算法 ID3算法是一种分类决策树算法。他通过一系列的规则,将数据最后分类成决策树的形式。分类的根据是用到了熵这个概念。熵在物理这门学科中就已经出现过,表示是一个物质的稳定度,在这里就是分类

  • 问题内容: 我通过图书馆学习机器学习。我使用以下代码将决策树分类器和随机森林分类器应用于我的数据: 为什么对于随机森林分类器来说结果要好得多(对于100次运行,随机采样2/3的数据进行训练,而1/3的数据进行测试)? 具有一个估计量的随机森林估计量不仅仅是决策树吗?我做错了什么或误解了这个概念吗? 感谢您的回复。 问题答案: 具有一个估计量的随机森林估计量不仅仅是决策树吗? 好吧,这是一个好问题,