[ML] Scikit-learn

jul ee·2025년 5월 9일

데이터 성장기

목록 보기
88/139

🖇  데이터 확인
🖇  데이터 전처리: 범주형 데이터
🖇  데이터 전처리: 수치형 데이터
🖇  사이킷런에서 제공하는 데이터셋
🖇  머신러닝: 분류
🖇  머신러닝: 회귀


머신러닝을 활용하여 데이터를 분석할 때

필요할 때마다 효율적으로 참고하여 쓸 수 있도록, 자주 사용하는 전처리와 모델 학습 흐름을 기록해 두려고 한다.

이 글에서는 사이킷런(sklearn)을 활용한 머신러닝 실습을 진행하고, 분류(Classification)와 회귀(Regression) 모델을 중심으로 데이터 처리부터 모델 평가까지의 전체 흐름을 코드로 정리해 보았다.

자세한 데이터 및 출력 결과는 GitHub repository에서 확인할 수 있다.



사이킷런(scikit-learn)이란?

사이킷런은 파이썬을 기반으로 한 대표적인 머신러닝 라이브러리로, 다양한 데이터 분석 및 예측 작업에 널리 사용된다. 간단하면서도 효율적인 API를 제공하여, 누구나 쉽게 머신러닝 모델을 구현하고 활용할 수 있는 환경을 제공한다.

특히 분류(classification), 회귀(regression), 클러스터링(clustering), 차원 축소(dimensionality reduction), 모델 선택(model selection), 데이터 전처리(preprocessing) 등 머신러닝 전반에 걸친 기능을 제공하고 있다. 학습용 샘플 데이터셋도 함께 제공되어 실습에 유용하다.

오픈소스 프로젝트로 활발하게 유지/관리가 되고 있으며, 텐서플로우(TensorFlow)나 파이토치(PyTorch)처럼 딥러닝보다는 전통적인 머신러닝 모델 구현에 특화되어 있다.



🖇  데이터 확인

# 사이킷런 버전 확인
import sklearn
print(sklearn.__version__)
1.6.1
# 데이터 생성
import pandas as pd
import numpy as np
data = pd.DataFrame(...)
data.to_csv('final_modudak.csv', index=False)
data
# 데이터 변경
data.loc[2, '원산지'] = '미국'

# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()  # DataFrame이므로 대괄호 2개
df



🖇  데이터 전처리: 범주형 데이터

  • 레이블 인코딩
  • 원핫 인코딩
# type 확인
df.info()

레이블(label) 인코딩

# 레이블(label) 인코딩
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
# le.fit(df['원산지'])
# le.transform(df['원산지'])

# fit_transform
le.fit_transform(df['원산지'])

# 데이터 변환
df['원산지'] = le.fit_transform(df['원산지'])
df

# '살찔까요' 레이블 인코딩
le = LabelEncoder()
df['살찔까요'] = le.fit_transform(df['살찔까요'])
df

레이블 인코딩(심화)

여러 개 컬럼을 한 번에 인코딩

# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df

# object 타입 컬럼 선택
# 방법 1. cols = ['원산지', '살찔까요']
# 방법 2
cols = df.select_dtypes(include='object').columns

# 한 번에 레이블 인코딩
from sklearn.preprocessing import LabelEncoder

for col in cols:
    le = LabelEncoder()
    df[col] = le.fit_transform(df[col])

# 인코딩 결과 확인
df

원핫(one-hot) 인코딩

# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df

# 원핫인코딩
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(sparse_output=False)  # sparse=False: array 형태로 반환받을 수 있다.
cat = ohe.fit_transform(df[['원산지']])     # 원핫인코딩은 fit_transform 할 때 DataFrame 형태로 전달해야 한다.
cat

# 카테고리
ohe.categories_

# 피처(컬럼)이름 + 카테고리
ohe.get_feature_names_out()

# 데이터프레임으로 변환
df_cat = pd.DataFrame(cat, columns=ohe.get_feature_names_out())
df_cat

# 데이터프레임 합치기
df = pd.concat([df, df_cat], axis=1)
df

# 기존 컬럼 삭제
df = df.drop(['원산지'], axis=1)
df

원핫 인코딩(심화)

여러 개 컬럼을 한 번에 인코딩

# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df

# 원핫인코딩
cols = df.select_dtypes(include='object').columns
ohe = OneHotEncoder(sparse_output=False)
cat = ohe.fit_transform(df[cols])
df_cat = pd.DataFrame(cat, columns=ohe.get_feature_names_out())
df_cat

# 데이터프레임 합치기
df = pd.concat([df, df_cat], axis=1)
df.head()

# 컬럼 삭제
df = df.drop(cols, axis=1)
df

[Tip] 원핫 인코딩: 판다스 활용

# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df.head()

# 판다스를 활용한 원핫 인코딩
df = pd.get_dummies(df, dtype=int)  # 기본값: dtype=bool
df

Train 데이터와 Test 데이터의 컬럼 수는 반드시 일치해야 한다.
그렇지 않을 때는 판다스가 아닌, 사이킷런의 원핫 인코딩을 사용해야 한다.




🖇  데이터 전처리: 수치형 데이터

  • 표준화
  • 정규화(Min-Max)

표준화 (StandardScaler)

