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

如何在Pandas数据帧的几列中进行一次热编码,以供以后使用Scikit学习

公西马鲁
2023-03-14

假设我有以下数据

import pandas as pd
data = {
    'Reference': [1, 2, 3, 4, 5],
    'Brand': ['Volkswagen', 'Volvo', 'Volvo', 'Audi', 'Volkswagen'],
    'Town': ['Berlin', 'Berlin', 'Stockholm', 'Munich', 'Berlin'],
    'Mileage': [35000, 45000, 121000, 35000, 181000],
    'Year': [2015, 2014, 2012, 2016, 2013]
 }
df = pd.DataFrame(data)

在这上面,我想在“品牌”和“城镇”两列上做一次性编码,以便训练分类器(比如用Scikit学习)并预测年份。

一旦分类器被训练,我将希望根据新的输入数据预测年份(不在训练中使用),我将需要重新应用相同的热编码。例如:

new_data = {
    'Reference': [6, 7],
    'Brand': ['Volvo', 'Audi'],
    'Town': ['Stockholm', 'Munich']
}

在这种情况下,如果知道需要对多个列进行编码,并且需要能够在以后对新数据应用相同的编码,那么对Pandas数据帧上的2列进行一次热编码的最佳方法是什么。

这是如何在SkLearn中重用LabelBinarizer进行输入预测的后续问题

共有2个答案

暴骏奇
2023-03-14

您可以使用熊猫提供的get_dummies函数并转换分类值。

像这样的。。

import pandas as pd
data = {
    'Reference': [1, 2, 3, 4, 5],
    'Brand': ['Volkswagen', 'Volvo', 'Volvo', 'Audi', 'Volkswagen'],
    'Town': ['Berlin', 'Berlin', 'Stockholm', 'Munich', 'Berlin'],
    'Mileage': [35000, 45000, 121000, 35000, 181000],
    'Year': [2015, 2014, 2012, 2016, 2013]
 }
df = pd.DataFrame(data)

train = pd.concat([df.get(['Mileage','Reference','Year']),
                           pd.get_dummies(df['Brand'], prefix='Brand'),
                           pd.get_dummies(df['Town'], prefix='Town')],axis=1)

对于测试数据,您可以:

new_data = {
    'Reference': [6, 7],
    'Brand': ['Volvo', 'Audi'],
    'Town': ['Stockholm', 'Munich']
}
test = pd.DataFrame(new_data)

test = pd.concat([test.get(['Reference']),
                           pd.get_dummies(test['Brand'], prefix='Brand'),
                           pd.get_dummies(test['Town'], prefix='Town')],axis=1)

# Get missing columns in the training test
missing_cols = set( train.columns ) - set( test.columns )
# Add a missing column in test set with default value equal to 0
for c in missing_cols:
    test[c] = 0
# Ensure the order of column in the test set is in the same order than in train set
test = test[train.columns]
翟泰
2023-03-14

考虑以下方法。

演示:

from sklearn.preprocessing import LabelBinarizer
from collections import defaultdict

d = defaultdict(LabelBinarizer)

In [7]: cols2bnrz = ['Brand','Town']

In [8]: df[cols2bnrz].apply(lambda x: d[x.name].fit(x))
Out[8]:
Brand    LabelBinarizer(neg_label=0, pos_label=1, spars...
Town     LabelBinarizer(neg_label=0, pos_label=1, spars...
dtype: object

In [10]: new = pd.DataFrame({
    ...:     'Reference': [6, 7],
    ...:     'Brand': ['Volvo', 'Audi'],
    ...:     'Town': ['Stockholm', 'Munich']
    ...: })

In [11]: new
Out[11]:
   Brand  Reference       Town
0  Volvo          6  Stockholm
1   Audi          7     Munich

In [12]: pd.DataFrame(d['Brand'].transform(new['Brand']), columns=d['Brand'].classes_)
Out[12]:
   Audi  Volkswagen  Volvo
0     0           0      1
1     1           0      0

In [13]: pd.DataFrame(d['Town'].transform(new['Town']), columns=d['Town'].classes_)
Out[13]:
   Berlin  Munich  Stockholm
0       0       0          1
1       0       1          0
 类似资料:
  • 我想用内核机对数据集进行分类。目标类有5个不同的值,我想一次性编码它。之后,我有5个目标列。我做了5次训练,每次目标列一次。现在我想分类一个新的样本。我用我得到的5个Trainig模型对样品进行了5次分类。最后,我看哪一个预测在5个预测中具有最大值,然后我根据具有最大预测的类对样本进行分类。我不确定我做的是对的。我怎样才能以正确的方式做到这一点?

  • 我有一个熊猫数据框,它有一些行和列。每列都有一个标题。现在,只要我继续在pandas中执行数据操作,我的变量头就会被保留。但是,如果我尝试Sci kit学习库的一些数据预处理功能,我最终会丢失所有的标题,并且帧会转换为一个数字矩阵。 我理解为什么会发生这种情况,因为Scikit学习给出了一个Numpy ndarray作为输出。而Numpy ndarray只是矩阵不会有列名。 但事情是这样的。如果我

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

  • 我有一个80%分类变量的机器学习分类问题。如果我想使用一些分类器进行分类,我必须使用一个热编码吗?我可以不编码地将数据传递给分类器吗? 我试图做以下功能选择: > 我读了火车文件: 我将分类特征的类型更改为“类别”: 我使用一个热编码: 问题是,第三部分经常卡住,尽管我使用的是一个强大的机器。 因此,没有一个热编码,我无法进行任何特征选择,以确定特征的重要性。 你推荐什么?

  • 我有一个pandas数据帧像: 我想按第一列进行分组,并将第二列作为行中的列表:

  • 对于一篇研究论文,我将使用套索模型进行分类和特征选择。我正准备使用一种热编码来处理分类数据,并需要找出哪些特征映射到原始分类值,以确定最终为最终模型选择了哪些特征。我在谷歌上搜索这个问题已经有一段时间了,但还没有找到答案。 scikit的一个热编码如何分配值?例如,假设某个变量的分类值为{1,2,3,4}。一个热编码是否按时间顺序将它们组织为虚拟对象(即,删除1,将第一个虚拟对象设置为值2,将第二