Artificial Intelligence/Studying

[λ¨Έμ‹ λŸ¬λ‹ κ΅κ³Όμ„œ] Ch04 쒋은 ν›ˆλ ¨ μ„ΈνŠΈ λ§Œλ“€κΈ° : 데이터 μ „μ²˜λ¦¬

geum 2020. 11. 1. 13:53

4.1 λˆ„λ½λœ 데이터 닀루기

4.1.1 ν…Œμ΄λΈ” ν˜•νƒœμ˜ λ°μ΄ν„°μ—μ„œ λˆ„λ½λœ κ°’ 식별

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 '''

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

 

Output

 

β—½ DataFrame이 μ•„μ£Ό 클 경우 μˆ˜λ™μœΌλ‘œ λˆ„λ½ 값을 μ°ΎλŠ” 것은 λ²ˆκ±°λ‘œμ›€ → isnull method μ‚¬μš©

β—½ isnull : 셀이 수치 값을 λ‹΄κ³  μžˆλŠ”μ§€μ— λŒ€ν•œ λΆˆλ¦¬μ–Έ 값이 μ±„μ›Œμ§„ DataFrame λ°˜ν™˜

# sum method μ΄μš©ν•΄ λˆ„λ½λœ κ°’μ˜ 개수 확인 κ°€λŠ₯
df.isnull().sum()

 

4.1.2 λˆ„λ½λœ 값이 μžˆλŠ” μƒ˜ν”Œ(ν–‰)μ΄λ‚˜ νŠΉμ„±(μ—΄) μ œμ™Έ

β—½ λ°μ΄ν„°μ…‹μ—μ„œ ν•΄λ‹Ή μƒ˜ν”Œμ΄λ‚˜ νŠΉμ„±μ„ μ•„μ˜ˆ μ‚­μ œν•˜λŠ” 방식

β—½ 제일 κ°„λ‹¨ν•˜μ§€λ§Œ λ„ˆλ¬΄ λ§Žμ€ 데이터λ₯Ό μ‚­μ œν•  경우 μ•ˆμ •μ μΈ 뢄석 λΆˆκ°€λŠ₯ν•  수 있음

# NaN : λˆ„λ½λœ κ°’

# 1. λˆ„λ½λœ 값이 μžˆλŠ” μƒ˜ν”Œμ΄λ‚˜ νŠΉμ„± μ œμ™Έ
'''dropnaλŠ” νŽΈλ¦¬ν•œ λ§€κ°œλ³€μˆ˜ 제곡

dropna(how='all')
-> λͺ¨λ“  열이 NaN일 λ•Œ ν–‰ μ‚­μ œ

dropna(thresh=4)
-> μ‹€μˆ˜ 값이 νŠΉμ • 값보닀 μž‘μ€ ν–‰ μ‚­μ œ

dropna(subset=['C'])
-> νŠΉμ • 열에 NaN이 μžˆλŠ” ν–‰λ§Œ μ‚­μ œ