평균이 0, 분산이 1인 표준정규분포로 변환

z=xμσz = \frac{x - \mu}{\sigma}
# 원핫 인코딩된 데이터
df.head()

# StandardScaler
from sklearn.preprocessing import StandardScaler
cols = ['가격', '호수', '칼로리']
scaler = StandardScaler()
df[cols] = scaler.fit_transform(df[cols])
df

정규화 (MinMaxScaler)

모든 값을 0~1 사이 값으로 변환 (데이터 사이즈 축소)

xscale=xxminxmaxxminx_{\text{scale}} = \frac{x - x_{\min}}{x_{\max} - x_{\min}}
# MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
cols = ['가격', '호수', '칼로리']
scaler = MinMaxScaler()
df[cols] = scaler.fit_transform(df[cols])
df



🖇  사이킷런에서 제공하는 데이터셋

사이킷런에서 제공하는 데이터셋 확인하기 (load_*)

import sklearn.datasets
sklearn.datasets.__all__
`[...,
 'load_diabetes',
 'load_digits',
 'load_files',
 'load_iris',
 'load_breast_cancer',
 'load_linnerud',
 'load_sample_image',
 'load_sample_images',
 'load_svmlight_file',
 'load_svmlight_files',
 'load_wine',
 ...]`

유방암 데이터

# 사이킷런 데이터 불러오기 - 유방암 데이터
from sklearn.datasets import load_breast_cancer
dataset = load_breast_cancer()
dataset
{
 'data': ndarray of shape (569, 30),       # 입력 데이터 (feature 값)
 'target': ndarray of shape (569,),        # 라벨 (0: malignant, 1: benign)
 'frame': None,                            # (DataFrame, 일부 환경에서 제공)
 'target_names': array(['malignant', 'benign']),
 'DESCR': 'Breast cancer wisconsin dataset ...',  # 전체 설명
 'feature_names': array([...30개의 feature 이름...]),
 'filename': '.../breast_cancer.csv',
 'data_module': 'sklearn.datasets.data'
}
# 피처 이름 확인
dataset.feature_names

# 타겟 확인
dataset.target

# 데이터 확인*
dataset.data[:2]

# 데이터프레임으로 만들기
cancer_df = pd.DataFrame(data=dataset.data, columns=dataset.feature_names)
cancer_df

# 타켓 추가하기
cancer_df['target'] = dataset.target
cancer_df.head()

당뇨병 데이터

# 사이킷런 데이터 불러오기 - 유방암 데이터
from sklearn.datasets import load_diabetes
dataset = load_diabetes()

# 데이터프레임으로 만들기
diabetes_df = pd.DataFrame(data=dataset.data, columns=dataset.feature_names)
diabetes_df.head()

# 타겟 추가하기
diabetes_df['target'] = dataset.target
diabetes_df.head()



🖇  머신러닝: 분류

검증 데이터 분리

  • 유방암 데이터
# 검증 데이터 분리
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    cancer_df.drop('target', axis=1), cancer_df['target'], test_size=0.3, random_state=42
)

# 학습 데이터 확인(X)
X_train.head()

# 학습 데이터 확인(y)
y_train.head()

# 데이터 크기
X_train.shape, X_test.shape, y_train.shape, y_test.shape

의사결졍나무 (Decision Tree)

# 머신러닝(분류)
from sklearn.tree import DecisionTreeClassifier

# 모델 선택
model = DecisionTreeClassifier()
# 학습
model.fit(X_train, y_train)
# 예측
pred = model.predict(X_test)
pred

평가 (accuracy)

# 정확도 accuracy_score(실제값, 예측값)
from sklearn.metrics import accuracy_score
accuracy_score(y_test, pred)



🖇  머신러닝: 회귀

검증 데이터 분리

  • 당뇨병 데이터
# 검증 데이터 분리
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    diabetes_df.drop('target', axis=1), diabetes_df['target'], test_size=0.3, random_state=42
)

# 학습 데이터 확인(X)
X_train.head()

# 학습 데이터 확인(y)
y_train.head()

# 데이터 크기
X_train.shape, X_test.shape, y_train.shape, y_test.shape

선형회귀 (LinearRegression)

# 머신러닝(회귀)
from sklearn.linear_model import LinearRegression

# 모델 선택
model = LinearRegression()
# 학습
model.fit(X_train, y_train)
# 예측
pred = model.predict(X_test)
pred

평가 (mes)

# 정확도 mean_squared_error(실제값, 예측값)
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, pred)




인사이트 및 회고

사이킷런에서 제공하는 대표적인 데이터셋을 활용하여, 분류와 회귀 문제를 다뤄보았다. 그 전에, 범주형 변수에 대한 레이블 인코딩과 원핫 인코딩, 수치형 변수의 표준화 및 정규화 등 기본적인 전처리 과정을 정리해 볼 수 있었다.

사이킷런의 train_test_split, DecisionTreeClassifier, LinearRegression, accuracy_score, mean_squared_error 등의 함수 구성을 이해했고, 이를 다른 모델로 확장할 때 참고할 수 있을 것 같다.

profile
AI에 관심을 가지고, 데이터로 가치를 만들어 나가는 과정을 기록합니다.

0개의 댓글