Search
๐Ÿ—ƒ๏ธ

Introduction

์ƒ์„ฑ์ผ
2025/03/18 16:58
ํƒœ๊ทธ
๋ฐ์ดํ„ฐ๋งˆ์ด๋‹
์ž‘์„ฑ์ž

Introduction

โ€ข
Datamining Process
โ—ฆ
๋ชฉ์  ๊ฒฐ์ • โ†’ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ โ†’ ๋ฐ์ดํ„ฐ ํƒ์ƒ‰ ๋ฐ ์ •์ œ โ†’ ๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹ ๋ฐฉ๋ฒ• ๊ฒฐ์ • โ†’ ์ตœ์ข… ๋ชจ๋ธ ๊ฒฐ์ • โ†’ ์„ฑ๋Šฅ ํ‰๊ฐ€ โ†’ ์ ์šฉ
โ€ข
Programming vs Machine Learning
โ—ฆ
์ „ํ†ต์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๊ทœ์น™์„ ์ž‘์„ฑํ•˜์—ฌ ์ปดํ“จํ„ฐ์— ์ž…๋ ฅํ•œ๋‹ค. ์ปดํ“จํ„ฐ๋Š” ์ž…๋ ฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์— ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•œ๋‹ค.
โ—ฆ
๋จธ์‹ ๋Ÿฌ๋‹์€ ์›ํ•˜๋Š” ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ทœ์น™์„ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ž…๋ ฅํ•˜์—ฌ ๋ชจ๋ธ์„ ํ•™์Šตํ•œ๋‹ค. ํ•™์Šต๋œ ๋ชจ๋ธ์€ ์ƒˆ๋กญ๊ฒŒ ์ฃผ์–ด์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์˜ˆ์ธก/๋ถ„๋ฅ˜ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Main idea

