ton*_*ian 12 python machine-learning scikit-learn
我正在尝试使用来自UCI存储库的汽车评估数据集,我想知道是否有一种方便的方法来对sklearn中的分类变量进行二值化.一种方法是使用LabelBinarizer的DictVectorizer,但在这里我得到了不同的特征,而你应该只有k-1以避免线性化.我想我可以编写自己的函数并删除一列,但是这个簿记很繁琐,是否有一种简单的方法来执行这样的转换并得到一个稀疏矩阵?
rez*_*idi 31
如果您的数据是pandas DataFrame,那么您只需调用get_dummies即可.假设您的数据框是df,并且您希望每个变量'key'都有一个二进制变量.你可以简单地打电话:
pd.get_dummies(df['key'])
Run Code Online (Sandbox Code Playgroud)
然后删除其中一个虚拟变量,以避免多线性问题.我希望这有帮助 ...
BBD*_*Sys 16
基本方法是
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
Run Code Online (Sandbox Code Playgroud)
以下是稀疏格式的操作方法
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()
Run Code Online (Sandbox Code Playgroud)
Pet*_*fer 15
DictVectorizer是生成分类变量的单热编码的推荐方法; 您可以使用该sparse参数来创建稀疏的CSR矩阵,而不是密集的numpy数组.我通常不关心多重共线性,我没有注意到我倾向于使用的方法的问题(即LinearSVC,SGDClassifier,基于树的方法).
修补DictVectorizer为每个分类功能删除一列应该不是问题 - 您只需要从方法DictVectorizer.vocabulary末尾删除一个术语fit.(欢迎拉动请求!)