1. 머신러닝 개론

머신러닝(Machine Learning)은 인공지능(AI)의 한 분야로, 데이터에서 패턴을 찾아내고 이를 통해 예측하거나 분류하는 등의 작업을 수행합니다. 이 블로그 글에서는 머신러닝의 기초 개념부터 실제 사례까지 차근차근 살펴보겠습니다.

01 머신러닝의 정의

1.1 인공지능, 머신러닝, 딥러닝 개념정리

  • 인공지능 (AI): 인간의 지능을 모방하여 문제를 해결하는 컴퓨터 시스템.
  • 머신러닝 (ML): 데이터에서 학습하여 특정 작업을 수행하는 AI의 하위 분야.
  • 딥러닝 (DL): 인공신경망을 기반으로 하는 머신러닝의 하위 분야, 대규모 데이터에서 뛰어난 성능을 발휘.

머신러닝과 딥러닝의 차이점은 주로 사용되는 알고리즘과 데이터의 양, 그리고 학습 방식에 있습니다. 딥러닝은 특히 이미지나 음성 인식 등에서 탁월한 성능을 보이며, 복잡한 신경망 구조를 사용하여 깊이 있는 학습을 수행합니다.

1.2 지도/비지도 학습

  • 지도 학습 (Supervised Learning): 정답(label)이 있는 데이터를 통해 학습. 분류(Classification)와 회귀(Regression) 문제 해결에 사용.
  • 비지도 학습 (Unsupervised Learning): 정답이 없는 데이터를 통해 학습. 클러스터링(Clustering)과 차원 축소(Dimensionality Reduction) 문제 해결에 사용.

지도 학습의 예로는 스팸 이메일 필터링, 이미지 분류 등이 있으며, 비지도 학습의 예로는 고객 세분화, 차원 축소를 통한 데이터 시각화 등이 있습니다.

1.3 정형/비정형 데이터

  • 정형 데이터 (Structured Data): 행과 열로 구성된 데이터, 예를 들어, 엑셀 시트나 데이터베이스 테이블.
  • 비정형 데이터 (Unstructured Data): 일정한 구조가 없는 데이터, 예를 들어, 텍스트, 이미지, 오디오 데이터.

정형 데이터는 주로 숫자나 문자열로 이루어진 반면, 비정형 데이터는 자연어 처리(NLP), 이미지 처리 등에서 다루어지는 경우가 많습니다.

1.4 현업에서의 머신러닝 사례 살펴보기

  • 추천 시스템 (Recommendation System): 사용자 행동 데이터를 기반으로 맞춤형 콘텐츠 추천.
  • 이미지 인식 (Image Recognition): 의료 영상 분석, 자율 주행 자동차 등에서 활용.
  • 자연어 처리 (NLP): 챗봇, 문서 요약, 번역 등.

02 머신러닝 성능 평가 방법론

2.1 성능 평가 지표

  • 정확도 (Accuracy): 전체 예측 중 맞게 예측한 비율.
  • 정밀도 (Precision): 양성 예측 중 실제 양성인 비율.
  • 재현율 (Recall): 실제 양성 중 맞게 예측한 비율.
  • F1 스코어 (F1 Score): 정밀도와 재현율의 조화 평균.
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 과대적합과 과소적합

  • 과대적합 (Overfitting): 훈련 데이터에 너무 맞춰져서 새로운 데이터에 대한 일반화 성능이 떨어짐.
  • 과소적합 (Underfitting): 모델이 충분히 학습되지 않아 훈련 데이터와 새로운 데이터 모두에서 성능이 떨어짐.

03 머신러닝 모델의 학습원리 살펴보기 (분류, 회귀)

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 연속형과 범주형 데이터

  • 연속형 데이터 (Continuous Data): 실수 값을 가지는 데이터, 예를 들어, 온도, 키.
  • 범주형 데이터 (Categorical Data): 특정 범주 값을 가지는 데이터, 예를 들어, 성별, 혈액형.