โ€ข
๋ถ„๋ฅ˜์™€ ์˜ˆ์ธก(ํšŒ๊ท€)
โ—ฆ
๋ถ„๋ฅ˜
โ–ช
๋ถ„๋ฅ˜๋Š” ๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค Class์— ์†ํ•˜๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
โ–ช
๋ถ„๋ฅ˜ ๋ชจ๋ธ ํ•™์Šต์€ x(๋ฐ์ดํ„ฐ) ๋ฅผ y(๋ฒ”์ฃผ)๋กœ ์ ์ ˆํ•˜๊ฒŒ mappingํ•˜๋Š” ํ•จ์ˆ˜ f๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์ด๋‹ค.
โ–ช
๋”ฐ๋ผ์„œ y=y^y = \hat y ๊ฐ€ ๋˜๋„๋ก ๋ชจ๋ธ์„ ํ•™์Šตํ•œ๋‹ค.
โ—ฆ
์˜ˆ์ธก(ํšŒ๊ท€)
โ–ช
์˜ˆ์ธก(ํšŒ๊ท€)๋Š” ๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ์—ฐ์†์ ์ธ ๊ฐ’์— ๊ฐ€๊นŒ์šด์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
โ–ช
ํšŒ๊ท€ ๋ชจ๋ธ์˜ ํ•™์Šต์€ x(๋ฐ์ดํ„ฐ) ๋ฅผ y(์—ฐ์†ํ˜•)๋กœ ์ ์ ˆํ•˜๊ฒŒ mappingํ•˜๋Š” ํ•จ์ˆ˜ f๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์ด๋‹ค.
โ–ช
๋”ฐ๋ผ์„œ yโˆ’y^y-\hat y๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ๋ชจ๋ธ์„ ํ•™์Šตํ•œ๋‹ค.
โ€ข
์—ฐ๊ด€ ๊ทœ์น™๊ณผ ์ถ”์ฒœ์‹œ์Šคํ…œ
โ—ฆ
์—ฐ๊ด€์„ฑ ๋ถ„์„
โ–ช
์–ด๋–ค ์•„์ดํ…œ๋“ค์ด ํ•จ๊ป˜ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋Š”๊ฐ€?๋ฅผ ์ฐพ๋Š” ๊ธฐ๋ฒ•
โ–ช
๋งˆํŠธ์—์„œ๋Š” ์ œํ’ˆ ๊ฐ„ ์—ฐ๊ด€์„ฑ์„ ๋ถ„์„ํ•˜์—ฌ ์—ฐ๊ด€์„ฑ์ด ๋†’์€ ์ œํ’ˆ์„ ๊ฐ™์€ ์œ„์น˜์— ์ง„์—ดํ•œ๋‹ค.
โ—ฆ
์ถ”์ฒœ ์‹œ์Šคํ…œ-ํ˜‘์—… ํ•„ํ„ฐ๋ง
โ–ช
์‚ฌ์šฉ์ž๋“ค์˜ ์„ ํ˜ธ๋„๋ฅผ ํ•™์Šตํ•ด์„œ ๊ฐœ์ธํ™”๋œ ์ถ”์ฒœ์„ ํ•˜๋Š” ๊ธฐ๋ฒ•
โ–ช
A ์‚ฌ์šฉ์ž๊ฐ€ B ์‚ฌ์šฉ์ž์™€ ์œ ์‚ฌํ•œ ์ทจํ–ฅ์ด๋ผ๋ฉด, B๊ฐ€ ๋ณธ ์˜ํ™”๋ฅผ A์—๊ฒŒ ์ถ”์ฒœ
โ€ข
๋ฐ์ดํ„ฐ ์ถ•์†Œ์™€ ์ฐจ์› ์ถ•์†Œ
โ—ฆ
๋งŽ์€ ์ˆ˜์ด ๊ด€์ธก์น˜๋ฅผ ์ ์€ ์ˆ˜์˜ ๊ทธ๋ฃน์œผ๋กœ ์š”์•ฝํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ์ดํ„ฐ ์ถ•์†Œ๋ผ๊ณ  ํ•˜๋ฉฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ ๊ตฐ์ง‘ ๋ถ„์„์ด ์žˆ๋‹ค.
โ—ฆ
๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๊ณผ์ •์„ ์ฐจ์› ์ถ•์†Œ๋ผ ํ•˜๋ฉฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ PCA(์ฃผ์„ฑ๋ถ„ ๋ถ„์„)์ด ์žˆ๋‹ค.
โ€ข
๋ฐ์ดํ„ฐ ํƒ์ƒ‰๊ณผ ์‹œ๊ฐํ™”
โ—ฆ
๋ฐ์ดํ„ฐ ํƒ์ƒ‰ ์‹œ ๊ฐ ๋ณ€์ˆ˜์˜ ํŠน์ง•, ๋ณ€์ˆ˜ ์‚ฌ์ด์˜ ๊ด€๋ จ์„ฑ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
โ—ฆ
์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•ด ์ด์ƒ์น˜ ๋“ฑ์˜ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
โ€ข
์ง€๋„ํ•™์Šต๊ณผ ๋น„์ง€๋„ํ•™์Šต
โ—ฆ
์ง€๋„ํ•™์Šต
โ–ช
์ •๋‹ต ๊ฐ’ y๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ x๋ฅผ y๋กœ mappingํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ•™์Šตํ•˜๋Š” ๋ฐฉ๋ฒ• (ํ•จ์ˆ˜์˜ parameter๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•)
โ–ช
๋Œ€ํ‘œ์ ์œผ๋กœ ๋ฒ”์ฃผํ˜• ์ •๋‹ต ๊ฐ’์„ ๊ฐ€์ง„ ๋ถ„๋ฅ˜(๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€, SVM ๋“ฑ)์™€ ์—ฐ์†ํ˜• ์ •๋‹ต ๊ฐ’์„ ๊ฐ€์ง„ ํšŒ๊ท€(๋‹จ์ˆœ ์„ ํ˜• ํšŒ๊ท€, ๋‹คํ•ญ ํšŒ๊ท€ ๋“ฑ)๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.
โ—ฆ
๋น„์ง€๋„ํ•™์Šต
โ–ช
์ž…๋ ฅ๊ฐ’ x์— ๋Œ€ํ•ด์„œ ๋‚ด์žฌ๋œ ๊ตฌ์กฐ/ํŒจํ„ด์„ ์ฐพ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค.
โ–ช
์ •๋‹ต ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฒ”์ฃผํ˜• ์ถœ๋ ฅ๊ฐ’(์ž ์žฌ๋ณ€์ˆ˜)๋ฅผ ๊ฐ€์ง„ Clustering๊ณผ ์—ฐ์†ํ˜• ์ถœ๋ ฅ๊ฐ’์„ ๊ฐ€์ง„ PCA๋กœ ํฌ๊ฒŒ ๊ตฌ๋ถ„๋œ๋‹ค.

