[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 10. ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ์™€ ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ

2020. 2. 11. 16:55ยท๐Ÿฌ ML & Data/๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹
728x90

 ์ด๋ฒˆ ์„ธ์…˜์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ์ค‘์—์„œ ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ์™€ ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

1. ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ

 ์‹ค์ œ ๋ชจ๋ธ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์ด์œ ๋กœ ๊ฐ’์ด ๋ˆ„๋ฝ๋œ ์ƒ˜ํ”Œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ—ˆ๋‹คํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ๋ˆ„๋ฝ๋œ ๊ฐ’์€ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์— ๋นˆ ๊ณต๊ฐ„์ด๋‚˜ ์˜ˆ์•ฝ๋œ ๋ฌธ์ž์—ด(NULL, NaN)์œผ๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ ์ƒ˜ํ”Œ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ƒ˜ํ”Œ์ด๋‚˜ ํŠน์„ฑ์—์„œ ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 ์ฒซ๋ฒˆ์งธ ๊ณผ์ •์€ ๋‹น์—ฐํžˆ ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ด๊ฒ ์ฃ . ์ผ๋‹จ ์˜ˆ์ œ ๋ฐ์ดํ„ฐ์…‹์„ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. read_csvํ•จ์ˆ˜๋Š” csvํฌ๋งท ๋ฐ์ดํ„ฐ๋ฅผ ํŒ๋‹ค์Šค์˜ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์œผ๋กœ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์˜ˆ์ œ์—์„œ๋Š” ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ๋Š” NaN์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ์ฝ”๋“œ์— ์“ฐ์ธ StringIO ๋Š” csv_data์— ์ €์žฅ๋œ ๋ฌธ์ž์—ด์„ ํŒ๋‹ค์Šค ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์œผ๋กœ ์˜ฎ๊ฒจ์ค๋‹ˆ๋‹ค. 

import pandas as pd
from io import StringIO

csv_data = \
'''A,B,C,D
1.0,2.0,3.0,4.0
5.0,6.0,,8.0
10.0,11.0,12.0,'''

# ํŒŒ์ด์ฌ 2.7์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
# ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ฌธ์ž์—ด์„ ์œ ๋‹ˆ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
# csv_data = unicode(csv_data)

df = pd.read_csv(StringIO(csv_data))
df

๊ทธ๋ฆผ 1. ์˜ˆ์ œ ๋ฐ์ดํ„ฐ์…‹

๋งŒ์•ฝ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด ๋‹น์—ฐํžˆ ์ˆ˜๋™์œผ๋กœ ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ์ฐพ๋Š” ๊ฒŒ ์–ด๋ ต๊ฒ ์ฃ ? ์ด ๊ฒฝ์šฐ์— isnull ๋ฉ”์„œ๋“œ๋Š” ์…€์— ์ˆ˜์น˜๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š”์ง€, ์•„๋‹ˆ๋ฉด ๋ˆ„๋ฝ๋˜์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ด์ฃผ๋Š” ๋ถ€์šธ ๊ฐ’์œผ๋กœ ์ฑ„์›Œ์ง„ dataFrame์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— sum ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ˆ„๋ฝ๋œ ๊ฐ’์˜ ๊ฐœ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

df.isnull().sum()

๊ทธ๋ฆผ 2. isnullํ•จ์ˆ˜

 ๊ทธ ๋‹ค์Œ์€ ๋ˆ„๋ฝ๋œ ๊ฐ’์ด ์žˆ๋Š” ์ƒ˜ํ”Œ์ด๋‚˜ ํŠน์„ฑ์„ ์ œ์™ธํ•˜๋Š” ๊ฒƒ์ธ๋ฐ์š”, ์ด ๋ฐฉ๋ฒ•์ด ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ๊ฐ€์žฅ ํŽธํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๊ฐ’์ด ์žˆ๋Š” ํ–‰์„ ์ œ๊ฑฐํ•  ๋•Œ๋Š” dropna ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

df.dropna(axis=0)
df.dropna(axis=1)

๊ทธ๋ฆผ 3. ํ–‰ ์‚ญ์ œ
๊ทธ๋ฆผ 4. ์—ด ์‚ญ์ œ

 dropna์˜ axis๊ฐ€ 0์ด๋ฉด ๋ˆ„๋ฝ๋œ ๊ฐ’์ด ์žˆ๋Š” ํ–‰์„ ์‚ญ์ œํ•˜๊ณ , axis๊ฐ€ 1์ด๋ฉด NaN์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ๋Š” ์—ด์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ด์™ธ์—๋„ df.dropna(how='all') ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ์—ด์ด NaN์ธ ํ–‰์„ ์‚ญ์ œํ•˜๊ณ , thresh=3์ด๋ผ๊ณ  ์ ์œผ๋ฉด ์‹ค์ˆ˜ ๊ฐ’์ด 3๋ณด๋‹ค ์ž‘์€ ํ–‰์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ subset = ['A']๋ผ๋ฉด A์—ด์— NaN์ด ์žˆ๋Š” ํ–‰๋งŒ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

 ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์˜ ๋‹จ์ ์€ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๋ถ„์„ํ•  ๋•Œ ๋ถˆ์•ˆ์ •ํ•˜๋‹ค๋Š” ์ ๊ณผ ๋„ˆ๋ฌด ๋งŽ์€ ํŠน์„ฑ ์—ด์„ ์‚ญ์ œํ•˜๋ฉด ๋ถ„๋ฅ˜๊ธฐ๊ฐ€ ํด๋ž˜์Šค๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์žƒ์„ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

 ๋”ฐ๋ผ์„œ, ์ƒ˜ํ”Œ์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ํŠน์„ฑ ์—ด์„ ํ†ต์งธ๋กœ ์ œ๊ฑฐํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ ๋ณด๊ฐ„(interpolation)๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณด๊ฐ„ ๊ธฐ๋ฒ•์„ ์ด์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ”ํ•œ ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ํ‰๊ท ์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ์—ด์˜ ์ „์ฒด ํ‰๊ท ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด์ฃ . ์‚ฌ์ดํ‚ท๋Ÿฐ imputer ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

from sklearn.preprocessing import Imputer

imr = Imputer(missing_values='NaN', strategy='mean', axis=0)
imr = imr.fit(df.values)
imputed_data = imr.transform(df.values)
imputed_data

๊ทธ๋ฆผ 5. ๋ณด๊ฐ„ ๊ธฐ๋ฒ•์„ ํ†ตํ•œ ํ‰๊ท  ์ ์šฉ

 ์—ฌ๊ธฐ์„œ๋Š” NaN๊ฐ’์„ ๊ฐ ํŠน์„ฑ ์—ด๋งˆ๋‹ค ๊ณ„์‚ฐํ•œ ํ‰๊ท ์œผ๋กœ ์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. strategy ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” mean๋ง๊ณ ๋„ median, most_frequent๋ฅผ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. most_frequent๋Š” ๊ฐ€์žฅ ๋งŽ์ด ๋‚˜ํƒ€๋‚œ ๊ฐ’์œผ๋กœ ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. median์€ ๋ง ๊ทธ๋Œ€๋กœ ์ค‘๊ฐ„๊ฐ’์ด์ฃ .

 ์œ„์—์„œ ์‚ฌ์ดํ‚ท๋Ÿฐ์˜ Imputer ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹œ์ฃ ? Imputer ํด๋ž˜์Šค๋Š” ์‚ฌ์ดํ‚ท๋Ÿฐ ๋ณ€ํ™˜๊ธฐ(transformer)ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜๊ธฐ์˜ ์ฃผ์š”ํ•œ ๋ฉ”์„œ๋“œ๋Š” fit๊ณผ transform์ž…๋‹ˆ๋‹ค. fit์€ ์ด์ „ ์„ธ์…˜์—์„œ๋„ ๋งŽ์ด ๋ณด์…จ๋‹ค์‹œํ”ผ ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๊ณ , transform๋ฉ”์„œ๋“œ๋Š” ํ•™์Šตํ•œ ๋ชจ๋ธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ 6์€ ๋ณ€ํ™˜๊ธฐ๊ฐ€ ๋ฐ์ดํ„ฐ ์…‹๋“ค์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 6. ์‚ฌ์ดํ‚ท๋Ÿฐ ๋ณ€ํ™˜๊ธฐ ํ›ˆ๋ จ๊ณผ ๋ณ€ํ™˜๊ณผ์ •

 ์ด์ „ ์„ธ์…˜๋“ค์—์„œ ์‚ฌ์šฉํ•œ ๋ถ„๋ฅ˜๊ธฐ๋Š” ๋ณ€ํ™˜๊ธฐ ํด๋ž˜์Šค์™€ ์œ ์‚ฌํ•œ API๋ฅผ ๊ฐ€์ง„ ์ถ”์ •๊ธฐ(estimator)์ž…๋‹ˆ๋‹ค. predict ๋ฉ”์„œ๋“œ๊ฐ€ ์นœ์ˆ™ํ•˜์‹ค ๊ฒƒ ๊ฐ™๋„ค์š”. ์ถ”์ •๊ธฐ๋Š” predict ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์ง€๋งŒ transform ๋ฉ”์„œ๋“œ๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ฅ˜๋ฅผ ์œ„ํ•ด ์ถ”์ •๊ธฐ๋ฅผ ํ›ˆ๋ จํ•  ๋•Œ๋Š” fit์„ ์ด์šฉํ•ด์„œ ๋ชจ๋ธ์˜ ํŒŒ๋ฆฌ๋ฏธํ„ฐ๋ฅผ ํ•™์Šตํ–ˆ๊ณ , ์ง€๋„ํ•™์Šต์—์„œ๋Š” ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•  ๋•Œ ์ถ”๊ฐ€ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ์ œ๊ณตํ•˜๊ณ  predict ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ 7์—์„œ ์ถ”์ •๊ธฐ์™€ ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋น„๊ต ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 7. ์‚ฌ์ดํ‚ท๋Ÿฐ ์ถ”์ •๊ธฐ์˜ ํ›ˆ๋ จ๊ณผ ์˜ˆ์ธก

 

2. ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ

 ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฐ์ดํ„ฐ์…‹๋“ค์„ ๋Œ์ด์ผœ๋ณด๋ฉด, ์ „๋ถ€ ์ˆ˜์น˜ํ˜• ๋ฐ์ดํ„ฐ์˜€๋‹ค๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์•„์‹ค ์ˆ˜ ์žˆ์„ํ…๋ฐ์š”, ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฒ”์ฃผํ˜• ํŠน์„ฑ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์น˜ ๊ณ„์‚ฐ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 ์ฒ˜์Œ์œผ๋กœ, ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ์— ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ๊ณผ ์—†๋Š” ๊ฒƒ์„ ๊ตฌ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ํŠน์„ฑ์€ ์ฐจ๋ก€๋Œ€๋กœ ๋†“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํฌ๊ธฐ๋ฅผ ์ˆœ์„œ๋กœ S, M, L ์œผ๋กœ ์ฐจ๋ก€๋Œ€๋กœ ๋†“์„ ์ˆ˜ ์žˆ๊ฒ ์ฃ . ๋ฐ˜๋Œ€๋กœ ์ˆœ์„œ๊ฐ€ ์—†๋Š” ํŠน์„ฑ์€ ์ฐจ๋ก€๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒ‰๊น”๊ณผ ๊ฐ™์€ ๊ฒƒ์ด์ฃ . ์ผ๋‹จ ์˜ˆ์ œ ๋Œ€์ดํ„ฐ์…‹์„ ๋ณผ๊นŒ์š”?

import pandas as pd

df = pd.DataFrame([['green', 'M', 10.1, 'class1'],
                   ['red', 'L', 13.5, 'class2'],
                   ['blue', 'XL', 15.3, 'class1']])

df.columns = ['color', 'size', 'price', 'classlabel']
df

๊ทธ๋ฆผ 8. ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ์…‹

 ์ถœ๋ ฅ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ฒ”์ฃผํ˜• ์ค‘ ์ˆœ์„œ๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ color์™€ ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ size, ์ˆ˜์น˜ํ˜• ๋ฐ์ดํ„ฐ price๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์€ ๋งˆ์ง€๋ง‰ ์—ด์— ์žˆ๋„ค์š”. 

 ๋‹ค์Œ์€ ์ˆœ์„œ ํŠน์„ฑ์„ ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ์š”, ํ•™์Šต ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ˆœ์„œ ํŠน์„ฑ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๋กœ ๋ฐ”๊พธ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ size ํŠน์„ฑ์˜ ์ˆœ์„œ๋ฅผ ์ž๋™์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋งคํ•‘ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹คใ… ใ… . ์—ฌ๊ธฐ์„œ ํŠน์„ฑ๊ฐ„์˜ ์‚ฐ์ˆ ์ ์ธ ์ฐจ์ด๋ฅผ ์•Œ๊ณ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, XL = L + 1 = M + 2๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค.

size_mapping = {'XL': 3,
                'L': 2,
                'M': 1}

df['size'] = df['size'].map(size_mapping)
df

๊ทธ๋ฆผ 8. size ๋งคํ•‘

 ์ด๋ ‡๊ฒŒ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋งคํ•‘๋˜์—ˆ๋„ค์š”! ๋งŒ์•ฝ์— ์ •์ˆ˜ ๊ฐ’์„ ๋‹ค์‹œ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด ๊ฑฐ๊พธ๋กœ ๋งคํ•‘ํ•˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! ๋ฐ”๋กœ inv_size_mapping={v:k for k, v in size_mapping.items()}๋ฅผ ์ •์˜ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋ณผ๊นŒ์š”?

inv_size_mapping = {v: k for k, v in size_mapping.items()}
df['size'].map(inv_size_mapping)

๊ทธ๋ฆผ 9. ๊ฑฐ๊พธ๋กœ ๋งคํ•‘

 ๋‹ค์Œ์€ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํด๋ ˆ์Šค ๋ ˆ์ด๋ธ”์„ ์ •์ˆ˜๋กœ ์ธ์ฝ”๋”ฉ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ดํ‚ท๋Ÿฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ถ„๋ฅ˜ ์ถ”์ •๊ธฐ ๋Œ€๋ถ€๋ถ„์€ ์ž๋™์œผ๋กœ ๋ ˆ์ด๋ธ”์„ ์ •์ˆ˜๋กœ ๋ฐ”๊ฟ”์ฃผ์ง€๋ฉด ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ์ •์ˆ˜ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. 

 ํด๋ž˜์Šค ๋ ˆ์ด๋ธ” ์ธ์ฝ”๋”ฉ์€ ์•ž์˜ ๋งคํ•‘๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์—๋Š” ์ˆœ์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. enumerate๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ 0๋ถ€ํ„ฐ ํ• ๋‹นํ•ด์ฃผ๊ณ , ๋งคํ•„ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

import numpy as np

class_mapping = {label: idx for idx, label in enumerate(np.unique(df['classlabel']))}
class_mapping

df['classlabel'] = df['classlabel'].map(class_mapping)
df

๊ทธ๋ฆผ 10. ํด๋ž˜์Šค ์ธ์ฝ”๋”ฉ

 ์ด๋Ÿฐ ์‹์œผ๋กœ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜์‹œ์ผœ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งคํ•‘ ๋”•์…”๋„ˆ๋ฆฌ์˜ ํ‚ค์™€ ๊ฐ’์„ ๋’ค์ง‘์–ด์„œ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ๋‹ค์‹œ ์›๋ณธ ๋ฌธ์ž์—ด๋กœ๋„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

inv_class_mapping = {v: k for k, v in class_mapping.items()}
df['classlabel'] = df['classlabel'].map(inv_class_mapping)
df

 

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์‚ฌ์ดํ‚ท๋Ÿฐ์˜ LavelEncoder ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. fit_transform ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด fit๊ณผ tranform์„ ํ•ฉ์ณ๋†“์€ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ inverse_transform๋ฉ”์„œ๋“œ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from sklearn.preprocessing import LabelEncoder

# class label encoder
class_le = LabelEncoder()
y = class_le.fit_transform(df['classlabel'].values)
y

# inverse
class_le.inverse_transform(y)

 

 ๋‹ค์Œ์œผ๋กœ๋Š” ์ค‘์š”ํ•œ ๊ฐœ๋…์ธ ์›-ํ•ซ ์ธ์ฝ”๋”ฉ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ˆœ์„œ๊ฐ€ ์—†๋Š” ํŠน์„ฑ์—๋„ ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋กœ ๋ณผ๊นŒ์š”?

X = df[['color', 'size', 'price']].values

color_le = LabelEncoder()
X[:, 0] = color_le.fit_transform(X[:, 0])
X

 

 ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด blue๊ฐ€ 0, green์€ 1, red๋Š” 2๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ž ์ด์ œ ์ด ๋ฐฐ์—ด์„ ๋ถ„๋ฅ˜๊ธฐ์— ๋„ฃ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฒ ์ฃ . ๋ฌด์Šจ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ๊นŒ์š”? ์ปฌ๋Ÿฌ ๊ฐ’์—๋Š” ์ˆœ์„œ๊ฐ€ ์—†์ง€๋งŒ ๋ถ„๋ฅ˜๊ธฐ๋Š” red, green, blue ์ˆœ์„œ๋กœ ํฌ๋‹ค๊ณ  ์ƒ๊ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฑด ์˜ณ์ง€ ์•Š์€ ๊ฒฐ๊ณผ์ง€๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜๋Š” ์žˆ๊ฒ ์ฃ . ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ์ตœ์„ ์ด ์•„๋‹™๋‹ˆ๋‹ค.

 ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ์›-ํ•ซ ์ธ์ฝ”๋”ฉ(one-hot encoding)์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ํŠน์„ฑ์— ๋“ค์–ด์žˆ๋Š” ๊ณ ์œ ํ•œ ๊ฐ’๋งˆ๋‹ค ์ƒˆ๋กœ์šด dummy ํŠน์„ฑ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์ฃ . ์˜ˆ๋ฅผ ๋“ค๋ฉด color ํŠน์„ฑ์„ ์„ธ ๊ฐœ์˜ ์ƒˆ๋กœ์šด ํŠน์„ฑ green, blue, red๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ง„ ๊ฐ’์œผ๋กœ ํ‘œํ˜„ํ•  ๋•Œ, blue๋Š” blue = 1, green = 0, red = 0์œผ๋กœ ์ธ์ฝ”๋”ฉ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์ดํ‚ท๋Ÿฐ์—์„œ๋Š” preprocessing ๋ชจ๋“ˆ์˜ OneHotEncoder์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from sklearn.preprocessing import OneHotEncoder

ohe = OneHotEncoder(categorical_features=[0])
ohe.fit_transform(X).toarray()

๊ทธ๋ฆผ 11. ์›ํ•ซ ์ธ์ฝ”๋”ฉ

 
 OneHotEncoder์„ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ํŠน์„ฑ ์—ด์„ categorical_features์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์›ํ•ซ์ธ์ฝ”๋”์˜ transform์€ ํฌ์†Œ ํ–‰๋ ฌ(sparse matrix)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด ํฌ์†Œ ํ–‰๋ ฌ์˜ toarray๋กœ ๋„˜ํŒŒ์ด ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ์†Œ ํ–‰๋ ฌ์€ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ 0์ด ๋งŽ์„ ๋•Œ์š”. ์‚ฌ์ดํ‚ท๋Ÿฐ์€ ๋งŽ์€ ํฌ์†Œ ํ–‰๋ ฌ์„ ์ง€์›’๋ฐ˜๋””๋‹ค. OneHotEncoder(... , sparse=False)์ฒ˜๋Ÿผ ์ธ์ฝ”๋”๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ๋ฐ”๋กœ ๋ฐฐ์—ด์„ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 ์›ํ•ซ ์ธ์ฝ”๋”ฉ์œผ๋กœ ๋”๋ฏธ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์€ ํŒ๋‹ค์Šค์˜ get_dummies ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. DataFrame์— ์ ์šฉํ•˜๋ฉด get_dummies ๋ฉ”์„œ๋“œ๋Š” ๋ฌธ์ž์—ด ์—ด๋งŒ ๋ณ€ํ™˜ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค.

pd.get_dummies(df[['price', 'color', 'size']])

๊ทธ๋ฆผ 12. ํŒ๋‹ค์Šค ์›ํ•ซ ์ธ์ฝ”๋”ฉ

 ์›ํ•ซ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋‹ค์ค‘ ๊ณต์„ ์„ฑ(mulicollinearity)๋ฅผ ์ƒ๊ฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์—ญํ–‰๋ ฌ์„ ๊ตฌํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ํŠน์„ฑ๊ฐ„ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ๋†’์œผ๋ฉด ์—ญํ–‰๋ ฌ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ํž˜๋“ค์–ด ์ˆ˜์น˜์  ๋ถˆ์•ˆ์ •์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค. ์ด ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ธ์ฝ”๋”ฉ๋œ ๋ฐฐ์—ด์˜ ์—ด ํ•˜๋‚˜๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ color_blue๋ฅผ ์‚ญ์ œํ•ด๋„ color_green์€ 0์ด๊ณ  color_red๊ฐ€ 0์ด๋ฉด blue๊ฐ€ 1์ž„์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ์—๋Š” ์†์‹ค์ด ์—†์Šต๋‹ˆ๋‹ค.

 get_dummies๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ drop_first๋ฅผ true๋กœ ์„ค์ •ํ•ด ์ฒซ ๋ฒˆ์งธ ์—ด์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pd.get_dummies(df[['price', 'color', 'size']], drop_first=True)

 

OneHotEncoder์€ ์—ด์„ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋„˜ํŒŒ์ด ๋ฐฐ์—ด์„ ์Šฌ๋ผ์ด์‹ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ohe = OneHotEncoder(categorical_features=[0])
ohe.fit_transform(X).toarray()[:, 1:]

๊ทธ๋ฆผ 13. ์Šฌ๋ผ์ด์‹ฑ

 


์ด๋ ‡๊ฒŒ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ์™€ ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์‹ค์ „์—์„œ ๋งŽ์ด ์“ฐ์ด๋Š” ๊ฐœ๋…์ด๊ณ , 
OneHotEndoding ์—ญ์‹œ ์ค‘์š”ํ•˜๊ฒŒ ๋‹ค๋ค„์ง€๋Š” ๊ฐœ๋…์ด๋‹ˆ ์ž˜ ์•Œ์•„๋‘์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค! ๋‹ค์Œ ์„ธ์…˜๋ถ€ํ„ฐ๋Š” ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ์— ๊ด€ํ•œ ๊ธ€์„ ๋“ค๊ณ  ์˜ค๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”!

728x90
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿฌ ML & Data > ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 12. ์ˆœ์ฐจ ํŠน์„ฑ ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ ํŠน์„ฑ ์ค‘์š”๋„ ์‚ฌ์šฉ  (0) 2020.02.16
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 11. ๋ฐ์ดํ„ฐ์…‹ ๋‚˜๋ˆ„๊ธฐ์™€ ํŠน์„ฑ ์Šค์ผ€์ผ๊ณผ ์„ ํƒ  (0) 2020.02.13
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 9. ๊ฒฐ์ • ํŠธ๋ฆฌ ํ•™์Šต  (0) 2020.02.11
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 8. ์ตœ๋Œ€ ๋งˆ์ง„ ๋ถ„๋ฅ˜์™€ ๋น„์„ ํ˜• ๋ฌธ์ œ ํ’€๊ธฐ  (0) 2020.02.07
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹]Session 7. ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€(logistic regression)  (0) 2020.02.05
'๐Ÿฌ ML & Data/๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 12. ์ˆœ์ฐจ ํŠน์„ฑ ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ ํŠน์„ฑ ์ค‘์š”๋„ ์‚ฌ์šฉ
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 11. ๋ฐ์ดํ„ฐ์…‹ ๋‚˜๋ˆ„๊ธฐ์™€ ํŠน์„ฑ ์Šค์ผ€์ผ๊ณผ ์„ ํƒ
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 9. ๊ฒฐ์ • ํŠธ๋ฆฌ ํ•™์Šต
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 8. ์ตœ๋Œ€ ๋งˆ์ง„ ๋ถ„๋ฅ˜์™€ ๋น„์„ ํ˜• ๋ฌธ์ œ ํ’€๊ธฐ
darly213
darly213
ํ˜ธ๋ฝํ˜ธ๋ฝํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์ž
  • darly213
    ERROR DENY
    darly213
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (97)
      • ๐Ÿฌ ML & Data (50)
        • ๐ŸŒŠ Computer Vision (2)
        • ๐Ÿ“ฎ Reinforcement Learning (12)
        • ๐Ÿ“˜ ๋…ผ๋ฌธ & ๋ชจ๋ธ ๋ฆฌ๋ทฐ (8)
        • ๐Ÿฆ„ ๋ผ์ดํŠธ ๋”ฅ๋Ÿฌ๋‹ (3)
        • โ” Q & etc. (5)
        • ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹ (20)
      • ๐Ÿฅ Web (21)
        • โšก Back-end | FastAPI (2)
        • โ›… Back-end | Spring (5)
        • โ” Back-end | etc. (9)
        • ๐ŸŽจ Front-end (4)
      • ๐ŸŽผ Project (8)
        • ๐ŸงŠ Monitoring System (8)
      • ๐Ÿˆ Algorithm (0)
      • ๐Ÿ”ฎ CS (2)
      • ๐Ÿณ Docker & Kubernetes (3)
      • ๐ŸŒˆ DEEEEEBUG (2)
      • ๐ŸŒ  etc. (8)
      • ๐Ÿ˜ผ ์‚ฌ๋‹ด (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๋ฐฉ๋ช…๋ก
    • GitHub
    • Notion
    • LinkedIn
  • ๋งํฌ

    • Github
    • Notion
  • ๊ณต์ง€์‚ฌํ•ญ

    • Contact ME!
  • 250x250
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
darly213
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 10. ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ์™€ ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”