머신러닝(Machine Learning)은 인공지능(AI)의 한 분야로, 데이터에서 패턴을 찾아내고 이를 통해 예측하거나 분류하는 등의 작업을 수행합니다. 이 블로그 글에서는 머신러닝의 기초 개념부터 실제 사례까지 차근차근 살펴보겠습니다.
1.1 인공지능, 머신러닝, 딥러닝 개념정리
머신러닝과 딥러닝의 차이점은 주로 사용되는 알고리즘과 데이터의 양, 그리고 학습 방식에 있습니다. 딥러닝은 특히 이미지나 음성 인식 등에서 탁월한 성능을 보이며, 복잡한 신경망 구조를 사용하여 깊이 있는 학습을 수행합니다.
1.2 지도/비지도 학습
지도 학습의 예로는 스팸 이메일 필터링, 이미지 분류 등이 있으며, 비지도 학습의 예로는 고객 세분화, 차원 축소를 통한 데이터 시각화 등이 있습니다.
1.3 정형/비정형 데이터
정형 데이터는 주로 숫자나 문자열로 이루어진 반면, 비정형 데이터는 자연어 처리(NLP), 이미지 처리 등에서 다루어지는 경우가 많습니다.
1.4 현업에서의 머신러닝 사례 살펴보기
2.1 성능 평가 지표
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 예제 코드
y_true = [0, 1, 1, 0, 1]
y_pred = [0, 1, 0, 0, 1]
accuracy = accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
print(f"Accuracy: {accuracy}, Precision: {precision}, Recall: {recall}, F1 Score: {f1}")
2.2 훈련 집합과 테스트 집합
모델을 평가하기 위해 데이터를 훈련 집합과 테스트 집합으로 나눕니다. 훈련 집합으로 모델을 학습시키고, 테스트 집합으로 모델의 성능을 평가합니다.
2.3 과대적합과 과소적합
3.1 머신러닝 모델의 학습원리
머신러닝 모델은 데이터를 통해 패턴을 학습하고, 이를 기반으로 새로운 데이터를 예측합니다. 예를 들어, 선형 회귀 모델은 주어진 데이터 포인트들 사이의 관계를 선형 함수로 모델링합니다.
3.2 경사하강법 (Gradient Descent)
경사하강법은 비용 함수(Cost Function)를 최소화하기 위해 반복적으로 기울기(Gradient)를 따라 이동하는 최적화 알고리즘입니다.
import numpy as np
# 예제 코드
def gradient_descent(x, y, lr=0.01, epochs=1000):
m, b = 0, 0
n = len(x)
for _ in range(epochs):
y_pred = m * x + b
D_m = (-2/n) * sum(x * (y - y_pred))
D_b = (-2/n) * sum(y - y_pred)
m -= lr * D_m
b -= lr * D_b
return m, b
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 7, 9, 11, 13])
m, b = gradient_descent(x, y)
print(f"Slope: {m}, Intercept: {b}")
3.3 연속형과 범주형 데이터
3.4 분류와 회귀 문제
from sklearn.linear_model import LogisticRegression, LinearRegression
# 분류 예제
X_classification = [[1, 2], [2, 3], [3, 4], [4, 5]]
y_classification = [0, 0, 1, 1]
model_classification = LogisticRegression()
model_classification.fit(X_classification, y_classification)
# 회귀 예제
X_regression = [[1], [2], [3], [4]]
y_regression = [2, 4, 6, 8]
model_regression = LinearRegression()
model_regression.fit(X_regression, y_regression)
이제 머신러닝의 기본 개념과 주요 요소들에 대해 이해했으니, 다음 글에서는 분류 테스크와 관련된 내용을 다뤄보겠습니다. 머신러닝의 다양한 모델과 이를 실제로 적용하는 방법에 대해 심도 있게 알아보겠습니다.
이번 글에서는 머신러닝에서 분류 테스크에 대해 자세히 알아보겠습니다. 분류 테스크는 주어진 데이터 포인트가 어떤 카테고리에 속하는지를 예측하는 작업입니다.
1.1 분류 테스크 살펴보기
분류 테스크는 데이터 포인트가 미리 정의된 여러 카테고리 중 하나에 속하는지 예측하는 작업입니다. 예를 들어, 이메일이 스팸인지 아닌지를 분류하거나, 손글씨 숫자를 인식하는 작업이 분류 테스크에 해당합니다.
1.2 분류 테스크 모델 종류
주요 분류 모델에는 다음과 같은 것들이 있습니다:
1.3 로지스틱 회귀 이론 및 구현
로지스틱 회귀는 종속 변수가 이진형(binary)일 때 사용되는 회귀 분석 기법입니다. 로지스틱 회귀의 주요 아이디어는 선형 회귀 방정식을 시그모이드 함수에 통과시켜 0과 1 사이의 값을 출력하는 것입니다.
import numpy as np
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
# 데이터 생성
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]])
y = np.array([0, 0, 0, 1, 1, 1])
# 모델 학습
model = LogisticRegression()
model.fit(X, y)
# 예측
pred = model.predict(X)
# 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis')
plt.title('Logistic Regression Classification')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
1.4 의사결정 트리 이론 및 구현
의사결정 트리는 데이터를 속성(attribute) 기반으로 분할하여 결정 규칙을 만드는 비모수 모델입니다. 트리의 각 노드는 속성을 나타내며, 가지(branch)는 속성 값을 기반으로 하는 조건, 잎(leaf)은 클래스 레이블을 나타냅니다.
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
# 데이터 생성
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]])
y = np.array([0, 0, 0, 1, 1, 1])
# 모델 학습
model = DecisionTreeClassifier()
model.fit(X, y)
# 트리 시각화
plt.figure(figsize=(10, 8))
tree.plot_tree(model, filled=True)
plt.show()
2.1 기본기 다지기
데이터 분석을 시작하기 전에, 데이터의 기본적인 특성을 파악하는 것이 중요합니다. 이는 데이터의 분포, 결측치, 이상치 등을 파악하는 과정입니다.
2.2 EDA (Exploratory Data Analysis)
EDA는 데이터의 주요 특성을 시각화하고 요약하는 과정입니다. EDA를 통해 데이터의 패턴, 관계, 이상치를 파악할 수 있습니다.
import pandas as pd
import seaborn as sns
# 데이터 로드
df = sns.load_dataset('iris')
# 데이터 분포 시각화
sns.pairplot(df, hue='species')
plt.show()
3.1 손글씨 (MNIST) 데이터 분류하기
MNIST 데이터셋은 손글씨로 작성된 숫자 이미지를 포함하고 있습니다. 각 이미지는 28x28 픽셀로 구성되어 있으며, 0부터 9까지의 숫자를 나타냅니다.
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# 데이터 로드
mnist = fetch_openml('mnist_784', version=1)
X, y = mnist["data"], mnist["target"].astype(int)
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 모델 학습
model = RandomForestClassifier()
model.fit(X_train, y_train)
# 예측 및 평가
y_pred = model.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
3.2 붓꽃 (IRIS) 데이터 분류하기
붓꽃 데이터셋은 3종류의 붓꽃(세토사, 버시컬러, 버지니카)의 꽃잎과 꽃받침의 길이와 폭에 대한 데이터를 포함합니다.
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report
# 데이터 로드
iris = load_iris()
X, y = iris.data, iris.target
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 모델 학습
model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train, y_train)
# 예측 및 평가
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred, target_names=iris.target_names))
이제 분류 테스크의 기본 개념과 모델들에 대해 알아보았습니다. 다음 글에서는 회귀 테스크에 대해 다뤄보겠습니다. 회귀 테스크는 연속적인 값을 예측하는 문제로, 주택 가격 예측, 주가 예측 등이 이에 해당합니다.
이번 글에서는 머신러닝에서 회귀 테스크에 대해 자세히 알아보겠습니다. 회귀 테스크는 연속적인 값을 예측하는 작업으로, 예를 들어 주택 가격 예측, 주가 예측 등이 이에 해당합니다.
1.1 회귀 태스크 살펴보기
회귀 테스크는 주어진 입력 데이터로부터 연속적인 출력을 예측하는 작업입니다. 예를 들어, 특정 날짜의 주가를 예측하거나, 주택의 면적과 방 개수에 따라 가격을 예측하는 작업이 회귀 테스크에 해당합니다.
1.2 회귀 태스크 모델 종류
주요 회귀 모델에는 다음과 같은 것들이 있습니다:
1.3 부스팅 계열 모델 이론 및 구현
부스팅 모델은 여러 개의 약한 모델(weak learners)을 결합하여 강력한 모델(strong learner)을 만드는 기법입니다. 각 약한 모델은 이전 모델의 오차를 보완하도록 학습됩니다.
import xgboost as xgb
from sklearn.metrics import mean_squared_error
# 데이터 생성
X, y = np.arange(10).reshape((5, 2)), range(5)
# 모델 학습
model = xgb.XGBRegressor(objective='reg:squarederror', n_estimators=10)
model.fit(X, y)
# 예측 및 평가
y_pred = model.predict(X)
print(f"Mean Squared Error: {mean_squared_error(y, y_pred)}")
2.1 Weight and Bias 사용하기
Weight and Bias (wandb)는 머신러닝 실험을 추적하고 시각화할 수 있는 도구입니다. 모델의 성능을 기록하고, 하이퍼파라미터 튜닝, 시각화 등을 통해 성능을 향상시킬 수 있습니다.
import wandb
# wandb 초기화
wandb.init(project="regression_project")
# 모델 학습
model = xgb.XGBRegressor(objective='reg:squarederror', n_estimators=10)
model.fit(X, y)
# 예측 및 평가
y_pred = model.predict(X)
mse = mean_squared_error(y, y_pred)
# wandb에 성능 기록
wandb.log({"mean_squared_error": mse})
2.2 과대적합과 과소적합 해결하기
2.3 Hyper Parameter Tunning
하이퍼파라미터 튜닝은 모델의 성능을 최적화하기 위해 하이퍼파라미터를 조정하는 과정입니다. 대표적인 방법으로 그리드 서치(Grid Search)와 랜덤 서치(Random Search)가 있습니다.
from sklearn.model_selection import GridSearchCV
# 하이퍼파라미터 그리드 정의
param_grid = {
'n_estimators': [50, 100, 200],
'learning_rate': [0.01, 0.1, 0.3]
}
# 모델 초기화
model = xgb.XGBRegressor(objective='reg:squarederror')
# 그리드 서치 수행
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, scoring='neg_mean_squared_error')
grid_search.fit(X, y)
# 최적 하이퍼파라미터 출력
print(grid_search.best_params_)
3.1 캘리포니아 집값 예측하기
캘리포니아 집값 데이터셋을 사용하여 회귀 모델을 학습하고, 집값을 예측해보겠습니다.
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 데이터 로드
california = fetch_california_housing()
X, y = california.data, california.target
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 데이터 스케일링
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 모델 학습
model = xgb.XGBRegressor(objective='reg:squarederror', n_estimators=100)
model.fit(X_train, y_train)
# 예측 및 평가
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
3.2 자전거 수요 예측하기
자전거 대여 수요 예측 데이터를 사용하여 회귀 모델을 학습하고, 대여 수요를 예측해보겠습니다.
import pandas as pd
# 데이터 로드
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00275/Bike-Sharing-Dataset.zip'
bike_data = pd.read_csv(url)
# 데이터 전처리 및 모델 학습은 위의 예시와 비슷한 과정으로 진행
# ...
3.3 주가 예측하기
주가 데이터를 사용하여 회귀 모델을 학습하고, 주가를 예측해보겠습니다.
import yfinance as yf
# 데이터 로드
ticker = 'AAPL'
data = yf.download(ticker, start='2020-01-01', end='2023-01-01')
# 데이터 전처리 및 모델 학습은 위의 예시와 비슷한 과정으로 진행
# ...
이번 글에서는 회귀 테스크의 개념과 주요 모델들에 대해 알아보았습니다. 다음 글에서는 클러스터링 테스크에 대해 다뤄보겠습니다. 클러스터링 테스크는 데이터를 유사한 그룹으로 나누는 작업으로, 고객 세분화, 문서 분류 등에서 많이 사용됩니다.
이번 글에서는 머신러닝에서 클러스터링 테스크에 대해 자세히 알아보겠습니다. 클러스터링 테스크는 데이터를 유사한 그룹으로 나누는 작업입니다.
1.1 클러스터링 테스크 살펴보기
클러스터링 테스크는 레이블이 없는 데이터를 유사성에 따라 그룹으로 나누는 작업입니다. 예를 들어, 고객 세분화, 문서 군집화, 이미지 세그멘테이션 등이 클러스터링 테스크에 해당합니다.
1.2 클러스터링 테스크 모델 종류
주요 클러스터링 모델에는 다음과 같은 것들이 있습니다:
1.3 클러스터링 평가
클러스터링의 성능을 평가하기 위해 다양한 지표를 사용합니다:
from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans
# 데이터 생성
X = np.array([[1, 2], [2, 3], [3, 4], [5, 6], [6, 7], [7, 8]])
# 모델 학습
kmeans = KMeans(n_clusters=2)
kmeans.fit(X)
# 실루엣 스코어 계산
score = silhouette_score(X, kmeans.labels_)
print(f"Silhouette Score: {score}")
2.1 Streamlit 소개하기
Streamlit은 머신러닝 모델을 웹 애플리케이션으로 빠르게 배포할 수 있는 프레임워크입니다. 파이썬 코드 몇 줄로 인터랙티브한 대시보드를 만들 수 있습니다.
2.2 (실습) Streamlit으로 모델 서빙하기
Streamlit을 사용하여 클러스터링 모델의 결과를 시각화하고 서빙하는 예제를 보겠습니다.
import streamlit as st
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 데이터 로드
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
# 모델 학습
kmeans = KMeans(n_clusters=3)
df['cluster'] = kmeans.fit_predict(iris.data)
# Streamlit 설정
st.title('Iris Data Clustering')
st.write('클러스터링 결과를 시각화합니다.')
# 클러스터 시각화
fig, ax = plt.subplots()
scatter = ax.scatter(df.iloc[:, 0], df.iloc[:, 1], c=df['cluster'], cmap='viridis')
legend1 = ax.legend(*scatter.legend_elements(), title="Clusters")
ax.add_artist(legend1)
st.pyplot(fig)
2.3 (실습) Streamlit으로 모델 배포하기
Streamlit 앱을 실제로 배포하려면 다음과 같은 단계를 따릅니다:
1. Streamlit Cloud: Streamlit Cloud를 사용하면 쉽게 앱을 배포할 수 있습니다. GitHub 레포지토리를 연결하고 배포 버튼을 클릭하면 됩니다.
2. Heroku: Heroku를 사용하여 Streamlit 앱을 배포할 수 있습니다. Heroku CLI를 설치하고, 앱을 Heroku에 푸시합니다.
3. Docker: Docker 이미지를 생성하여 원하는 플랫폼에 배포할 수 있습니다.
# Streamlit Cloud 배포
# 1. GitHub 레포지토리 생성 및 코드 푸시
# 2. Streamlit Cloud에 로그인하고 레포지토리 연결
# 3. 배포 버튼 클릭
# Heroku 배포
heroku create my-streamlit-app
git push heroku main
# Docker 배포
docker build -t my-streamlit-app .
docker run -p 8501:8501 my-streamlit-app
3.1 붓꽃 분류하기
붓꽃 데이터셋을 사용하여 K-평균 클러스터링을 수행하고 결과를 시각화합니다.
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# 데이터 로드
iris = load_iris()
X = iris.data
# 모델 학습
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
# 클러스터 시각화
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis')
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1])
plt.title('Iris Data Clustering')
plt.show()
3.2 신용카드 고객 세분화하기
신용카드 고객 데이터를 사용하여 클러스터링을 수행하고 고객을 세분화합니다.
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 데이터 로드
url = 'https://raw.githubusercontent.com/sharmaroshan/Customer-Segmentation/master/Mall_Customers.csv'
data = pd.read_csv(url)
# 데이터 전처리
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data.iloc[:, 2:])
# 모델 학습
kmeans = KMeans(n_clusters=5)
kmeans.fit(scaled_data)
# 클러스터 시각화
plt.scatter(scaled_data[:, 0], scaled_data[:, 1], c=kmeans.labels_, cmap='viridis')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.title('Customer Segmentation')
plt.show()
3.3 와인 분류하기
와인 데이터셋을 사용하여 클러스터링을 수행하고 와인을 분류합니다.
from sklearn.datasets import load_wine
import matplotlib.pyplot as plt
# 데이터 로드
wine = load_wine()
X = wine.data
# 모델 학습
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
# 클러스터 시각화
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis')
plt.xlabel(wine.feature_names[0])
plt.ylabel(wine.feature_names[1])
plt.title('Wine Data Clustering')
plt.show()
이번 글에서는 클러스터링 테스크의 개념과 주요 모델들에 대해 알아보았습니다. 다음 글에서는 머신러닝 데이터셋과 프로젝트에 대해 다뤄보겠습니다. 데이터셋을 탐색하고 관리하는 방법, 그리고 프로젝트를 기획하고 진행하는 방법을 알아보겠습니다.
이번 글에서는 머신러닝에서 데이터셋을 탐색하고 관리하는 방법, 그리고 프로젝트를 기획하고 진행하는 방법에 대해 알아보겠습니다.
머신러닝 프로젝트를 시작하기 위해서는 먼저 데이터셋을 확보해야 합니다. 다양한 오픈데이터셋이 존재하며, 이를 활용하여 다양한 머신러닝 문제를 해결할 수 있습니다.
1.1 오픈데이터셋 소개
1.2 데이터셋 탐색 및 다운로드
오픈 데이터셋을 탐색하고 다운로드하는 방법에 대해 알아보겠습니다.
import pandas as pd
# Kaggle 데이터셋 다운로드 예시
# Kaggle API를 사용하여 데이터셋 다운로드
!kaggle datasets download -d uciml/iris
# 데이터 로드
df = pd.read_csv('iris.csv')
print(df.head())
머신러닝 프로젝트를 위해 직접 데이터셋을 제작하는 방법에 대해 알아보겠습니다.
2.1 데이터 수집
데이터는 여러 출처에서 수집할 수 있습니다. 웹 스크래핑, API 사용, 설문 조사 등 다양한 방법을 통해 데이터를 수집할 수 있습니다.
import requests
# 예시: API를 사용하여 데이터 수집
response = requests.get('https://api.example.com/data')
data = response.json()
df = pd.DataFrame(data)
print(df.head())
2.2 데이터 전처리
수집된 데이터를 머신러닝 모델에 적합한 형태로 변환하는 과정입니다. 데이터 정리, 결측치 처리, 이상치 제거, 스케일링 등의 작업이 포함됩니다.
from sklearn.preprocessing import StandardScaler
# 결측치 처리
df.fillna(df.mean(), inplace=True)
# 스케일링
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df)
데이터셋을 효율적으로 관리하고 공유하는 방법에 대해 알아보겠습니다.
3.1 허깅페이스 datasets 소개하기
Hugging Face의 datasets 라이브러리는 다양한 데이터셋을 손쉽게 로드하고 처리할 수 있도록 도와줍니다. 특히, NLP 데이터셋에 강점을 가지고 있습니다.
from datasets import load_dataset
# 데이터셋 로드
dataset = load_dataset('imdb')
print(dataset['train'][0])
3.2 (실습) datasets에 업로드하기
자신이 만든 데이터셋을 Hugging Face에 업로드하여 공유하는 방법에 대해 알아보겠습니다.
from datasets import Dataset, DatasetDict
# 데이터셋 생성
data_dict = {
'text': ['I love machine learning', 'This is an amazing tutorial'],
'label': [1, 0]
}
dataset = Dataset.from_dict(data_dict)
# 데이터셋 업로드
dataset.push_to_hub("my-dataset")
3.3 (실습) datasets에서 불러오기
Hugging Face에 업로드된 데이터셋을 불러오는 방법에 대해 알아보겠습니다.
# 데이터셋 불러오기
dataset = load_dataset('username/my-dataset')
print(dataset['train'][0])
머신러닝 프로젝트를 기획하고 진행하는 방법에 대해 알아보겠습니다.
4.1 대회형 프로젝트 소개
데이터 과학 경진대회는 특정 문제를 해결하기 위해 경쟁하는 형식의 프로젝트입니다. Kaggle, DrivenData, Zindi 등 다양한 플랫폼에서 경진대회를 개최합니다.
4.2 대회 별 개요 및 데이터
각 대회는 특정 주제를 가지고 있으며, 참가자는 주어진 데이터셋을 사용하여 문제를 해결합니다. 예를 들어, 이미지 분류, 자연어 처리, 예측 분석 등이 있습니다.
# Kaggle 대회 데이터셋 로드 예시
!kaggle competitions download -c titanic
# 데이터 로드
train_df = pd.read_csv('train.csv')
test_df = pd.read_csv('test.csv')
print(train_df.head())
이번 글에서는 머신러닝 프로젝트에 필요한 데이터셋을 탐색하고 관리하는 방법, 그리고 프로젝트를 기획하고 진행하는 방법에 대해 알아보았습니다. 다음 글에서는 머신러닝 모델의 실제 구현과 적용에 대해 다뤄보겠습니다. 데이터 전처리, 모델 학습, 성능 평가 등 실제 프로젝트의 각 단계를 자세히 살펴보겠습니다.
이번 글에서는 머신러닝 모델을 실제로 구현하고 적용하는 방법에 대해 자세히 알아보겠습니다. 데이터 전처리, 모델 학습, 성능 평가 등 프로젝트의 각 단계를 차근차근 살펴보겠습니다.
데이터 전처리는 머신러닝 모델의 성능을 좌우하는 중요한 단계입니다. 데이터의 품질을 높이고 모델이 학습하기 좋은 형태로 변환하는 과정입니다.
1.1 데이터 정리
데이터 정리 단계에서는 결측치 처리, 이상치 제거, 데이터 형식 변환 등의 작업을 수행합니다.
import pandas as pd
from sklearn.impute import SimpleImputer
# 데이터 로드
df = pd.read_csv('data.csv')
# 결측치 처리
imputer = SimpleImputer(strategy='mean')
df_filled = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
# 이상치 제거
df_cleaned = df_filled[(df_filled['feature'] > lower_bound) & (df_filled['feature'] < upper_bound)]
1.2 데이터 스케일링
데이터 스케일링은 모델이 각 특징의 스케일 차이로 인해 영향을 받지 않도록 하기 위한 과정입니다. 대표적인 스케일링 방법으로 표준화(Standardization)와 정규화(Normalization)가 있습니다.
from sklearn.preprocessing import StandardScaler
# 데이터 스케일링
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df_cleaned)
1.3 데이터 인코딩
범주형 데이터를 숫자형 데이터로 변환하는 과정입니다. 대표적인 방법으로 원-핫 인코딩(One-Hot Encoding)과 레이블 인코딩(Label Encoding)이 있습니다.
from sklearn.preprocessing import OneHotEncoder
# 원-핫 인코딩
encoder = OneHotEncoder()
encoded_data = encoder.fit_transform(df[['categorical_feature']]).toarray()
데이터 전처리가 완료되면, 본격적으로 모델을 학습시키는 단계입니다. 다양한 모델을 사용하여 학습하고, 성능을 비교해 최적의 모델을 선택합니다.
2.1 모델 선택
머신러닝 모델은 문제 유형에 따라 적절한 모델을 선택해야 합니다. 분류 문제에서는 로지스틱 회귀, 의사결정 트리, 랜덤 포레스트, SVM 등이 사용될 수 있으며, 회귀 문제에서는 선형 회귀, 다중 회귀, 릿지 회귀, 라쏘 회귀 등이 사용될 수 있습니다.
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
# 모델 정의
logreg = LogisticRegression()
rf = RandomForestClassifier()
2.2 모델 학습
선택한 모델을 학습시킵니다. 학습 데이터와 테스트 데이터를 나누고, 학습 데이터를 사용하여 모델을 학습시킵니다.
from sklearn.model_selection import train_test_split
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(scaled_data, df_cleaned['label'], test_size=0.2, random_state=42)
# 모델 학습
logreg.fit(X_train, y_train)
rf.fit(X_train, y_train)
모델의 성능을 평가하는 단계입니다. 다양한 평가 지표를 사용하여 모델의 성능을 측정하고, 최적의 모델을 선택합니다.
3.1 성능 평가 지표
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 예측
y_pred_logreg = logreg.predict(X_test)
y_pred_rf = rf.predict(X_test)
# 평가
accuracy_logreg = accuracy_score(y_test, y_pred_logreg)
precision_logreg = precision_score(y_test, y_pred_logreg)
recall_logreg = recall_score(y_test, y_pred_logreg)
f1_logreg = f1_score(y_test, y_pred_logreg)
accuracy_rf = accuracy_score(y_test, y_pred_rf)
precision_rf = precision_score(y_test, y_pred_rf)
recall_rf = recall_score(y_test, y_pred_rf)
f1_rf = f1_score(y_test, y_pred_rf)
print(f"Logistic Regression - Accuracy: {accuracy_logreg}, Precision: {precision_logreg}, Recall: {recall_logreg}, F1 Score: {f1_logreg}")
print(f"Random Forest - Accuracy: {accuracy_rf}, Precision: {precision_rf}, Recall: {recall_rf}, F1 Score: {f1_rf}")
3.2 교차 검증 (Cross-Validation)
교차 검증은 데이터를 여러 번 나누어 모델을 학습시키고 평가하는 방법입니다. 모델의 일반화 성능을 더 정확하게 평가할 수 있습니다.
from sklearn.model_selection import cross_val_score
# 교차 검증
cv_scores_logreg = cross_val_score(logreg, scaled_data, df_cleaned['label'], cv=5)
cv_scores_rf = cross_val_score(rf, scaled_data, df_cleaned['label'], cv=5)
print(f"Logistic Regression CV Scores: {cv_scores_logreg}")
print(f"Random Forest CV Scores: {cv_scores_rf}")
3.3 모델 튜닝
최적의 모델을 찾기 위해 하이퍼파라미터를 튜닝합니다. Grid Search와 Random Search를 통해 하이퍼파라미터를 조정합니다.
from sklearn.model_selection import GridSearchCV
# 하이퍼파라미터 그리드 정의
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [None, 10, 20, 30]
}
# Grid Search 수행
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=3, scoring='accuracy')
grid_search.fit(X_train, y_train)
# 최적 하이퍼파라미터 출력
print(grid_search.best_params_)
최적의 모델을 선택한 후, 이를 실제 환경에 배포하는 단계입니다. 모델을 API로 배포하거나, 웹 애플리케이션으로 배포할 수 있습니다.
4.1 API 배포
Flask를 사용하여 모델을 API로 배포하는 예제입니다.
from flask import Flask, request, jsonify
import pickle
app = Flask(__name__)
# 모델 로드
with open('model.pkl', 'rb') as f:
model = pickle.load(f)
@app.route('/predict', methods=['POST'])
def predict():
data = request.get_json()
prediction = model.predict([data['features']])
return jsonify({'prediction': prediction[0]})
if __name__ == '__main__':
app.run(debug=True)
4.2 웹 애플리케이션 배포
Streamlit을 사용하여 웹 애플리케이션으로 모델을 배포하는 예제입니다.
import streamlit as st
import numpy as np
import pickle
# 모델 로드
with open('model.pkl', 'rb') as f:
model = pickle.load(f)
# Streamlit 설정
st.title('Machine Learning Model Deployment')
st.write('Input the features to get a prediction.')
# 사용자 입력
features = st.text_input('Features (comma-separated)')
if features:
features = np.array([float(x) for x in features.split(',')])
# 예측
prediction = model.predict([features])
st.write(f'Prediction: {prediction[0]}')
이번 글에서는 머신러닝 모델의 실제 구현과 적용에 대해 알아보았습니다. 데이터 전처리, 모델 학습, 성능 평가, 모델 배포 등 프로젝트의 각 단계를 자세히 살펴보았습니다. 이를 통해 머신러닝 프로젝트를 효과적으로 진행할 수 있을 것입니다.
지난 몇 개월 동안 [Upstage AI Lab 3기] 머신러닝 프로젝트 기본 이론 수업을 들으며 많은 것을 배웠습니다. 이번 글에서는 수강한 전체 과정을 돌아보며 얻은 경험과 배운 내용을 정리해보겠습니다.
머신러닝의 기본 개념부터 시작하여 인공지능, 머신러닝, 딥러닝의 차이점과 지도 학습, 비지도 학습의 차이점을 명확히 이해할 수 있었습니다. 특히, 현업에서의 머신러닝 사례를 통해 이론이 실제로 어떻게 적용되는지를 배울 수 있어 유익했습니다. 성능 평가 방법론을 통해 모델의 성능을 평가하고 개선하는 방법을 배운 것도 큰 도움이 되었습니다.
분류 문제에 대한 다양한 모델들을 배우면서, 각각의 모델이 어떤 상황에서 가장 효과적인지 이해할 수 있었습니다. 로지스틱 회귀와 의사결정 트리 모델을 직접 구현해보고, 데이터 분석과 활용을 통해 실제 데이터셋에 적용해보는 경험은 매우 유익했습니다. 특히, MNIST와 IRIS 데이터셋을 활용한 분류 예시 문제를 통해 이론을 실습으로 연결할 수 있었습니다.
회귀 문제를 해결하기 위한 다양한 모델과 그 원리에 대해 깊이 있게 학습했습니다. 선형 회귀부터 부스팅 계열 모델까지 다양한 회귀 모델을 배우고, 실제 데이터셋에 적용해보며 모델의 성능을 향상시키는 방법을 터득했습니다. 캘리포니아 집값 예측, 자전거 수요 예측, 주가 예측 등 실제 사례를 통해 학습한 내용은 매우 실용적이었습니다.
클러스터링 테스크를 통해 비지도 학습의 개념과 이를 활용한 데이터 분석 방법을 배웠습니다. K-평균, 계층적 클러스터링, DBSCAN, GMM 등 다양한 클러스터링 모델을 배우고, 이를 평가하는 방법도 학습했습니다. 붓꽃 데이터셋, 신용카드 고객 세분화, 와인 분류 등의 예제를 통해 실습하며 클러스터링 모델의 적용 방법을 익힐 수 있었습니다.
머신러닝 프로젝트를 진행하기 위한 데이터셋 탐색, 관리, 제작 방법을 배우며 프로젝트 기획과 실행에 필요한 전반적인 과정에 대해 이해할 수 있었습니다. 특히, Hugging Face의 datasets 라이브러리를 활용한 데이터셋 관리 방법과 Streamlit을 활용한 모델 배포 방법은 실제 프로젝트에 매우 유용하게 적용될 수 있었습니다.
마지막으로, 데이터를 전처리하고 모델을 학습시키고 평가한 후, 이를 실제 환경에 배포하는 전 과정을 학습했습니다. 데이터 전처리의 중요성과 다양한 기법을 이해하고, 모델 학습과 성능 평가를 통해 최적의 모델을 선택하는 방법을 익혔습니다. Flask와 Streamlit을 활용한 모델 배포 방법을 통해 실제 프로젝트를 수행할 수 있는 자신감을 얻을 수 있었습니다.
[Upstage AI Lab 3기] 머신러닝 프로젝트 기본 이론 수업은 이론과 실습을 균형 있게 제공하여 머신러닝의 전반적인 이해를 높이는 데 큰 도움이 되었습니다. 다양한 모델을 배우고 이를 실제 데이터셋에 적용해보는 경험을 통해 실무에서의 활용 능력을 크게 향상시킬 수 있었습니다. 앞으로도 배운 내용을 토대로 더욱 깊이 있는 머신러닝 연구와 프로젝트를 진행할 계획입니다.
이 수업을 통해 얻은 지식과 경험은 저의 머신러닝 여정을 더욱 풍부하게 만들어 주었습니다. 수업을 진행해주신 모든 분들께 감사드리며, 앞으로도 계속해서 머신러닝 분야에서 성장해나가고자 합니다.