Preprocessing

โ€ข
๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
โ—ฆ
์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋Š” ๊ด€์ธก์น˜์™€ ๋ณ€์ˆ˜๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ๊ด€์ธก์น˜๋Š” ํ–‰, ๋ณ€์ˆ˜๋Š” ์—ด์— ์œ„์น˜ํ•œ๋‹ค.
โ€ข
Pandas๋ฅผ ํ™œ์šฉํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ถ„์„
import pandas as pd df = pd.read_csv('dmba/WestRoxbury.csv') # ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ df.shape # ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํ™•์ธ df.head() # ์ฒ˜์Œ 5๊ฐœ ํ–‰ ํ™•์ธ df.describe() # ๊ฐ์ข… ํ†ต๊ณ„๋Ÿ‰ ์š”์•ฝ df = df.rename(columns={'TOTAL VALUE':'TOTAL_VALUE'}) # ๋ณ€์ˆ˜๋ช… ๋ณ€๊ฒฝ df.columns = [s.strip().replace(' ','_') for s in df.columns] # 1. ์•ž ๋’ค ๊ณต๋ฐฑ ์ œ๊ฑฐ 2. ์ค‘๊ฐ„ ๊ณต๋ฐฑ _๋กœ ๋ณ€๊ฒฝ # ์Šฌ๋ผ์ด์‹ฑ (๋™์ผ ๊ฒฐ๊ณผ) df['TOTAL_VALUE'].iloc[0:10] # iloc (index ๊ธฐ๋ฐ˜ ์ ‘๊ทผ), loc(๋ณ€์ˆ˜๋ช… ๊ธฐ๋ฐ˜ ์ ‘๊ทผ) df.iloc[0:10,0] df.iloc[0:10].TOTAL_VALUE #๋ณ€์ˆ˜๋ช…์— ๊ณต๋ฐฑ์ด ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ # concat (0=rows, 1=columns) pd.concat([df.iloc[0:5,0:2], df.iloc[0:5,6:8]], axis=1) # ํ†ต๊ณ„๋Ÿ‰ ํ™•์ธ df['TOTAL_VALUE'].mean() # ๊ด€์ธก์น˜ ๊ฐœ์ˆ˜ (n_obs) len(df['TOTAL_VALUE'])
Python
๋ณต์‚ฌ
โ€ข
Dataset Sampling/Data imbalance
์ž์›์˜ ํ•œ๊ณ„๋กœ ๋ชจ๋ธ ๊ตฌ์ถ• ์‹œ ๋ชจ๋“  ๊ด€์ธก์น˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ ์ ์€ ๋ฐ์ดํ„ฐ๋กœ๋„ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ–ˆ์„ ๋•Œ์™€ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.
โ—ฆ
Oversampling & Undersampling
โ–ช
๋ถ„๋ฅ˜ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์ง‘๋‹จ ๊ฐ„ ๋ฐ์ดํ„ฐ ๋น„์ค‘์ด ๋ถˆ๊ท ํ˜•ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ ๋ชจ๋ธ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
โ–ช
Oversampling์€ ์ง‘๋‹จ ๊ฐ„ ๋น„์ค‘์ด ๋น„์Šทํ•ด์ง€๋„๋ก ๋น„์ค‘์ด ์ž‘์€ ์ง‘๋‹จ์— ์†ํ•˜๋Š” ๊ด€์ธก๊ฐ’์„ ๋žœ๋ค์œผ๋กœ ์žฌ์ถ”์ถœํ•˜๊ฑฐ๋‚˜ ์†Œ์ˆ˜ ์ง‘๋‹จ์— ๋” ํฐ ๊ฐ€์ค‘์น˜๋ฅผ ์ฃผ์–ด ์ถ”์ถœํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. (์˜ˆ. SMOTE)
โ–ช
Undersampling์€ ๋น„์ค‘์ด ํฐ ์ง‘๋‹จ์— ์†ํ•˜๋Š” ๊ด€์ธก์น˜๋ฅผ ๋žœ๋ค์œผ๋กœ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
w = [0.9 if rooms>10 else 0.01 for rooms in df.ROOMS ] # ๋ฐฉ์ด 10๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ๊ฐ€์ค‘์น˜ 0.9 df.sample(5,weights=w)
Python
๋ณต์‚ฌ
โ—ฆ
Sampling ๋ฟ ์•„๋‹ˆ๋ผ ์˜ค๋ถ„๋ฅ˜์— ๊ฐ€์ค‘์น˜๋ฅผ ์ฃผ์–ด ๋ถˆ๊ท ํ˜• ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
โ–ช
์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ๊ธฐ ๊ฑฐ๋ž˜ ํƒ์ง€์— ์žˆ์–ด ํƒ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ penalty๋ฅผ ๋”์šฑ ๊ฐ•ํ•˜๊ฒŒ ์ฃผ์–ด ๋ถˆ๊ท ํ˜• ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
โ—ฆ
๋ถˆ๊ท ํ˜• ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š” ์ด์œ 
โ–ช
Accuracy ์ธก๋ฉด์—์„œ ๋ชจ๋“  ์†Œ์ˆ˜ class๋ฅผ ์˜ค๋ถ„๋ฅ˜ํ•˜์—ฌ๋„ ์ „์ฒด Accuracy๋Š” ๋†’์„ ์ˆ˜ ์žˆ๋‹ค.
โ€ข
Variable/obs
โ—ฆ
๋ณ€์ˆ˜ ์ข…๋ฅ˜
โ–ช
์—ฐ์†ํ˜•/๋ฒ”์ฃผํ˜•
โ–ช
๋ฒ”์ฃผํ˜•์˜ ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ๊ฐ„์˜ ์ˆœ์œ„๊ฐ€ ์—†๋Š” ๋ช…๋ชฉํ˜• ๋ณ€์ˆ˜์™€ ์ˆœ์œ„๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ ์ˆœ์„œํ˜• ๋ณ€์ˆ˜๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
df.REMODEL=df.REMODEL.astype('category') # ๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜๋กœ ๋ณ€ํ™˜ df.REMODEL.cat.categories # ๋ฒ”์ฃผ ํ™•์ธ df.REMODEL.dtype
Python
๋ณต์‚ฌ
โ—ฆ
๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ
โ–ช
์ˆœ์„œํ˜• ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ์—ฐ์†ํ˜• ๋ณ€์ˆ˜๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
โ–ช
๋ฒ”์ฃผ์˜ ์ˆœ์œ„๊ฐ€ ์—†๋‹ค๋ฉด ๊ฐ€๋ณ€์ˆ˜(Dummy variable)๋กœ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, One-hot-encoding์„ ์‚ฌ์šฉํ•œ๋‹ค.
โ–ช
์ฃผ๋กœ ์„ ํ˜• ํšŒ๊ท€์™€ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€์—์„œ๋Š” ๊ฐ€๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉฐ, ์‹ ๊ฒฝ๋ง ๊ธฐ๋ฐ˜ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ One-hot-encoding์„ ์ฃผ๋กœ ํ™œ์šฉํ•œ๋‹ค.
df = pd.get_dummies(df,prefix_sep = "_", drop_first=True) # ์ฒซ ๋ฒ”์ฃผ๋ฅผ ๊ฐ€๋ณ€์ˆ˜ ์ƒ์„ฑ์—์„œ ์ œ๊ฑฐํ•˜์—ฌ ์™„์ „๊ณต์„ ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ
Python
๋ณต์‚ฌ
๊ฐ€๋ณ€์ˆ˜ ์ƒ์„ฑ ์‹œ ๋ฒ”์ฃผ ์ˆ˜์™€ ๋™์ผํ•œ ๊ฐ€๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๊ฐ€ ๋‚˜๋จธ์ง€ ๋ณ€์ˆ˜์˜ ์„ ํ˜• ๊ฒฐํ•ฉ์œผ๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ์–ด ์™„์ „ ๊ณต์„ ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์™„์ „ ๊ณต์„ ์„ฑ ๋ฌธ์ œ๋Š” ํŠนํžˆ ํšŒ๊ท€๋ถ„์„์—์„œ ํšŒ๊ท€ ๊ณ„์ˆ˜ ์ถ”์ • ์‹œ ์‚ฌ์šฉํ•˜๋Š” xโ€ฒxx'x ํ–‰๋ ฌ์ด singular matrix๊ฐ€ ๋˜์–ด, ๊ณ„์ˆ˜ ์ถ”์ •์ด ๋ถˆ๊ฐ€ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๋ฏ€๋กœ ์ค‘์š”ํ•œ ๋ฌธ์ œ์ด๋‹ค.
โ—ฆ
๋ณ€์ˆ˜ ์„ ํƒ
โ–ช
๋ชจ๋ธ ๊ตฌ์ถ• ์‹œ ๋งŽ์€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
โ–ช
์˜ˆ๋ฅผ ๋“ค์–ด ํšŒ๊ท€๋ถ„์„์—์„œ๋Š” ์ „์ง„์„ ํƒ๋ฒ•, ํ›„์ง„์ œ๊ฑฐ๋ฒ•, ๋‹จ๊ณ„์„ ํƒ๋ฒ• ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋ธ์— ํฌํ•จ๋  ๋ณ€์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉฐ, ๊ฐ€๋Šฅํ•œ ์ ์€ ์–‘์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ชจ์ˆ˜ ์ถ”์ •์— ๋Œ€ํ•œ ๋ถ„์‚ฐ์„ ๊ฐ์†Œ์‹œํ‚ด์ด ์•Œ๋ ค์ ธ์žˆ๋‹ค.
โ—ฆ
ํ•„์š” ๋ณ€์ˆ˜์™€ ๊ด€์ธก์น˜ ์ˆ˜
โ–ช
ํ†ต๊ณ„์—์„œ๋Š” โ€˜ํŒŒ์›Œ ๊ณ„์‚ฐ์„ ํ†ตํ•ด ๋ชจ์ง‘๋‹จ์„ ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ • ํ‘œ๋ณธ ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹์—์„œ๋Š” ๋ชจ์ง‘๋‹จ์„ ์ž˜ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ •ํ™•ํ•œ ๋ถ„๋ฅ˜/์˜ˆ์ธก์ด ์ค‘์š”ํ•˜๋ฏ€๋กœ ๋” ๋งŽ์€ ๊ด€์ธก์น˜๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.
โ–ช
์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ€์ˆ˜๋‹น 10๊ฐœ์˜ ๊ด€์ธก์น˜๋กœ ์ ์ • ๊ด€์ธก์น˜ ๊ฐœ์ˆ˜๋ฅผ ์ •ํ•œ๋‹ค.
โ–ช
Delmaster-Hancock ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๋ถ„๋ฅ˜ ๋ฌธ์ œ์— ํ•„์š”ํ•œ ์ตœ์†Œ ๊ด€์ธก์น˜๋ฅผ 6ร—mร—p6 \times m \times p๋กœ ์„ค์ •ํ•œ๋‹ค. (๊ฐ๊ฐ์€ Class ๊ฐœ์ˆ˜์™€ ๋ณ€์ˆ˜ ๊ฐœ์ˆ˜)
โ—ฆ
์ด์ƒ์น˜
โ–ช
๊ธฐ์กด ๋ฐ์ดํ„ฐ๋“ค๋กœ๋ถ€ํ„ฐ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์ƒ์น˜๋ผ๊ณ  ํ•œ๋‹ค.
โ–ช
์ผ๋ฐ˜์ ์œผ๋กœ ํ‰๊ท ์œผ๋กœ๋ถ€ํ„ฐ ํ‘œ์ค€ํŽธ์ฐจ์˜ ์„ธ ๋ฐฐ๊ฐ€ ๋„˜๋Š” ๋ฒ”์œ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.
โ–ช
๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋ณ€์ˆ˜๋ณ„๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ/์ตœ๋Œ€๊ฐ’/์ตœ์†Œ๊ฐ’์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
df['TOTAL_VALUE'].max() df['TOTAL_VALUE'].min() df.sort_values(by='TOTAL_VALUE', ascending=False)
Python
๋ณต์‚ฌ
โ—ฆ
๊ฒฐ์ธก์น˜
โ–ช
๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ด€์ธก์น˜ ์ „์ฒด๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ํ‰๊ท /์ค‘์•™๊ฐ’ ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋Œ€์ฒดํ•œ๋‹ค.
โ–ช
๊ฐ’์„ ๋Œ€์ฒดํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ๋ถ„์‚ฐ์ด ์ž‘์•„์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
# ๊ฒฐ์ธก์น˜ ์ƒ์„ฑ m_rows = df.sample(10).index df.loc[m_rows,'BEDROOMS'] = np.nan print(df['BEDROOMS'].count()) # ๊ฒฐ์ธก์น˜ ์ œ๊ฑฐ df_new = df.dropna() print(df_new['BEDROOMS'].count()) # ๊ฒฐ์ธก์น˜ ์ค‘์•™๊ฐ’ ๋Œ€์ฒด med = df['BEDROOMS'].median() df.BEDROOMS = df.BEDROOMS.fillna(value=med) print(df['BEDROOMS'].count())
Python
๋ณต์‚ฌ
โ—ฆ
ํ‘œ์ค€ํ™”
โ–ช
์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ ์ •๊ทœํ™” ๊ณผ์ •์€ ๊ฐ ๊ด€์ธก์น˜์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ํ‰๊ท ๊ฐ’์„ ๋นผ๊ณ  ํ‘œ์ค€ํŽธ์ฐจ๋กœ ๋‚˜๋ˆ  z-score๋ฅผ ์–ป๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.
โ–ช
๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ [0,1] ์Šค์ผ€์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์กด์žฌํ•œ๋‹ค.
โ–ช
์ •๊ทœํ™”/ํ‘œ์ค€ํ™”๋Š” ๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ์œ„ (์˜ˆ. m์™€ km)๋กœ ์ž‘์„ฑ๋œ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ์ž‘์—…์ด๋‹ค.
# pandas df1 = pd.read_csv('dmba/WestRoxbury.csv') df1 = df.rename(columns={'TOTAL VALUE':'TOTAL_VALUE'}) df1.columns = [s.strip().replace(' ','_') for s in df.columns] norm_df = (df1-df1.mean())/df1.std() norm_df # scikit-learn # train data -> fit_transform, validation data -> transform # validation data์— train data์™€ ๊ฐ™์€ ์ˆ˜์ค€์˜ scaling์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•จ scaler = StandardScaler() norm_df = pd.DataFrame(scaler.fit_transform(df1), index= df1.index, columns = df1.columns) #np_array -> pandas norm_df # pandas norm_df = (df1-df1.min())/(df1.max()-df1.min()) norm_df # scikit-learn scaler = MinMaxScaler() norm_df = pd.DataFrame(scaler.fit_transform(df1), index= df1.index, columns = df1.columns) norm_df
Python
๋ณต์‚ฌ

