KT AIVLE School/수업 내용 정리

머신러닝 (2일차) [KT 에이블스쿨] 2025.04.08(화)

PaperDrop 2025. 4. 11. 00:33

2025.04.08 (화)

 

 

 

오늘은 머신러닝 2일차 !

 

오늘은 먼저 예고하셨던 대로, 본격적인 '모델 선택 및 학습'을 배우기 전에

과거에 배웠던 내용을 복습하는 시간을 가졌습니다.

 

복습을 해주신다는 것은 알고 있었지만, 막상하고나니 정말 필요한 과정이었다는걸 깨달았습니다..!

 

자 그러면 오늘도 시작해볼까요? 

(아직 티스토리 잘 몰라서 이모티콘이 없네요..)

 

 

 

 0. 데이터 전처리 과정 복습

 

① 범주형 변수 인코딩

○ 라벨인코딩(Label Encoding)

  : 각 범주마다 인덱스를 붙혀 수치화하는 방법

 

# 필요한 라이브러리를 import 하세요
from sklearn.preprocessing import LabelEncoder

# LabelEncoder를 객체로 생성한 후 , fit( ) 과 transform( ) 으로 label 인코딩 수행.
encoder = LabelEncoder()  # 객체생성
encoder.fit(items)  # 규칙만들기
result = encoder.transform(items)  # 만든 규칙을 데이터셋에 적용

print('result: ', result)

 

→ 라벨인코딩은 scikit-learn의 preprocessing에 LabelEncoder() 메소드를 이용한다.

해당 메소드를 이용해 객체를 생성한 후, fit()을 통해 규칙을 만들고 transform()을 통해 만든 규칙으로 인코딩을 수행한다.

 

○ 원-핫 인코딩 (One-Hot Encoding)

  : 범주형 데이터를 머신러닝 모델이 이해할 수 있도록 숫자 벡터로 변환하는 방법

    각 범주를 0과 1로 구성된 벡터로 표현하며, 해당 범주에만 1을 주고 나머지는 0으로 표시

 

※ 해당 방법은 scikit-learn으로도 구현할 수 있지만, 방법이 어렵고 pandas의 메소드가 훨씬 편리하기에 pandas를 사용

 

import pandas as pd
import numpy as np

df = pd.DataFrame({'item':['1', '2', '3', '4', '4', '2'] })

pd.get_dummies(df)

pd.get_dummies(df, dummy_na=True)  #결측치도 결과에 한 범주로 포함

 

pandas에 get_dummies() 메소드를 이용하여 간단하게 적용할 수 있다.

 

<결과1>

	0_fall	 0_spring  0_summer
0	False	 True	   False
1	False	 False	   True
2	True	 False	   False
3	False	 False	   False

 

<결과2>

      0_fall	0_spring	0_summer	0_nan
0	False	True    	False   	False
1	False	False   	True    	False
2	True	False   	False   	False
3	False	False   	False   	True

 

→ 결과1은 메소드를 그냥 실행했을 경우이고, 결과2는 (dummy_na=True)옵션을 추가해서 null값도 범주에 포함한 경우이다.

→ False는 0으로, True는 1로 인식하여 범주형 데이터를 숫자형 데이터로 변환시킨다.

 

 

② 수치형 변수 정규화(스케일링)

○ StandardScaler

  : 데이터의 평균을 0, 표준편차를 1로 변환하여 정규 분표 형태로 표준화

    →  스케일이 다른 특성들을 동일한 기준으로 맞춰주기 위해 사용한다.

 

import pandas as pd
from sklearn.datasets import load_iris

# 붓꽃 데이터 셋을 로딩하고 DataFrame으로 변환합니다.
iris = load_iris()
iris_data = iris.data
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)

print('feature 들의 평균 값')
print(iris_df.mean())
print('\nfeature 들의 분산 값')
print(iris_df.var())

 

→ 해당 데이터는 정규화를 하기에 앞서 실습에 사용할 붓꽃 데이터 셋을 불러와서 DataFrame으로 만드는 과정이다.

→ 붓꽃 데이터는 워낙 유명해서 scikit-learn에서 불러올 수 있다.

 

from sklearn.preprocessing import StandardScaler

# StandardScaler 객체 생성
scaler = StandardScaler()

# StandardScaler 로 데이터 셋 변환. fit( ) 과 transform( ) 호출.
scaler.fit(iris_df)    # 규칙생성
iris_scaled = scaler.transform(iris_df)    #규칙적용

# transform() 사용 시 데이터 셋이 numpy ndarray로 반환되어 이를 dataframe으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)

print('표준정규화 이후 평균')
print(iris_df_scaled.mean())
print('표준정규화 이후 분산')
print(iris_df_scaled.var())

 

→ 정규화를 위해 StandardScaler() 메소드로 객체를 생성하고, 해당 객체에 iris_df를 넣어 fit()하고 transform()한다.

→ 이후 반환된 데이터의 형식이 numpy ndarray이기에, 다시 DataFrame으로 변환하는 과정을 거치고나서 평균과 분산을 출력해봄으로 정규화가 제대로 이뤄졌는지 확인한다.

 

○ MinMaxScaler

  : 데이터를 0과 1 사이의 범위로 압축하는 정규화 방식

    특성 간 최대/최소값을 기준으로 스케일을 조정함으로, 모든 특성이 동일한 범위를 가지게 된다.

 

from sklearn.preprocessing import MinMaxScaler
import pandas as pd

# MinMaxScaler객체 생성
scaler = MinMaxScaler()

# MinMaxScaler 로 데이터 셋 변환. fit() 과 transform() 호출.
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)  #numpy객체

iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)