3.4 분류와 회귀 문제

  • 분류 (Classification): 데이터가 어느 카테고리에 속하는지 예측. 예를 들어, 이메일이 스팸인지 아닌지 분류.
  • 회귀 (Regression): 연속형 값을 예측. 예를 들어, 주택 가격 예측.
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)

이제 머신러닝의 기본 개념과 주요 요소들에 대해 이해했으니, 다음 글에서는 분류 테스크와 관련된 내용을 다뤄보겠습니다. 머신러닝의 다양한 모델과 이를 실제로 적용하는 방법에 대해 심도 있게 알아보겠습니다.

2. 머신러닝과 분류 테스크

이번 글에서는 머신러닝에서 분류 테스크에 대해 자세히 알아보겠습니다. 분류 테스크는 주어진 데이터 포인트가 어떤 카테고리에 속하는지를 예측하는 작업입니다.

01 분류 테스크 정의와 모델

1.1 분류 테스크 살펴보기

분류 테스크는 데이터 포인트가 미리 정의된 여러 카테고리 중 하나에 속하는지 예측하는 작업입니다. 예를 들어, 이메일이 스팸인지 아닌지를 분류하거나, 손글씨 숫자를 인식하는 작업이 분류 테스크에 해당합니다.

1.2 분류 테스크 모델 종류

주요 분류 모델에는 다음과 같은 것들이 있습니다:

  • 로지스틱 회귀 (Logistic Regression): 선형 회귀와 비슷하지만, 출력이 0과 1 사이의 값을 가지도록 시그모이드 함수(sigmoid function)를 사용합니다.
  • 의사결정 트리 (Decision Tree): 데이터의 특정 속성을 기준으로 분할하여 결정 규칙을 만들어나가는 트리 구조의 모델.
  • 서포트 벡터 머신 (SVM): 데이터 포인트들을 분리하는 최적의 초평면을 찾는 모델.
  • 나이브 베이즈 (Naive Bayes): 조건부 확률을 기반으로 분류하는 모델.
  • K-최근접 이웃 (K-Nearest Neighbors): 데이터 포인트와 가장 가까운 K개의 이웃을 기반으로 분류하는 모델.

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()

02 데이터 분석 및 활용하기

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()

03 머신러닝 모델로 분류 예시문제 풀어보기

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))

이제 분류 테스크의 기본 개념과 모델들에 대해 알아보았습니다. 다음 글에서는 회귀 테스크에 대해 다뤄보겠습니다. 회귀 테스크는 연속적인 값을 예측하는 문제로, 주택 가격 예측, 주가 예측 등이 이에 해당합니다.

3. 머신러닝과 회귀 테스크

이번 글에서는 머신러닝에서 회귀 테스크에 대해 자세히 알아보겠습니다. 회귀 테스크는 연속적인 값을 예측하는 작업으로, 예를 들어 주택 가격 예측, 주가 예측 등이 이에 해당합니다.

01 회귀 태스크 정의와 모델

1.1 회귀 태스크 살펴보기

회귀 테스크는 주어진 입력 데이터로부터 연속적인 출력을 예측하는 작업입니다. 예를 들어, 특정 날짜의 주가를 예측하거나, 주택의 면적과 방 개수에 따라 가격을 예측하는 작업이 회귀 테스크에 해당합니다.

1.2 회귀 태스크 모델 종류

주요 회귀 모델에는 다음과 같은 것들이 있습니다:

  • 선형 회귀 (Linear Regression): 입력 변수와 출력 변수 사이의 선형 관계를 모델링합니다.
  • 다중 회귀 (Multiple Regression): 여러 개의 입력 변수를 사용하여 출력을 예측합니다.
  • 릿지 회귀 (Ridge Regression): 선형 회귀에 L2 정규화를 추가하여 과적합을 방지합니다.
  • 라쏘 회귀 (Lasso Regression): 선형 회귀에 L1 정규화를 추가하여 과적합을 방지하고, 변수 선택을 수행합니다.
  • 부스팅 계열 모델 (Boosting Models): 여러 약한 모델을 결합하여 강력한 모델을 만듭니다. 대표적으로 XGBoost, LightGBM 등이 있습니다.

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)}")

