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

如何在Python中进行热编码?

司马自明
2023-03-14

我有一个80%分类变量的机器学习分类问题。如果我想使用一些分类器进行分类,我必须使用一个热编码吗?我可以不编码地将数据传递给分类器吗?

我试图做以下功能选择:

>

  • 我读了火车文件:

    num_rows_to_read = 10000
    train_small = pd.read_csv("../../dataset/train.csv",   nrows=num_rows_to_read)
    

    我将分类特征的类型更改为“类别”:

    non_categorial_features = ['orig_destination_distance',
                              'srch_adults_cnt',
                              'srch_children_cnt',
                              'srch_rm_cnt',
                              'cnt']
    
    for categorical_feature in list(train_small.columns):
        if categorical_feature not in non_categorial_features:
            train_small[categorical_feature] = train_small[categorical_feature].astype('category')
    

    我使用一个热编码:

    train_small_with_dummies = pd.get_dummies(train_small, sparse=True)
    

    问题是,第三部分经常卡住,尽管我使用的是一个强大的机器。

    因此,没有一个热编码,我无法进行任何特征选择,以确定特征的重要性。

    你推荐什么?

  • 共有3个答案

    苗学民
    2023-03-14

    你可以用numpy来做。eye和a使用数组元素选择机制

    import numpy as np
    nb_classes = 6
    data = [[2, 3, 4, 0]]
    
    def indices_to_one_hot(data, nb_classes):
        """Convert an iterable of indices to one-hot encoded labels."""
        targets = np.array(data).reshape(-1)
        return np.eye(nb_classes)[targets]
    

    indices_to_one_hot(nb_classes,数据)的返回值现在

    array([[[ 0.,  0.,  1.,  0.,  0.,  0.],
            [ 0.,  0.,  0.,  1.,  0.,  0.],
            [ 0.,  0.,  0.,  0.,  1.,  0.],
            [ 1.,  0.,  0.,  0.,  0.,  0.]]])
    

    . reshape(-1)用于确保您具有正确的标签格式(您可能还具有[[2],[3],[4],[0]])。

    阎冠玉
    2023-03-14

    更容易使用熊猫进行基本的热编码。如果您正在寻找更多选项,可以使用scikit-learn

    对于基本的熊猫热编码,您可以将数据帧传递到get_dummies函数中。

    例如,如果我有一个名为imdb_movies的数据帧:

    ...我想一次性编码额定列,我这样做:

    pd.get_dummies(imdb_movies.Rated)
    

    这将返回一个新的dataframe,其中包含一个列,表示存在的每个级别的评级,以及指定给定观察结果的该评级的存在的1或0。

    通常,我们希望这是原始dataframe的一部分。在这种情况下,我们使用“列绑定”将新的虚拟编码帧附加到原始帧上。

    我们可以使用Pandas conat函数进行列绑定:

    rated_dummies = pd.get_dummies(imdb_movies.Rated)
    pd.concat([imdb_movies, rated_dummies], axis=1)
    

    现在,我们可以对完整的数据帧进行分析

    简单效用函数

    我建议您使用一个实用函数来快速完成此操作:

    def encode_and_bind(original_dataframe, feature_to_encode):
        dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
        res = pd.concat([original_dataframe, dummies], axis=1)
        return(res)
    

    用法:

    encode_and_bind(imdb_movies, 'Rated')
    

    结果:

    此外,根据@pmalbu comment,如果您希望该功能删除原始功能_to_encode,则使用此版本:

    def encode_and_bind(original_dataframe, feature_to_encode):
        dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
        res = pd.concat([original_dataframe, dummies], axis=1)
        res = res.drop([feature_to_encode], axis=1)
        return(res) 
    

    您可以同时对多个功能进行编码,如下所示:

    features_to_encode = ['feature_1', 'feature_2', 'feature_3',
                          'feature_4']
    for feature in features_to_encode:
        res = encode_and_bind(train_set, feature)
    
    穆宾白
    2023-03-14

    方法1:您可以使用pandaspd。获取虚拟对象

    例1:

    import pandas as pd
    s = pd.Series(list('abca'))
    pd.get_dummies(s)
    Out[]: 
         a    b    c
    0  1.0  0.0  0.0
    1  0.0  1.0  0.0
    2  0.0  0.0  1.0
    3  1.0  0.0  0.0
    

    例2:

    下面将把给定的列转换成一个热列。使用前缀有多个假人。

    import pandas as pd
            
    df = pd.DataFrame({
              'A':['a','b','a'],
              'B':['b','a','c']
            })
    df
    Out[]: 
       A  B
    0  a  b
    1  b  a
    2  a  c
    
    # Get one hot encoding of columns B
    one_hot = pd.get_dummies(df['B'])
    # Drop column B as it is now encoded
    df = df.drop('B',axis = 1)
    # Join the encoded df
    df = df.join(one_hot)
    df  
    Out[]: 
           A  a  b  c
        0  a  0  1  0
        1  b  1  0  0
        2  a  0  0  1
    

    方法2:使用Scikit学习

    使用onehotcoder的优点是能够fit一些训练数据,然后transform一些其他数据使用相同的实例。我们还有handle_unknown来进一步控制编码器对看不见数据的处理。

    给定一个包含三个特征和四个样本的数据集,我们让编码器找到每个特征的最大值,并将数据转换为二进制热编码。

    >>> from sklearn.preprocessing import OneHotEncoder
    >>> enc = OneHotEncoder()
    >>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])   
    OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,
       handle_unknown='error', n_values='auto', sparse=True)
    >>> enc.n_values_
    array([2, 3, 4])
    >>> enc.feature_indices_
    array([0, 2, 5, 9], dtype=int32)
    >>> enc.transform([[0, 1, 1]]).toarray()
    array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])
    

    以下是此示例的链接:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

     类似资料:
    • 问题内容: 我有一个80%分类变量的机器学习分类问题。如果要使用一些分类器进行分类,是否必须使用一种热编码?我可以在没有编码的情况下将数据传递给分类器吗? 我正在尝试进行以下功能选择: 我读了火车文件: 我将类别特征的类型更改为“类别”: 我使用一种热编码: 问题是,尽管我使用的是坚固的机器,但第3部分经常卡住。 因此,没有一种热编码,我就无法进行任何特征选择来确定特征的重要性。 你有什么建议吗?

    • 问题内容: 对于C ++,我们可以使用OpenMP进行并行编程。但是,OpenMP不适用于Python。如果要并行执行python程序的某些部分,该怎么办? 该代码的结构可以认为是: 其中和是两个独立的功能。为了减少运行时间,如何并行而不是按顺序运行这种代码?代码是: 其中和是两个独立的功能。那是我要平行的地方… 问题答案: 您可以使用多处理模块。对于这种情况,我可以使用一个处理池: 这将产生可以

    • 其中和是两个独立的函数。那就是我想平行的地方...

    • 问题内容: 给出了可变长度特征的列表: 每个样本具有不同数量的功能,并且该功能已经并且很热门。 为了使用sklearn的特征选择实用程序,我必须将转换为2D数组,如下所示: 如何通过sklearn或numpy实现它? 问题答案: 您可以使用scikit中存在的MultiLabelBinarizer专门用于执行此操作。 您的示例代码: 输出: 它也可以与其他feature_selection实用程序

    • 问题内容: 在Python中scp文件的最pythonic方式是什么?我知道的唯一路线是 这是一种骇客,并且在类似Linux的系统之外不起作用,并且需要Pexpect模块的帮助来避免出现密码提示,除非你已经为远程主机设置了无密码的SSH。 我知道Twisted的,但是我希望避免通过低级ssh模块自己实现scp。 我知道,一个支持SSH和SFTP的Python模块;但它不支持SCP。 背景:我正在连

    • 问题内容: node.js是否具有内置的base64编码? 我之所以这样问,是因为from 只能输出十六进制,二进制或ascii数据。例如: 根据文档,可以输出base64编码的数据。但是,不支持base64。我尝试过,它会破裂。 如果我这样做: 那我应该用什么解密呢?十六进制还是base64? 因此,我正在寻找一个函数来对加密的十六进制输出进行base64编码。 问题答案: 缓冲区可用于获取字符