はじめに
色情報が"Green"や"White"などの文字列で表現された特徴量があるとする。
これを特徴量としてベクトル変換する際、以下のような方法が考えられる。
- one-hot変換する
- いくつかの色カテゴリに分類する。
問題点として1の手法では次元が多くなってしまい、2の方法では手動でカテゴリを適切に設定する必要がある。
この記事では、色情報をwebcolorsというライブラリを使ってRGB変換し、それぞれを比例尺度の特徴量とすることを提案する。
表で表すと以下のようなテーブルがあった際に
color | |
---|---|
1 | white |
2 | blue |
3 | red |
4 | green |
以下に変換する
red | green | blue | |
---|---|---|---|
1 | 255 | 255 | 255 |
2 | 0 | 0 | 0 |
3 | 255 | 192 | 203 |
4 | 255 | 165 | 0 |
こうすると色情報を比例尺度で表すことができるため有利な気がする。
実装
webcolorsは色文字列を受け取ってrgbを返してくれるライブラリである。これを利用することでRGB変換を実現する。
実装例をいかに示す。
# 名前をRGB変換する
import webcolors
def convert_color_name_to_rgb(color_name: str):
color_name = color_name.lower().replace(" ","")
try:
return webcolors.html5_parse_legacy_color(color_name).red, webcolors.html5_parse_legacy_color(color_name).green, webcolors.html5_parse_legacy_color(color_name).blue, False
except ValueError:
return 125,125,125, True
df[['color-red','color-green','color-blue','color-ValueError']] = df.apply(lambda x: convert_color_name_to_rgb(x["color"]),axis=1 ,result_type='expand')
df = df.drop('color', axis=1)
# ValueErrorは削除する
df = df[df["color-ValueError"] == False]
df = df.drop("color-ValueError", axis=1)
注意
webcolorsでうまく変換できない色があるっぽい?