1. ホーム
  2. python

[解決済み] Sklearnの決定木にカテゴリデータを渡す

2023-02-21 15:17:25

質問

Sklearn Decision Treeにカテゴリデータをエンコードする方法については、いくつかの投稿がありますが、Sklearnのドキュメントからは、以下のようになりました。

決定木の利点は以下の通りです。

(...)

数値データとカテゴリデータの両方を扱うことができる。他の手法は、通常、1種類の変数しか持たないデータセットの分析に特化している。詳しくはアルゴリズムをご覧ください。

しかし、次のスクリプトを実行すると

import pandas as pd 
from sklearn.tree import DecisionTreeClassifier

data = pd.DataFrame()
data['A'] = ['a','a','b','a']
data['B'] = ['b','b','a','b']
data['C'] = [0, 0, 1, 0]
data['Class'] = ['n','n','y','n']

tree = DecisionTreeClassifier()
tree.fit(data[['A','B','C']], data['Class'])

は以下のようなエラーを出力します。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/sklearn/tree/tree.py", line 154, in fit
    X = check_array(X, dtype=DTYPE, accept_sparse="csc")
  File "/usr/local/lib/python2.7/site-packages/sklearn/utils/validation.py", line 377, in check_array
    array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: could not convert string to float: b

Rではカテゴリデータを渡すことが可能だと思いますが、Sklearnでは可能でしょうか?

どのように解決するのですか?

一般的な回答とは異なり、私はこの目的のためにScikit-Learnによって提供されるツールを使用することを希望します。そうする主な理由は、それらが簡単に パイプライン .

Scikit-Learn自体、カテゴリデータを扱うための非常に優れたクラスを提供しています。独自の関数を書く代わりに LabelEncoder であり、これは この目的のために特別に設計された .

ドキュメントから以下のコードを参照してください。

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(["paris", "paris", "tokyo", "amsterdam"])
le.transform(["tokyo", "tokyo", "paris"]) 

これは機械学習アルゴリズムのために、自動的に数値にエンコードしてくれます。また、整数から文字列に戻すことも可能です。これは単に inverse_transform を次のように呼び出すだけです。

list(le.inverse_transform([2, 2, 1]))

これは ['tokyo', 'tokyo', 'paris'] .

また、決定木以外の多くの分類器、例えばロジスティック回帰やSVMなどでは、カテゴリ変数を ワンホットエンコーディング . Scikit-learnは、このような場合にも OneHotEncoder クラスによってサポートされています。

これが役立つといいのですが!