02 모델 성능 기록 및 향상시키기

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 과대적합과 과소적합 해결하기

  • 과대적합 (Overfitting): 모델이 훈련 데이터에 너무 맞춰져 있어 새로운 데이터에 대한 일반화 성능이 떨어지는 경우.
    • 해결 방법: 더 많은 데이터를 사용하거나, 정규화를 적용하거나, 모델의 복잡도를 줄임.
  • 과소적합 (Underfitting): 모델이 충분히 학습되지 않아 훈련 데이터와 새로운 데이터 모두에서 성능이 떨어지는 경우.
    • 해결 방법: 모델의 복잡도를 높이거나, 더 많은 특징(feature)을 사용함.

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_)

03 (실습) 머신러닝 모델로 회귀 예시문제 풀어보기

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')

# 데이터 전처리 및 모델 학습은 위의 예시와 비슷한 과정으로 진행
# ...

이번 글에서는 회귀 테스크의 개념과 주요 모델들에 대해 알아보았습니다. 다음 글에서는 클러스터링 테스크에 대해 다뤄보겠습니다. 클러스터링 테스크는 데이터를 유사한 그룹으로 나누는 작업으로, 고객 세분화, 문서 분류 등에서 많이 사용됩니다.

4. 머신러닝과 클러스터링 테스크

이번 글에서는 머신러닝에서 클러스터링 테스크에 대해 자세히 알아보겠습니다. 클러스터링 테스크는 데이터를 유사한 그룹으로 나누는 작업입니다.

01 클러스터링 태스크 정의와 모델

1.1 클러스터링 테스크 살펴보기

클러스터링 테스크는 레이블이 없는 데이터를 유사성에 따라 그룹으로 나누는 작업입니다. 예를 들어, 고객 세분화, 문서 군집화, 이미지 세그멘테이션 등이 클러스터링 테스크에 해당합니다.

1.2 클러스터링 테스크 모델 종류

주요 클러스터링 모델에는 다음과 같은 것들이 있습니다:

  • K-평균 (K-Means): 데이터를 K개의 클러스터로 나누는 가장 일반적인 클러스터링 알고리즘.
  • 계층적 클러스터링 (Hierarchical Clustering): 데이터의 계층 구조를 기반으로 클러스터를 형성.
  • DBSCAN (Density-Based Spatial Clustering of Applications with Noise): 밀도 기반 클러스터링 알고리즘으로, 노이즈 데이터를 잘 처리함.
  • GMM (Gaussian Mixture Model): 데이터가 여러 개의 가우시안 분포로부터 생성된 것으로 가정하고 클러스터링.

1.3 클러스터링 평가

클러스터링의 성능을 평가하기 위해 다양한 지표를 사용합니다:

  • 실루엣 스코어 (Silhouette Score): 클러스터 내 데이터 포인트가 얼마나 유사한지와 클러스터 간 데이터 포인트가 얼마나 다른지를 평가.
  • 엘보 방법 (Elbow Method): 클러스터의 개수를 선택할 때, 클러스터 내 분산이 급격히 줄어드는 지점을 찾음.
  • 다비즈-볼딘 지수 (Davies-Bouldin Index): 클러스터의 밀도와 클러스터 간의 분리도를 평가.
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}")

02 모델 결과 서빙하기

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

03 (실습) 머신러닝 모델로 클러스터링 예시문제 풀어보기

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()

이번 글에서는 클러스터링 테스크의 개념과 주요 모델들에 대해 알아보았습니다. 다음 글에서는 머신러닝 데이터셋과 프로젝트에 대해 다뤄보겠습니다. 데이터셋을 탐색하고 관리하는 방법, 그리고 프로젝트를 기획하고 진행하는 방법을 알아보겠습니다.

5. 머신러닝 데이터셋과 프로젝트

