4

41 個の特徴 [0 から 40 列] を持つデータセットがあり、そのうち 7 つはカテゴリです。このカテゴリ セットは、次の 2 つのサブセットに分割されます。

  • 文字列型のサブセット (列機能 1、2、3)
  • バイナリ形式 0 または 1 の int 型のサブセット (列機能 6、11、20、21)

さらに、列機能 1、2、および 3 (文字列型) には、それぞれカーディナリティ 3、66、および 11 があります。このコンテキストでは、サポート ベクター マシン アルゴリズムを使用するようにエンコードする必要があります。これは私が持っているコードです:

import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn import feature_extraction

df = pd.read_csv("train.csv")
datanumpy = df.as_matrix()
X = datanumpy[:, 0:40]  # select columns 1 through 41 (the features)
y = datanumpy[:, 41]  # select column 42 (the labels)

[上で公開した理由により]どちらを使用するのが良いかはわかりませんが、ほとんどの場合、[コードの観点から]どちらの方法で、私が持っているマトリックスでそれらを使用DictVectorizer()します。または、文字列型のサブセットの各カーディナリティに番号を割り当てるだけですか (カーディナリティが高く、機能空間が指数関数的に増加するため)。OneHotEncoder()X

編集 int 型のサブセットに関しては、列の機能をそのままにしておくのが最善の選択だと思います (エンコーダーに渡さないでください)。カーディナリティの高い文字列型のサブセットでも問題は解決しません。

4

3 に答える 3

3

これははるかに簡単です:

 df = pd.get_dummies(df, drop_first=True)

メモリ オーバーフローが発生するか、速度が遅すぎる場合は、カーディナリティを減らします。

top = df[col].isin(df[col].value_counts().index[:10])
df.loc[~top, col] = "other"
于 2016-11-15T20:32:37.830 に答える
0

上記の@simonによって提案されたpandas方法を使用するか、またはによって与えられた同等のものを使用することができます。.get_dummies()sklearnOneHotEncoder

エンコードするカテゴリ機能や各機能に保持する値の数などのパラメーターを渡すことができるので、私はそれを好み ます(指定されていない場合は、最適な数が自動的に選択されます)。OneHotEncoder

一部の機能でカーディナリティが大きすぎる場合は、低を課しn_valuesます。十分なメモリがある場合は、機能のすべての値をエンコードしてください。

カーディナリティが 66 の場合、基本的なコンピューターを使用している場合、66 個の機能すべてをエンコードしてもメモリの問題は発生しないと思います。通常、メモリ オーバーフローは、たとえば、データセット内のサンプル数と同じ数のフィーチャの値がある場合に発生します (サンプルごとに一意の ID の場合)。データセットが大きいほど、メモリの問題が発生する可能性が高くなります。

于 2016-11-16T10:38:32.307 に答える