UCI リポジトリの自動車評価データセットを使用しようとしていますが、sklearn でカテゴリ変数を 2 値化する便利な方法があるかどうか疑問に思っています。1 つのアプローチは、LabelBinarizer の DictVectorizer を使用することですが、ここでは k 個の異なる機能を取得していますが、共線化を避けるために k-1 だけを使用する必要があります。独自の関数を記述して 1 列を削除できると思いますが、この簿記は面倒です。そのような変換を実行して結果としてスパース行列を取得する簡単な方法はありますか?
質問する
22319 次
3 に答える
31
データが pandas DataFrame の場合は、get_dummies を呼び出すだけです。データ フレームが df で、変数「キー」のレベルごとに 1 つのバイナリ変数が必要であるとします。あなたは単に呼び出すことができます:
pd.get_dummies(df['key'])
次に、多重共線性の問題を回避するために、ダミー変数の 1 つを削除します。これが役立つことを願っています...
于 2014-03-02T17:27:59.903 に答える
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
スパース形式で行う方法は次のとおりです
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()
于 2013-08-06T11:29:38.053 に答える
15
DictVectorizerは、カテゴリ変数のワンホットエンコーディングを生成するための推奨される方法です。引数を使用してsparse
、密なnumpy配列の代わりにスパースCSRマトリックスを作成できます。私は通常、多重共線性を気にせず、私が使用する傾向のあるアプローチ(つまり、LinearSVC、SGDClassifier、ツリーベースのメソッド)に問題があることに気づいていません。
DictVectorizerにパッチを適用して、カテゴリ機能ごとに1つの列を削除することは問題ではありません。メソッドDictVectorizer.vocabulary
の最後で、 1つの用語を削除するだけです。fit
(プルリクエストはいつでも大歓迎です!)
于 2013-02-23T08:02:11.803 に答える