이번 글에서는 머신러닝에서 데이터셋을 탐색하고 관리하는 방법, 그리고 프로젝트를 기획하고 진행하는 방법에 대해 알아보겠습니다.

01 오픈데이터셋 살펴보기

머신러닝 프로젝트를 시작하기 위해서는 먼저 데이터셋을 확보해야 합니다. 다양한 오픈데이터셋이 존재하며, 이를 활용하여 다양한 머신러닝 문제를 해결할 수 있습니다.

1.1 오픈데이터셋 소개

  • Kaggle: 데이터 과학 경진대회 플랫폼으로, 다양한 도메인의 데이터셋을 제공합니다. 예: Kaggle Datasets
  • UCI Machine Learning Repository: 다양한 머신러닝 데이터셋을 제공하는 저장소입니다. 예: UCI ML Repository
  • Google Dataset Search: 구글에서 제공하는 데이터셋 검색 엔진입니다. 예: Google Dataset Search

1.2 데이터셋 탐색 및 다운로드

오픈 데이터셋을 탐색하고 다운로드하는 방법에 대해 알아보겠습니다.

import pandas as pd

# Kaggle 데이터셋 다운로드 예시
# Kaggle API를 사용하여 데이터셋 다운로드
!kaggle datasets download -d uciml/iris

# 데이터 로드
df = pd.read_csv('iris.csv')
print(df.head())

02 데이터셋 제작하기

머신러닝 프로젝트를 위해 직접 데이터셋을 제작하는 방법에 대해 알아보겠습니다.

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)

03 데이터셋 관리하기

데이터셋을 효율적으로 관리하고 공유하는 방법에 대해 알아보겠습니다.

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])

04 프로젝트 소개

머신러닝 프로젝트를 기획하고 진행하는 방법에 대해 알아보겠습니다.

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())

이번 글에서는 머신러닝 프로젝트에 필요한 데이터셋을 탐색하고 관리하는 방법, 그리고 프로젝트를 기획하고 진행하는 방법에 대해 알아보았습니다. 다음 글에서는 머신러닝 모델의 실제 구현과 적용에 대해 다뤄보겠습니다. 데이터 전처리, 모델 학습, 성능 평가 등 실제 프로젝트의 각 단계를 자세히 살펴보겠습니다.

6. 머신러닝 모델의 실제 구현과 적용

이번 글에서는 머신러닝 모델을 실제로 구현하고 적용하는 방법에 대해 자세히 알아보겠습니다. 데이터 전처리, 모델 학습, 성능 평가 등 프로젝트의 각 단계를 차근차근 살펴보겠습니다.

01 데이터 전처리

데이터 전처리는 머신러닝 모델의 성능을 좌우하는 중요한 단계입니다. 데이터의 품질을 높이고 모델이 학습하기 좋은 형태로 변환하는 과정입니다.

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()

02 모델 학습

데이터 전처리가 완료되면, 본격적으로 모델을 학습시키는 단계입니다. 다양한 모델을 사용하여 학습하고, 성능을 비교해 최적의 모델을 선택합니다.

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)

03 성능 평가

모델의 성능을 평가하는 단계입니다. 다양한 평가 지표를 사용하여 모델의 성능을 측정하고, 최적의 모델을 선택합니다.

3.1 성능 평가 지표

  • 정확도 (Accuracy): 전체 예측 중 맞게 예측한 비율.
  • 정밀도 (Precision): 양성 예측 중 실제 양성인 비율.
  • 재현율 (Recall): 실제 양성 중 맞게 예측한 비율.
  • F1 스코어 (F1 Score): 정밀도와 재현율의 조화 평균.
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_)

04 모델 배포

최적의 모델을 선택한 후, 이를 실제 환경에 배포하는 단계입니다. 모델을 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기] 머신러닝 프로젝트 기본 이론 수업을 들으며 많은 것을 배웠습니다. 이번 글에서는 수강한 전체 과정을 돌아보며 얻은 경험과 배운 내용을 정리해보겠습니다.

1. 머신러닝 개론

