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にそのようなものはありますか?
...数年後(そして、これらの問題の適切な説明は、この質問だけでなく、将来自分自身を思い出させるのに役立つと思うので)
一般に、カテゴリ変数をダミー変数(または 他の方法論のホスト )に変換します。理由それらは名目上のものでした。彼らは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
を作成することは、目的の順序関係を維持するだけでなく、「予測アルゴリズムの内容とマッピングを整理しておく」ために使用することもできます。その過程で順序情報を失ったことはありませんが、各変数の各マッピングが何であるかの記録も保存していますか。
int
s into sklearn
最後に、OPは、情報を_scikit-lean
_分類子に渡すことについて話しました。これは、int
sが必要であることを意味します。その場合は、 astype(int)
gotcha の詳細を知っていることを確認してください ここ にNaN
sがある場合データ。
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.]])