科学の箱

科学・IT・登山の話題

機械学習

DictVectorizerを使ってカテゴリデータについて特徴抽出をする

投稿日:

都市における温度データを考える。

measure = [
    {'city': 'Dubai', 'temperature': 33.},
    {'city': 'London', 'temperature': 12.},
    {'city': 'San Fransisco', 'temperature': 18.}
]

 

機会学習をする際にカテゴリデータの形式を”処理”しやすい形式に変換することはよく見られる。この際に考えられる方法は何があるか。

  1. 頭文字
  2. いくつかの文字を利用したコード
  3. 数字とのマッピング

まず1)については都市の数が増えたときに重なる可能性がある。次に2)についてはコードを自分で管理するために面倒くさい。

そうなると3)の数字とのマッピングがある。

measure_x = [
    {'city': 10, 'temperature': 33.},
    {'city': 12, 'temperature': 12.},
    {'city': 20, 'temperature': 18.}
]

 

ここに落とし穴がある。数字にすると、重なることもないし、都市の数が増えたら、数字を増やしていけばよい。しかし多くの学習器は数字の場合には、順序と計算ができることが前提になる。

例えば順序という意味では、Dubai < London < San Franciscoである。また計算ができるとは例えばDubai – Londonといった計算ができるということだ。

このようなカテゴリデータについて特徴抽出をするためにはDictVectorizeが利用できる。

sklearn.feature_extraction.DictVectorizer — scikit-learn 0.21.3 …

class sklearn.feature_extraction.DictVectorizer(dtype=<class ‘numpy.float64’>, separator=’=’, sparse=True, sort=True)

使い方はいたって簡単である。dtypeにカテゴリデータのフォーマットを指定する。またカテゴリ値が極端に大きい場合もしくはパフォーマンスが悪い場合を除けば、sparse=Falseを指定するほうが取り扱いやすい。

from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False, dtype=int)
vec.fit_transform(measure)

#
array([[ 1,  0,  0, 33],
       [ 0,  1,  0, 12],
       [ 0,  0,  1, 18]], dtype=int32)

 

少々わかりにくいが1~3列目がcityを表している。確認するためにはget_feature_names()を利用すればよい。

print(vec.get_feature_names())
# ['city=Dubai', 'city=London', 'city=San Fransisco', 'temperature']

 

カテゴリデータが増えた場合にはsparse=Trueとする。これによりスパース行列が作成される。

from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=True, dtype=int)
X = vec.fit_transform(measure)
# <3x4 sparse matrix of type '<class 'numpy.int32'>'
  with 6 stored elements in Compressed Sparse Row format>

print(X)
#
  (0, 0) 1
  (0, 3) 33
  (1, 1) 1
  (1, 3) 12
  (2, 2) 1
  (2, 3) 18

行列の内容を確認するには、toarray()で変換する。

X.toarray()
# array([[ 1,  0,  0, 33],
       [ 0,  1,  0, 12],
       [ 0,  0,  1, 18]], dtype=int32)

 

メタ情報

inarticle



メタ情報

inarticle



-機械学習
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

スピアマンの順位相関

スピアマンの順位相関を利用して県のデータを使った相関係数を出してみる。 持家普及率を自動車普及率のランキングは、土地がせまいほど低く、有効な土地が広いほど高くなるために順位相関があると考えられる。 持 …

no image

手書き数字データについて次元縮約および教師ありモデルの構築

前回手書き数字データについてイメージで確認した結果、人の目で確認する分には区別ができる。では機械学習ではどのように実施していくのか。 今回は以下の内容について説明する。 多様体学習による次元縮約 ナイ …

no image

線形回帰とリッジ回帰とラッソ回帰の違い

用語 線形回帰 データから平均二乗誤差を最低にするパラメータΘを求めて、直線で回帰すること $$ y = Θ_0 + Θ_1 \times x $$ コスト関数 損失関数とも呼ばれる。実際のデータと予 …

no image

独立性の検定 2つ

ニートの年齢別割合が1996年と2012年で関連性があるか独立性の検定をしてみる。 ニートの割合  1996 2012 15~19歳 9 9 20~24歳 12 17 25~29歳 10 18 30~ …

no image

dataanalysis-002-week4

クラスタリング SVDと組み合わせることでよりクラスに分かれているクラスタリングを実行できる。 散布図でクラスタリングする変数を探す クラスタリング SVDを実行する SVDの結果をクラスタリングに取 …

2019年10月
月 火 水 木 金 土 日
« 9月   11月 »
 123456
78910111213
14151617181920
21222324252627
28293031  

side bar top



アーカイブ

カテゴリー