머신러닝의 기본 개념부터 시작하여 인공지능, 머신러닝, 딥러닝의 차이점과 지도 학습, 비지도 학습의 차이점을 명확히 이해할 수 있었습니다. 특히, 현업에서의 머신러닝 사례를 통해 이론이 실제로 어떻게 적용되는지를 배울 수 있어 유익했습니다. 성능 평가 방법론을 통해 모델의 성능을 평가하고 개선하는 방법을 배운 것도 큰 도움이 되었습니다.

2. 머신러닝과 분류 테스크

분류 문제에 대한 다양한 모델들을 배우면서, 각각의 모델이 어떤 상황에서 가장 효과적인지 이해할 수 있었습니다. 로지스틱 회귀와 의사결정 트리 모델을 직접 구현해보고, 데이터 분석과 활용을 통해 실제 데이터셋에 적용해보는 경험은 매우 유익했습니다. 특히, MNIST와 IRIS 데이터셋을 활용한 분류 예시 문제를 통해 이론을 실습으로 연결할 수 있었습니다.

3. 머신러닝과 회귀 테스크

회귀 문제를 해결하기 위한 다양한 모델과 그 원리에 대해 깊이 있게 학습했습니다. 선형 회귀부터 부스팅 계열 모델까지 다양한 회귀 모델을 배우고, 실제 데이터셋에 적용해보며 모델의 성능을 향상시키는 방법을 터득했습니다. 캘리포니아 집값 예측, 자전거 수요 예측, 주가 예측 등 실제 사례를 통해 학습한 내용은 매우 실용적이었습니다.

4. 머신러닝과 클러스터링 테스크

클러스터링 테스크를 통해 비지도 학습의 개념과 이를 활용한 데이터 분석 방법을 배웠습니다. K-평균, 계층적 클러스터링, DBSCAN, GMM 등 다양한 클러스터링 모델을 배우고, 이를 평가하는 방법도 학습했습니다. 붓꽃 데이터셋, 신용카드 고객 세분화, 와인 분류 등의 예제를 통해 실습하며 클러스터링 모델의 적용 방법을 익힐 수 있었습니다.

5. 머신러닝 데이터셋과 프로젝트

머신러닝 프로젝트를 진행하기 위한 데이터셋 탐색, 관리, 제작 방법을 배우며 프로젝트 기획과 실행에 필요한 전반적인 과정에 대해 이해할 수 있었습니다. 특히, Hugging Face의 datasets 라이브러리를 활용한 데이터셋 관리 방법과 Streamlit을 활용한 모델 배포 방법은 실제 프로젝트에 매우 유용하게 적용될 수 있었습니다.

6. 모델의 실제 구현과 적용

마지막으로, 데이터를 전처리하고 모델을 학습시키고 평가한 후, 이를 실제 환경에 배포하는 전 과정을 학습했습니다. 데이터 전처리의 중요성과 다양한 기법을 이해하고, 모델 학습과 성능 평가를 통해 최적의 모델을 선택하는 방법을 익혔습니다. Flask와 Streamlit을 활용한 모델 배포 방법을 통해 실제 프로젝트를 수행할 수 있는 자신감을 얻을 수 있었습니다.

총평

[Upstage AI Lab 3기] 머신러닝 프로젝트 기본 이론 수업은 이론과 실습을 균형 있게 제공하여 머신러닝의 전반적인 이해를 높이는 데 큰 도움이 되었습니다. 다양한 모델을 배우고 이를 실제 데이터셋에 적용해보는 경험을 통해 실무에서의 활용 능력을 크게 향상시킬 수 있었습니다. 앞으로도 배운 내용을 토대로 더욱 깊이 있는 머신러닝 연구와 프로젝트를 진행할 계획입니다.

이 수업을 통해 얻은 지식과 경험은 저의 머신러닝 여정을 더욱 풍부하게 만들어 주었습니다. 수업을 진행해주신 모든 분들께 감사드리며, 앞으로도 계속해서 머신러닝 분야에서 성장해나가고자 합니다.

profile
AI가 재밌는 걸

0개의 댓글