web-dev-qa-db-ja.com

pandasの変数を順序/カテゴリとして指定するにはどうすればよいですか?

Scikit-learnを使用して、データセットで機械学習アルゴリズムを実行しようとしています。私のデータセットには、カテゴリのようないくつかの機能があります。 1つの機能のようにAは、何かの品質を指定する値_1,2,3_を持ちます。 _1:Upper, 2: Second, 3: Third class_。つまり、これは順序変数です。

同様に、変数Cityを再コーディングし、3つの値_('London', Zurich', 'New York'_を_1,2,3_に再コーディングしましたが、値に特別な設定はありませんでした。したがって、これは名目上のカテゴリ変数です。

パンダでこれらをカテゴリカルや序数などと見なすアルゴリズムを指定するにはどうすればよいですか? Rと同様に、カテゴリ変数はfactor(a)で指定されるため、連続値とは見なされません。 pandas/pythonにそのようなものはありますか?

11
Baktaawar

...数年後(そして、これらの問題の適切な説明は、この質問だけでなく、将来自分自身を思い出させるのに役立つと思うので)

序数と名目

一般に、カテゴリ変数をダミー変数(または 他の方法論のホスト )に変換します。理由それらは名目上のものでした。彼らはno _a > b > c_の感覚を持っていました。 OPの元の質問では、これはonlyロンドン、チューリッヒ、ニューヨークなどの都市で実行されます。

公称のダミー変数

このタイプの問題の場合、pandasは、 _pandas.get_dummies_ を使用した最も簡単な変換を提供します。そう:

_# create a sample of OPs unique values
series = pandas.Series(
           numpy.random.randint(low=0, high=3, size=100))
mapper = {0: 'New York', 1: 'London', 2: 'Zurich'}
nomvar = series.replace(mapper)

# now let's use pandas.get_dummies
print(
    pandas.get_dummies(series.replace(mpr))

Out[57]:
    London  New York  Zurich
0        0         0       1
1        0         1       0
2        0         1       0
3        1         0       0
_

カテゴリ変数の順序エンコーディング

ただし、順序変数の場合、ユーザーは _pandas.factorize_ の使用に注意する必要があります。その理由は、エンジニアが_a > b > c_のようなマッピングの関係を保持したいからです。

したがって、_large > medium > small_であるカテゴリ変数のセットを取得してそれを保持する場合は、_pandas.factorize_がその関係を保持することを確認する必要があります。

_# leveraging the variables already created above
mapper = {0: 'small', 1: 'medium', 2: 'large'}
ordvar = series.replace(mapper)

print(pandas.factorize(ordvar))

Out[58]:
(array([0, 1, 1, 2, 1,...  0, 0]),
Index(['large', 'small', 'medium'], dtype='object'))
_

実際、序数の概念を維持するために保持する必要があるという関係は、_pandas.factorize_を使用して失われました。このような場合、私は独自のマッピングを使用して、順序属性が保持されるようにします。

_preserved_mapper = {'large':2 , 'medium': 1, 'small': 0}
ordvar.replace(preserved_mapper)
print(ordvar.replace(preserved_mapper))

Out[78]:
0     2
1     0
...
99    2
dtype: int64
_

実際、値をマップするために独自のdictを作成することは、目的の順序関係を維持するだけでなく、「予測アルゴリズムの内容とマッピングを整理しておく」ために使用することもできます。その過程で順序情報を失ったことはありませんが、各変数の各マッピングが何であるかの記録も保存していますか。

ints into sklearn

最後に、OPは、情報を_scikit-lean_分類子に渡すことについて話しました。これは、intsが必要であることを意味します。その場合は、 astype(int) gotcha の詳細を知っていることを確認してください ここNaNsがある場合データ。

27
benjaminmgross

OneHotEncoder トランスフォーマーをカテゴリー変数とともに使用し、順序変数はそのままにしておく必要があります。

>>> import pandas as pd
>>> from sklearn.preprocessing import OneHotEncoder
>>> df = pd.DataFrame({'quality': [1, 2, 3], 'city': [3, 2, 1], columns=['quality', 'city']}
>>> enc = OneHotEncoder(categorical_features=[False, True])
>>> X = df.values
>>> enc.fit(X)
>>> enc.transform(X).todense()
matrix([[ 0.,  0.,  1.,  1.],
        [ 0.,  1.,  0.,  2.],
        [ 1.,  0.,  0.,  3.]])
2
dukebody
1
dartdog