print('feature들의 최소 값')
print(iris_df_scaled.min())
print('\nfeature들의 최대 값')
print(iris_df_scaled.max())

 

→ 정규화를 위해 MinMaxScaler() 메소드로 객체를 생성하고, 해당 객체에 iris_df를 넣어 fit()하고 transform()한다.

 

※ 중요한 유의사항 : fit_transform()은 반드시 학습 데이터에만 적용하고, 테스트 데이터에는 transform()만 적용한다.

    → train 데이터에 적용한 기준을 test에도 똑같이 적용해야 한다. 그렇지 않으면 test 데이터에 맞는 기준을 한번더 생성하기 때문에 동일한 스케일이 적용되지 않아서 데이터 분석에 오류가 발생할 수 있다. 

 

 

생각해보면 나름 단순한 내용인데 아무것도 모르고 반복해야지 ~ 하다가는 놓칠 뻔한 내용이었습니다 !! 

그러면 이제 본격적으로 머신러닝 내용을 어제에 이어서 나가겠습니다 !

 

 

2. 머신러닝 원리와 학습 프로세스 (이어서)

 

○ 머신러닝의 학습유형

 

1) 지도 학습 (Supervised Learning)

  : 문제와 정답을 모두 알려주고 공부시키는 방법 

    → 정답 데이터를 학습해 패턴을 찾음. 

         예시) 분류, 예측(회귀) 등

 

    ① 분류 : 숫자를 예측하며, 출력값이 연속형 데이터 형식이다. 

    ② 회귀 : 범주를 예측하며, 출력값이 범주형 데이터 형식이다. 

 

2) 비지도 학습 (Unspervised Learning)

  : 정답이 없는 데이터를 학습하는 방법

    → 프로그램에게 사전에 정답을 제공하지 않고 스스로 분석하고 패턴을 찾음, 그러므로 특정 목표가 없다. 

         예시) 군집화, 차원축소 등

 

    ① 군집화 (Clustering) : 비슷한 특성을 가진 데이터를 자동으로 그룹을 나누는 작업

    ② 차원 축소 (Dimensionally Reduction) : 많은 변수를 더 적은 핵심 변수로 압축하는 과정

         → 대상을 평가하는 항목(열)이 과도하게 많은 경우, 그 중 영향력이 큰 변수만 남기거나 해당 항목들을 대표할 수 있는 평가 목록을 새롭게 만드는 과정을 차원 축소라고 부름. 이는 독립적이지 않고 다른 학습 이전에 사용하기도 함.

 

3) 강화 학습 (Reinforcement Learning)

  : 보상을 통해 상은 최대로, 벌은 최소로 하는 행위를 학습하는 방법

     → 무엇이 정답인지 알려주지 않고, 규칙 속에서 최대의 상과 최소 벌을 찾아가면서 프로그램 스스로 깨닫는 원리

          예시) 보상  → 알파고가 대표적.

 

 

옛날에 머신러닝에 대해 단순히 문자적으로만 알았을 때는

'안 알려주고 찾아가는게 최고 아니야?'라고 생각할 때도 있었지만,

정의와 종류에 대해 확실히 배우고나니 목적에 따른 쓰임이 다른거지 뭐가 더 우월한 것은 아니었습니다...!

하지만 강화 학습은 별도의 범주로 분류 되기도 하고 어려워서 이번 과정에서 안 배운답니다.

역시 강화 학습은 대단한 것이었네요 ... ㅇ.ㅇ 

 

 

3. 머신러닝 모델 - 회귀

 

○ 회귀 학습 (Regression) 

  : 종속 변수가 연속형 데이터일 때 사용하는 지도 학습 방법

    → 입력값은 무관하나 출력값은 반드시 연속형 데이터이어야 한다. 

 

1) 선형 회귀 (Linear Regression)

  : 입력 변수와 출력 변수간의 선형 관계를 가정하여 회귀 학습을 진행

      y = WX + b  → (y : 출력변수 / W : 가중치 / X : 입력 변수 / b : 절편)을 의미

 

2) 릿지 회귀 (Ridge Regression, L2 Regularization)

  : L2 정규화를 적용해 가중치를 작게 만들어 과적합을 방지하는 방법

 

3) 라쏘 회귀 (Lasso Regression, L1 Regularization)

  : L1 정규화를 적용해 가중치를 0으로 만들어 과적합을 방지하는 방법

 

4) 엘라스틱넷  회귀 (ElasticNet Regression)

  : L1과 L2 정규화 모두 적용

 

※ 데이터 전처리 복습 (중복 데이터 제거, 결측치 여부 확인 및 대체)

 

print('전: ', df.shape)

df[df.duplicated()]
df = df.drop_duplicates()

print('후: ', df.shape)

 

drop() 메소드를 이용해 중복 데이터를 제거해준다.

 

df.isnull().sum()

df['bmi'].fillna(df['bmi'].mean(),inplace=True)

 

isnull() 메소드를 이용해 결측치를 확인하고, fillna() 메소드를 이용해 결측치를 다른 값으로 대체한다.

→ 위 코드에선 평규치로 대체하기 위해 df['열이름'].mean() 을 사용했으며, 원본 데이터를 수정하기 위해 inplace=True를 사용했다.

 

 


 

 

 

오늘도 열심히 달려서 복습과 머신러닝의 학습 유형까지 배웠습니다.

뭔가 두루뭉술하게 알던 개념들을 명확하게 배울 수 있어서 좋았네요 !

앞으로도 인공지능, 딥러닝에서도 쓰이는 개념들을 잘 확립해야겠습니다..!

 

오늘 함께 수업들으신 분들, 이 글을 보고 계신 분들 모두들 고생하셨습니다 !! :D