Overfitting/Underfitting

โ€ข
Overfitting
โ—ฆ
Train data error๋Š” ๋‚ฎ์œผ๋‚˜, Test data error๊ฐ€ ๋†’์€ ๊ฒฝ์šฐ
โ—ฆ
Low Bais, High Variance
โ—ฆ
๊ด€์ธก์น˜์˜ ์ˆ˜๊ฐ€ ๋ณ€์ˆ˜์˜ ์ˆ˜๋ณด๋‹ค ์ ์„ ๊ฒฝ์šฐ ๋ฐœ์ƒ
โ€ข
Underfitting
โ—ฆ
Train data error, Test data error๊ฐ€ ๋†’์€ ๊ฒฝ์šฐ
โ—ฆ
High Bais, Low Variance
โ‡’ ์ด๋“ค์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๋ฐ์ดํ„ฐ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.
โ€ข
Train/Validation/Test Data
โ—ฆ
์ ํ•ฉํ•œ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•  ๋•Œ, ํ•™์Šต ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ํ‰๊ฐ€ํ•œ๋‹ค๋ฉด, overfitting ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
โ—ฆ
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ๋ฐ์ดํ„ฐ๋ฅผ ํฌ๊ฒŒ Train/Validation/Test Data์œผ๋กœ ๋žœ๋คํ•˜๊ฒŒ ๋ถ„ํ• ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
โ—ฆ
์—ฌ๊ธฐ์„œ ํ•™์Šต ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋ธ ๊ตฌ์„ฑ์— ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ์ด๊ณ , ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ๋Š” ํ•™์Šต๋œ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ ํ‰๊ฐ€ ๋ฐ hyperparameter๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. ํ‰๊ฐ€ ๋ฐ์ดํ„ฐ๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์ด๊ฑฐ๋‚˜ hyperparameter๊นŒ์ง€ ๊ฒฐ์ •๋˜์–ด ์ ํ•ฉ๋œ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
โ€ข
Cross-Validation(CV)
โ—ฆ
๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ชจ๋ธ์ด ์šฐ์—ฐํžˆ ์„ ํƒ๋œ test data์—์„œ ์„ฑ๋Šฅ์ด ๋†’์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. ๋˜๋Š” ๋ฐ์ดํ„ฐ ์–‘์ด ์ ์€ ๊ฒฝ์šฐ ์ด๋“ค์„ ๋ถ„ํ• ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
โ—ฆ
CV๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์ฒฉ๋˜์ง€ ์•Š๋„๋ก k๊ฐœ์˜ fold๋กœ ๋‚˜๋ˆ„๊ณ  k-1๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋ธ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ๋‚˜๋จธ์ง€ 1๊ฐœ fold๋กœ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์„ k๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค. ์ดํ›„ k๊ฐœ์˜ ๊ฒ€์ฆ ๊ณผ์ •์—์„œ์˜ ํ‰๊ท ์„ ํ†ตํ•ด ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•œ๋‹ค.
# Train(60%) Validation(30%) Test(10%) trn, temp = train_test_split(df, test_size=0.4, random_state=1 ) val, tst = train_test_split(temp, test_size=0.1, random_state=1)
Python
๋ณต์‚ฌ