'''
df.dropna(axis=0)

β—½ axis=0 : ν–‰
β—½ axis=1 : μ—΄

 

4.1.3 λˆ„λ½λœ κ°’ λŒ€μ²΄ → 많이 μ‚¬μš©λ˜λŠ” 보간(Interpolation) 기법

# 2. λˆ„λ½λœ κ°’ λŒ€μ²΄(μ—¬λŸ¬ 보간 기법 μ‚¬μš©)

# from sklearn.Imputer import Imputer : μ‚¬μ΄ν‚·λŸ° 0.22 λ²„μ „μ—μ„œ μ‚­μ œλ  μ˜ˆμ •
from sklearn.impute import SimpleImputer
import numpy as np

# λˆ„λ½λœ 값을 각 νŠΉμ„± μ—΄μ˜ 전체 ν‰κ· μœΌλ‘œ λ³€κ²½(κ°€μž₯ ν”ν•œ 보간 기법)
imr = SimpleImputer(missing_values=np.nan, strategy='mean')
imr = imr.fit(df.values)

imputed_data = imr.transform(df.values)
imputed_data

Output

 

4.1.4 μ‚¬μ΄ν‚·λŸ° μΆ”μ •κΈ° API 읡히기

β—½ Imputer 클래슀 : 데이터 λ³€ν™˜μ— μ‚¬μš©λ˜λŠ” μ‚¬μ΄ν‚·λŸ°μ˜ λ³€ν™˜κΈ° 클래슀

β—½ μΆ”μ •κΈ° μ£Όμš” λ©”μ„œλ“œλŠ” fit(ν›ˆλ ¨ λ°μ΄ν„°μ—μ„œ λͺ¨λΈ νŒŒλΌλ―Έν„° ν•™μŠ΅), transform(ν•™μŠ΅ν•œ νŒŒλΌλ―Έν„°λ‘œ 데이터 λ³€ν™˜)

β—½ λ³€ν™˜ν•˜λ €λŠ” 데이터 배열은 λͺ¨λΈ ν•™μŠ΅μ— μ‚¬μš©ν•œ 데이터 νŠΉμ„± κ°œμˆ˜μ™€ κ°™μ•„μ•Ό 함

 

μ‚¬μ΄ν‚·λŸ° λ³€ν™˜κΈ°μ˜ ν›ˆλ ¨κ³Ό λ³€ν™˜ κ³Όμ •

 

4.2 λ²”μ£Όν˜• 데이터 닀루기

4.2.1 μˆœμ„œκ°€ μžˆλŠ” νŠΉμ„± vs μˆœμ„œκ°€ μ—†λŠ” νŠΉμ„±

πŸ“Š λ²”μ£Όν˜• 데이터 : μˆœμ„œκ°€ μžˆλŠ” 것과 μ—†λŠ” 것 ꡬ뢄해야 함

 

4.2.2 μˆœμ„œ νŠΉμ„± 맀핑

β—½ ν•™μŠ΅ μ•Œκ³ λ¦¬μ¦˜μ΄ μˆœμ„œ νŠΉμ„±μ„ μ˜¬λ°”λ₯΄κ²Œ μΈμ‹ν•˜λ €λ©΄ λ²”μ£Όν˜• λ¬Έμžμ—΄ 값을 μ •μˆ˜λ‘œ λ°”κΏ”μ•Ό 함

 

4.2.3 클래슀 λ ˆμ΄λΈ” 인코딩

# enumerateλ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀 λ ˆμ΄λΈ”μ„ 0λΆ€ν„° ν• λ‹Ή

import numpy as np
import pandas as pd

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

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

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

class_mapping

Output

# 맀핑 λ”•μ…”λ„ˆλ¦¬λ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀 λ ˆμ΄λΈ” μ •μˆ˜λ‘œ λ³€ν™˜
df['classlabel'] = df['classlabel'].map(class_mapping)
df

Output

 

4.2.4 μˆœμ„œκ°€ μ—†λŠ” νŠΉμ„±μ— 원-ν•« 인코딩 적용

β—½ μˆœμ„œ μ—†λŠ” νŠΉμ„±μ— λ“€μ–΄ μžˆλŠ” κ³ μœ ν•œ κ°’λ§ˆλ‹€ μƒˆλ‘œμš΄ dummy νŠΉμ„± 생성

β—½ ν•΄λ‹Ή 값은 1, ν•΄λ‹Ήν•˜μ§€ μ•ŠλŠ” 값은 0 ex) μ„Έ 가지 color νŠΉμ„± R, G, Bκ°€ μžˆλ‹€κ³  κ°€μ •ν•  λ•Œ R은 R=1, G=0, B=0으둜 λ³€ν™˜

β—½ 원-ν•« 인코딩 된 데이터셋을 μ‚¬μš©ν•  λ•ŒλŠ” 닀쀑 곡선성 λ¬Έμ œμ— μ£Όμ˜ν•΄μ•Ό 함

 

닀쀑 곡선성❔ νšŒκ·€ λΆ„μ„μ—μ„œ μ‚¬μš©λœ λͺ¨ν˜•μ˜ 일뢀 μ„€λͺ… λ³€μˆ˜κ°€ λ‹€λ₯Έ μ„€λͺ… λ³€μˆ˜μ™€ 상관 정도가 λ†’μ•„ 데이터 뢄석 μ‹œ 뢀정적인 영ν–₯을 λ―ΈμΉ˜λŠ” ν˜„μƒ

μ±…μ΄λž‘ λ˜‘κ°™μ΄ ν–ˆλŠ”λ° μ—λŸ¬ 무엇 🀦‍♀️

β—½ pandas get_dummies() μ‚¬μš© μ‹œ 원-ν•« 인코딩 더미 λ³€μˆ˜ 생성 편리

→ λ¬Έμžμ—΄ μ—΄λ§Œ λ³€ν™˜ν•˜κ³  λ‚˜λ¨Έμ§€ 열은 κ·ΈλŒ€λ‘œ λ‘ 

 

 

4.3 데이터셋을 ν›ˆλ ¨ μ…‹ / ν…ŒμŠ€νŠΈ μ…‹μœΌλ‘œ λ‚˜λˆ„κΈ°

 

cf. column rank deficient : ν•œ 열이 λ‹€λ₯Έ 열에 μ˜μ‘΄μ μ΄κ±°λ‚˜ μ—΄ 값이 λͺ¨λ‘ 0인 경우

'''
μ‚¬μ΄ν‚·λŸ° model_section λͺ¨λ“ˆμ— μžˆλŠ” train_test_split ν•¨μˆ˜ μ‚¬μš© μ‹œ
데이터셋을 λžœλ€ν•œ ν›ˆλ ¨ μ…‹κ³Ό ν…ŒμŠ€νŠΈ μ…‹μœΌλ‘œ λ‚˜λˆŒ 수 O
'''
from sklearn.model_selection import train_test_split

X, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values

X_train, X_test, y_train, y_test,= \
        train_test_split(X, y,
                         test_size = 0.3,
                         random_state = 0,
                         stratify = y)

 

4.4 νŠΉμ„± μŠ€μΌ€μΌ λ§žμΆ”κΈ°

β—½ κ²°μ • 트리, 랜덀 포레슀트 : νŠΉμ„± μŠ€μΌ€μΌ 영ν–₯을 받지 μ•ŠκΈ° λ•Œλ¬Έμ— μŠ€μΌ€μΌ μ‘°μ • μ‹ κ²½ μ•ˆ 써도 λ˜λŠ” μ•Œκ³ λ¦¬μ¦˜

β—½ λŒ€λΆ€λΆ„μ˜ μ΅œμ ν™” μ•Œκ³ λ¦¬μ¦˜μ€ νŠΉμ„± μŠ€μΌ€μΌμ΄ 같을 λ•Œ μ„±λŠ₯이 훨씬 μ’‹μŒ

 

< μŠ€μΌ€μΌ μ‘°μ • 방법 >

1) μ •κ·œν™”(normalization) : νŠΉμ„± μŠ€μΌ€μΌμ„ [0, 1] λ²”μœ„μ— λ§žμΆ”λŠ” μž‘μ—…, μ΅œμ†Œ-μ΅œλŒ€ μŠ€μΌ€μΌ λ³€ν™˜μ˜ 특수 μΌ€μ΄μŠ€

2) ν‘œμ€€ν™”(standardization) : νŠΉμ„± 평균을 0에 λ§žμΆ”κ³  ν‘œμ€€ 편차λ₯Ό 1둜 λ§Œλ“€μ–΄ μ •κ·œ 뢄포와 같은 νŠΉμ§•μ„ 가지도둝 함

 

⭐ λ‘˜λ‹€ λ¬Έλ§₯에 λ”°λΌμ„œ 의미 이해해야 함

 

 

4.5 μœ μš©ν•œ νŠΉμ„± 선택

β—½ κ³ΌλŒ€μ ν•©(overfitting) : λͺ¨λΈ νŒŒλΌλ―Έν„°κ°€ ν›ˆλ ¨ 셋에 μžˆλŠ” νŠΉμ • μƒ˜ν”Œλ“€μ— λ„ˆλ¬΄ κ°€κΉκ²Œ 맞좰져 μžˆλ‹€λŠ” 의미

→ 주어진 ν›ˆλ ¨ 데이터에 λΉ„ν•΄ λͺ¨λΈμ΄ λ„ˆλ¬΄ λ³΅μž‘ν•˜κΈ° λ•Œλ¬Έμ— λ°œμƒ

 

< κ³ΌλŒ€μ ν•©μ„ μ€„μ΄λŠ” 방법 >

1) 더 λ§Žμ€ ν›ˆλ ¨ 데이터 μˆ˜μ§‘(λΆˆκ°€λŠ₯ν•  λ•Œκ°€ 많음)

2) 규제λ₯Ό ν†΅ν•œ λ³΅μž‘λ„ μ œν•œ

3) νŒŒλΌλ―Έν„° κ°œμˆ˜κ°€ 적은 κ°„λ‹¨ν•œ λͺ¨λΈ 선택

4) 데이터 차원 κ°μ†Œ

 

4.5.1 λͺ¨λΈ λ³΅μž‘λ„ μ œν•œμ„ μœ„ν•œ L1 κ·œμ œμ™€ L2 규제

β—½ L1 규제 : ν¬μ†Œν•œ νŠΉμ„± 벑터 생성, λŒ€λΆ€λΆ„μ˜ νŠΉμ„± κ°€μ€‘μΉ˜λŠ” 0

β—½ L2 규제 : κ°œλ³„ κ°€μ€‘μΉ˜ 값을 μ œν•œν•˜μ—¬ λͺ¨λΈ λ³΅μž‘λ„ μ€„μ΄λŠ” 방법

 

4.5.2 ~ 4.5.3 μ±… μ½μ—ˆμŒ

 

4.5.4 순차 νŠΉμ„± 선택 μ•Œκ³ λ¦¬μ¦˜

β—½ λͺ¨λΈ λ³΅μž‘λ„ 쀄이고 κ³ΌλŒ€μ ν•© ν”Όν•˜λŠ” λ‹€λ₯Έ 방법 : νŠΉμ„± 선택을 ν†΅ν•œ 차원 μΆ•μ†Œ(κ·œμ œκ°€ μ—†λŠ” λͺ¨λΈμ—μ„œ 특히 유용)

 

< 차원 μΆ•μ†Œ 기법 >

1) νŠΉμ„± 선택(feature selection) : 원본 νŠΉμ„±μ—μ„œ 일뢀 선택

 

β‘  순차 νŠΉμ„± μ•Œκ³ λ¦¬μ¦˜

β–« greedy search algorithm

β–« 초기 d μ°¨μ›μ˜ νŠΉμ„± 곡간을 k<d인 k μ°¨μ›μ˜ νŠΉμ„± λΆ€λΆ„ κ³΅κ°„μœΌλ‘œ μΆ•μ†Œ

 

β‘‘ 순차 후진 선택(Sequential Backward Selection, SBS)

β–« 계산 νš¨μœ¨μ„± ν–₯상을 μœ„ν•΄ λͺ¨λΈ μ„±λŠ₯을 κ°€λŠ₯ν•œ 적게 ν¬μƒν•˜λ©΄μ„œ 초기 νŠΉμ„±μ˜ λΆ€λΆ„ κ³΅κ°„μœΌλ‘œ 차원 μΆ•μ†Œ

β–« μƒˆλ‘œμš΄ νŠΉμ„±μ˜ λΆ€λΆ„ 곡간이 λͺ©ν‘œν•˜λŠ” νŠΉμ„± κ°œμˆ˜κ°€ 될 λ•ŒκΉŒμ§€ 전체 νŠΉμ„±μ—μ„œ 순차적으둜 νŠΉμ„± 제거

 

2) νŠΉμ„± μΆ”μΆœ(feature extraction) : 일련의 νŠΉμ„±μ—μ„œ 얻은 μ •λ³΄λ‘œ μƒˆλ‘œμš΄ νŠΉμ„± 생성 πŸ” νŠΉμ„± μΆ”μΆœμ€ 5μž₯μ—μ„œ !