一键编码

时间:2019-05-29 07:36:37

标签: python-3.x pandas scikit-learn data-science one-hot-encoding

我正在尝试在Iris数据集中的目标列(“种类”)上使用一种热编码器。

但是我遇到以下错误:

  

ValueError:预期的2D数组,取而代之的是1D数组:

     

如果数据中有一个数据,则使用array.reshape(-1,1)重塑数据。   单一要素或array.reshape(1,-1)(如果其中包含单个样本)。

Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm    Species
0   1   5.1 3.5 1.4         0.2     Iris-setosa
1   2   4.9 3.0 1.4         0.2     Iris-setosa
2   3   4.7 3.2 1.3         0.2     Iris-setosa
3   4   4.6 3.1 1.5         0.2     Iris-setosa
4   5   5.0 3.6 1.4         0.2     Iris-setosa

我确实搜索了这个问题,发现大多数scikit学习估计量需要2D数组而不是1D数组。

同时,我还发现我们可以尝试传递带有索引的数据框来对单个列进行编码,但这没有用

onehotencoder = OneHotEncoder(categorical_features=[df.columns.tolist().index('pattern_id')
X = dataset.iloc[:,1:5].values
y = dataset.iloc[:, 5].values

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

labelencoder= LabelEncoder()
y = labelencoder.fit_transform(y)


onehotencoder = OneHotEncoder(categorical_features=[0])
y = onehotencoder.fit_transform(y)

我正在尝试对单个分类列进行编码,然后分成多个列(编码通常起作用的方式)

3 个答案:

答案 0 :(得分:3)

  

ValueError:预期的2D数组,改为1D数组:重塑您的   如果您的数据只有一个,则使用array.reshape(-1,1)   feature或array.reshape(1,-1)(如果它包含单个样本)。

表示需要将数组转换为向量。 您可以通过以下方式做到这一点:

from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import pandas as pd
import numpy as np

# load iris dataset 
>>> iris = datasets.load_iris()
>>> iris = pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['target'])
>>> y = iris.target.values
>>> onehotencoder = OneHotEncoder(categories='auto')
>>> y = onehotencoder.fit_transform(y.reshape(-1,1))
# y - will be sparse matrix of type '<class 'numpy.float64'>
# if you want it to be a array you need to 
>>> print(y.toarray())
[[1. 0. 0.]
 [1. 0. 0.]
    . . . . 
 [0. 0. 1.]
 [0. 0. 1.]]

您还可以使用get_dummies函数(docs

>>> pd.get_dummies(iris.target).head()
   0.0  1.0  2.0
0    1    0    0
1    1    0    0
2    1    0    0
3    1    0    0
4    1    0    0

希望有帮助!

答案 1 :(得分:2)

对于您的情况,由于您似乎正在使用kaggle数据集,因此我只会使用

data: {
  datasets: [
    {
        data           : data,
        borderWidth    : 3, // set diameter of dots here
        borderColor    : '#ccc',
        fill           : false,
        pointRadius    : 0,
        borderDash     : [0,6], // set 'length' of dash/dots to zero and
                                // space between dots (center to center)
                                // recommendation: 2x the borderWidth
        borderCapStyle : 'round' // this is where the magic happens
    }
  ]
}

请注意,此处的默认值会编码所有类别(3种),通常只使用两种,并将均值的差异与基线组进行比较(例如,R中的默认值,或者在进行回归/ ANOVA时通常使用默认值)可以使用import pandas as pd pd.get_dummies(df.Species).head() Out[158]: Iris-setosa Iris-versicolor Iris-virginica 0 1 0 0 1 1 0 0 2 1 0 0 3 1 0 0 4 1 0 0 参数来完成)。

答案 2 :(得分:0)

我遇到了类似的情况,发现以下方法有效:

在 fit 或 fit_transform 命令中使用两个方括号作为列名

one_hot_enc = OneHotEncoder()

arr =  one_hot_enc.fit_transform(data[['column']])
df = pd.DataFrame(arr)

fit_transform 为您提供一个数组,您可以将其转换为 Pandas 数据帧。您可以将其附加到原始数据帧或直接分配给现有列。