์˜ˆ์ œ: ์„ ํ˜• ํšŒ๊ท€ ๋ถ„์„์„ ํ™œ์šฉํ•œ ์ฃผํƒ ๊ฐ€๊ฒฉ ์˜ˆ์ธก

1.
TAX ๋ณ€์ˆ˜๋Š” ์ฃผํƒ ๊ฐ€๊ฒฉ์ด ๊ฒฐ์ •๋˜์–ด์•ผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์ด๋ฏ€๋กœ ์ œ์™ธ
2.
๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜์˜ ๊ฐ€๋ณ€์ˆ˜ ๋ณ€ํ™˜
3.
์—ฐ์†ํ˜• ๋ณ€์ˆ˜์˜ ์˜ˆ์ธก ๋ฌธ์ œ์ด๊ณ , ์ •๋‹ต์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ ํšŒ๊ท€๋ถ„์„์„ ํ™œ์šฉ
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn import metrics from sklearn.linear_model import LinearRegression df = pd.read_csv('dmba/WestRoxbury.csv') df = df.rename(columns={'TOTAL VALUE':'TOTAL_VALUE'}) df.columns = [s.strip().replace(' ','_') for s in df.columns] df = pd.get_dummies(df,prefix_sep = "_", drop_first=True) ex_col = ['TOTAL_VALUE','TAX'] pre = [i for i in df.columns if i not in ex_col] out = 'TOTAL_VALUE' x = df[pre] y = df[out] trn_x,tst_x,trn_y, tst_y = train_test_split(x,y,test_size=0.3, random_state=1) model = LinearRegression() model.fit(trn_x,trn_y) pred = model.predict(tst_x) # MAE mae = metrics.mean_absolute_error(tst_y, pred) # MSE mse = metrics.mean_squared_error(tst_y, pred) # RMSE rmse = mse ** 0.5 print(f'MAE: {mae}, MSE: {mse}, RMSE: {rmse}')
Python
๋ณต์‚ฌ