如何编码在sklearn分类变量?(How to encode a categorical vari

2019-07-20 09:16发布

我试图用汽车的评价数据集从UCI库中,我不知道是否有在二值化分类sklearn变量的便捷方式。 一种方法是使用LabelBinarizer的DictVectorizer但在这里我得到k个不同的功能,而你刚才应该K-1,以避免collinearization。 我想我可以写我自己的功能和删除一列,但这个簿记是乏味的,有没有进行这种转变,并得到结果的稀疏矩阵一种简单的方法?

Answer 1:

DictVectorizer是生成分类变量的一热编码推荐的方式; 您可以使用sparse参数来创建一个稀疏矩阵CSR代替密集阵numpy的。 我平时不关心多重,我还没有与我倾向于使用(即LinearSVC,基于树的SGDClassifier,方法)的途径发现问题。

它不应该是修补DictVectorizer下降每个分类功能的一列了一个问题-你简单的需要从删除一个学期DictVectorizer.vocabulary在结束fit方法。 (拉请求我们随时欢迎您!)



Answer 2:

如果你的数据是大熊猫数据框,那么你可以简单地调用get_dummies。 假设你的数据帧DF和你想有每个变量的“关键”的水平一个二元变量。 您只需拨打:

pd.get_dummies(df['key'])

然后删除虚拟变量之一,以避免多重共线性问题。 我希望这有帮助 ...



Answer 3:

基本方法是

import numpy as np
import pandas as pd, os
from sklearn.feature_extraction import DictVectorizer

def one_hot_dataframe(data, cols, replace=False):
    vec = DictVectorizer()
    mkdict = lambda row: dict((col, row[col]) for col in cols)
    vecData = pd.DataFrame(vec.fit_transform(data[cols].apply(mkdict, axis=1)).toarray())
    vecData.columns = vec.get_feature_names()
    vecData.index = data.index
    if replace is True:
        data = data.drop(cols, axis=1)
        data = data.join(vecData)
    return (data, vecData, vec)

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002],
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}

df = pd.DataFrame(data)

df2, _, _ = one_hot_dataframe(df, ['state'], replace=True)
print df2

以下是如何在稀疏的格式做

import numpy as np
import pandas as pd, os
import scipy.sparse as sps
import itertools

def one_hot_column(df, cols, vocabs):
    mats = []; df2 = df.drop(cols,axis=1)
    mats.append(sps.lil_matrix(np.array(df2)))
    for i,col in enumerate(cols):
        mat = sps.lil_matrix((len(df), len(vocabs[i])))
        for j,val in enumerate(np.array(df[col])):
            mat[j,vocabs[i][val]] = 1.
        mats.append(mat)

    res = sps.hstack(mats)   
    return res

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
        'year': ['2000', '2001', '2002', '2001', '2002'],
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}

df = pd.DataFrame(data)
print df

vocabs = []
vals = ['Ohio','Nevada']
vocabs.append(dict(itertools.izip(vals,range(len(vals)))))
vals = ['2000','2001','2002']
vocabs.append(dict(itertools.izip(vals,range(len(vals)))))

print vocabs

print one_hot_column(df, ['state','year'], vocabs).todense()


文章来源: How to encode a categorical variable in sklearn?