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

'KT AIVLE School > 수업 내용 정리' 카테고리의 다른 글
| 생성형AI (3일차) [KT 에이블스쿨] 2025.04.22(화) (0) | 2025.04.22 |
|---|---|
| 생성형AI (2일차) [KT 에이블스쿨] 2025.04.21(월) (1) | 2025.04.21 |
| 생성형AI (1일차) [KT 에이블스쿨] 2025.04.18(금) (0) | 2025.04.18 |
| 머신러닝 (3일차) [KT 에이블스쿨] 2025.04.09(수) (0) | 2025.04.12 |
| 머신러닝 (1일차) [KT 에이블스쿨] 2025.04.07(월) (1) | 2025.04.11 |