🖇 데이터 확인
🖇 데이터 전처리: 범주형 데이터
🖇 데이터 전처리: 수치형 데이터
🖇 사이킷런에서 제공하는 데이터셋
🖇 머신러닝: 분류
🖇 머신러닝: 회귀
머신러닝을 활용하여 데이터를 분석할 때
필요할 때마다 효율적으로 참고하여 쓸 수 있도록, 자주 사용하는 전처리와 모델 학습 흐름을 기록해 두려고 한다.
이 글에서는 사이킷런(sklearn)을 활용한 머신러닝 실습을 진행하고, 분류(Classification)와 회귀(Regression) 모델을 중심으로 데이터 처리부터 모델 평가까지의 전체 흐름을 코드로 정리해 보았다.
자세한 데이터 및 출력 결과는 GitHub repository에서 확인할 수 있다.
사이킷런은 파이썬을 기반으로 한 대표적인 머신러닝 라이브러리로, 다양한 데이터 분석 및 예측 작업에 널리 사용된다. 간단하면서도 효율적인 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) 인코딩
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
# 활용할 데이터 선택
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
# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df.head()
# 판다스를 활용한 원핫 인코딩
df = pd.get_dummies(df, dtype=int) # 기본값: dtype=bool
df
Train 데이터와 Test 데이터의 컬럼 수는 반드시 일치해야 한다.
그렇지 않을 때는 판다스가 아닌, 사이킷런의 원핫 인코딩을 사용해야 한다.
평균이 0, 분산이 1인 표준정규분포로 변환
# 원핫 인코딩된 데이터
df.head()
# StandardScaler
from sklearn.preprocessing import StandardScaler
cols = ['가격', '호수', '칼로리']
scaler = StandardScaler()
df[cols] = scaler.fit_transform(df[cols])
df
모든 값을 0~1 사이 값으로 변환 (데이터 사이즈 축소)
# 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
# 머신러닝(분류)
from sklearn.tree import DecisionTreeClassifier
# 모델 선택
model = DecisionTreeClassifier()
# 학습
model.fit(X_train, y_train)
# 예측
pred = model.predict(X_test)
pred
# 정확도 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
# 머신러닝(회귀)
from sklearn.linear_model import LinearRegression
# 모델 선택
model = LinearRegression()
# 학습
model.fit(X_train, y_train)
# 예측
pred = model.predict(X_test)
pred
# 정확도 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 등의 함수 구성을 이해했고, 이를 다른 모델로 확장할 때 참고할 수 있을 것 같다.