[파이썬 기초] scikit-learn 기초 (분류, 회귀, 클러스터링)

2026. 6. 20. 18:00·BI&Programming-Tools/Python

scikit-learn은 파이썬 머신러닝의 표준 라이브러리입니다.

분류, 회귀, 클러스터링, 차원 축소, 전처리, 모델 평가까지 일관된 API로 제공합니다.

생물정보학에서는 유전자 발현 데이터 분류, 변이 우선순위 지정, 샘플 클러스터링 등에 활용됩니다.

pip install scikit-learn

scikit-learn의 공통 API 구조

scikit-learn의 모든 모델은 동일한 인터페이스를 따릅니다.

from sklearn.모듈 import 모델클래스

model = 모델클래스(하이퍼파라미터)   # 모델 생성
model.fit(X_train, y_train)           # 학습
y_pred = model.predict(X_test)        # 예측
score = model.score(X_test, y_test)   # 평가

 

X는 특성(feature) 행렬, y는 레이블(label) 벡터입니다. X의 shape은 (샘플 수, 특성 수)입니다.


데이터 준비: 전처리와 분할


학습/테스트 데이터 분할

from sklearn.model_selection import train_test_split
import numpy as np

# 예시 데이터: 유전자 발현량 (100개 샘플, 50개 유전자)
np.random.seed(42)
X = np.random.randn(100, 50)
y = np.random.randint(0, 2, 100)    # 이진 레이블

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)
print(X_train.shape)    # (80, 50)
print(X_test.shape)     # (20, 50)

 

stratify=y는 클래스 비율을 유지하면서 분할합니다. 클래스 불균형이 있는 경우에 중요합니다.


특성 스케일링

거리 기반 알고리즘(KNN, SVM, 클러스터링)은 특성의 스케일에 민감합니다.

학습 데이터로 스케일러를 fit하고, 테스트 데이터에는 transform만 적용합니다.

from sklearn.preprocessing import StandardScaler, MinMaxScaler

# StandardScaler: 평균 0, 표준편차 1로 변환
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)    # fit + transform
X_test_scaled = scaler.transform(X_test)          # transform만 (fit 없음)

# MinMaxScaler: 0~1 범위로 변환
minmax = MinMaxScaler()
X_train_mm = minmax.fit_transform(X_train)

 

테스트 데이터에 fit_transform()을 사용하면 테스트 데이터 정보가 모델 학습에 누출(data leakage)되므로, 반드시 transform()만 사용해야 합니다.


분류 (Classification)

레이블이 범주형인 경우, 새 샘플이 어느 클래스에 속하는지 예측합니다.


로지스틱 회귀 (Logistic Regression)

이름은 회귀지만 분류 알고리즘입니다.

이진 분류와 다중 분류 모두 지원합니다.

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report

model = LogisticRegression(max_iter=1000, random_state=42)
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)

print(f"정확도: {accuracy_score(y_test, y_pred):.4f}")
print(classification_report(y_test, y_pred))


랜덤 포레스트 (Random Forest)

여러 결정 트리를 앙상블하는 방법으로, 실무에서 자주 쓰이는 강력한 분류기입니다. 스케일링 없이도 잘 작동합니다.

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=100, random_state=42, n_jobs=-1)
rf.fit(X_train, y_train)
y_pred = rf.predict(X_test)

print(f"정확도: {accuracy_score(y_test, y_pred):.4f}")

# 특성 중요도
importances = rf.feature_importances_
top_idx = np.argsort(importances)[::-1][:10]
print("상위 10개 중요 특성 인덱스:", top_idx)


SVM (Support Vector Machine)

고차원 데이터에서 강점을 보이는 분류기입니다. 유전체 데이터처럼 특성 수가 많은 경우에 자주 사용됩니다.

from sklearn.svm import SVC

svm = SVC(kernel="rbf", C=1.0, probability=True, random_state=42)
svm.fit(X_train_scaled, y_train)
y_pred = svm.predict(X_test_scaled)
y_prob = svm.predict_proba(X_test_scaled)[:, 1]    # 클래스 1의 확률

print(f"정확도: {accuracy_score(y_test, y_pred):.4f}")


KNN (K-Nearest Neighbors)

가장 가까운 k개의 이웃의 클래스로 예측합니다.

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train_scaled, y_train)
y_pred = knn.predict(X_test_scaled)
print(f"정확도: {accuracy_score(y_test, y_pred):.4f}")


분류 평가 지표

from sklearn.metrics import (accuracy_score, precision_score,
                              recall_score, f1_score,
                              confusion_matrix, roc_auc_score)

print(f"정확도(Accuracy):  {accuracy_score(y_test, y_pred):.4f}")
print(f"정밀도(Precision): {precision_score(y_test, y_pred):.4f}")
print(f"재현율(Recall):    {recall_score(y_test, y_pred):.4f}")
print(f"F1 score:          {f1_score(y_test, y_pred):.4f}")
print(f"ROC-AUC:           {roc_auc_score(y_test, y_prob):.4f}")
print("혼동 행렬:")
print(confusion_matrix(y_test, y_pred))

 

클래스 불균형이 있을 때는 정확도(Accuracy)만으로는 모델을 평가하기 어렵습니다. F1 score나 ROC-AUC를 함께 확인하는 것이 좋습니다.


회귀 (Regression)

레이블이 연속형 수치인 경우, 값을 예측합니다.


선형 회귀

from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.metrics import mean_squared_error, r2_score
import numpy as np

# 예시 데이터
np.random.seed(42)
X_reg = np.random.randn(100, 10)
y_reg = X_reg[:, 0] * 3 + X_reg[:, 1] * (-1.5) + np.random.randn(100) * 0.5

X_tr, X_te, y_tr, y_te = train_test_split(X_reg, y_reg,
                                            test_size=0.2, random_state=42)

# 기본 선형 회귀
lr = LinearRegression()
lr.fit(X_tr, y_tr)
y_pred = lr.predict(X_te)

mse = mean_squared_error(y_te, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_te, y_pred)
print(f"RMSE: {rmse:.4f}, R²: {r2:.4f}")

 

정규화 회귀 (Ridge, Lasso)


특성 수가 많거나 다중공선성이 있을 때 과적합을 방지합니다.

# Ridge: L2 정규화 (계수를 작게 만듦)
ridge = Ridge(alpha=1.0)
ridge.fit(X_tr, y_tr)
print(f"Ridge R²: {ridge.score(X_te, y_te):.4f}")

# Lasso: L1 정규화 (불필요한 특성의 계수를 0으로 만듦, 특성 선택 효과)
lasso = Lasso(alpha=0.1)
lasso.fit(X_tr, y_tr)
print(f"Lasso R²: {lasso.score(X_te, y_te):.4f}")
print(f"0이 된 계수 수: {(lasso.coef_ == 0).sum()}")


회귀 평가 지표

지표 의미
MAE 평균 절대 오차
MSE 평균 제곱 오차
RMSE 평균 제곱근 오차 (MSE의 제곱근, 원래 단위)
R² 결정계수 (1에 가까울수록 좋음)
from sklearn.metrics import mean_absolute_error

print(f"MAE:  {mean_absolute_error(y_te, y_pred):.4f}")
print(f"RMSE: {np.sqrt(mean_squared_error(y_te, y_pred)):.4f}")
print(f"R²:   {r2_score(y_te, y_pred):.4f}")

클러스터링 (Clustering)

레이블 없이 데이터를 비슷한 것끼리 묶습니다. 비지도 학습입니다.


K-Means

데이터를 k개의 클러스터로 나눕니다. k를 미리 지정해야 합니다.

from sklearn.cluster import KMeans

# 예시: 유전자 발현 데이터 클러스터링
np.random.seed(42)
X_clust = np.vstack([
    np.random.randn(50, 2) + [0, 0],
    np.random.randn(50, 2) + [5, 5],
    np.random.randn(50, 2) + [0, 5],
])

kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
kmeans.fit(X_clust)
labels = kmeans.labels_

print(f"클러스터 레이블: {set(labels)}")
print(f"클러스터 중심:\n{kmeans.cluster_centers_}")

적절한 k 찾기: 엘보우 방법

import matplotlib.pyplot as plt

inertias = []
k_range = range(1, 11)

for k in k_range:
    km = KMeans(n_clusters=k, random_state=42, n_init=10)
    km.fit(X_clust)
    inertias.append(km.inertia_)

plt.figure(figsize=(7, 4))
plt.plot(k_range, inertias, "bo-")
plt.xlabel("클러스터 수 (k)")
plt.ylabel("Inertia")
plt.title("엘보우 방법으로 최적 k 찾기")
plt.show()


DBSCAN

밀도 기반 클러스터링으로, k를 미리 지정하지 않아도 됩니다. 노이즈(이상치)를 자동으로 탐지합니다.

from sklearn.cluster import DBSCAN

dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan.fit(X_clust)
labels = dbscan.labels_

n_clusters = len(set(labels)) - (1 if -1 in labels else 0)
n_noise = (labels == -1).sum()
print(f"클러스터 수: {n_clusters}, 노이즈 포인트: {n_noise}")

labels_에서 -1은 노이즈로 분류된 포인트입니다.


계층적 클러스터링 (Hierarchical Clustering)

덴드로그램으로 클러스터 구조를 시각화할 수 있어, 생물정보학에서 히트맵과 함께 자주 사용합니다.

from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt

# 클러스터링
hclust = AgglomerativeClustering(n_clusters=3, linkage="ward")
labels = hclust.fit_predict(X_clust)

# 덴드로그램 시각화 (scipy 사용)
linked = linkage(X_clust, method="ward")
plt.figure(figsize=(10, 4))
dendrogram(linked, truncate_mode="lastp", p=20)
plt.title("Hierarchical Clustering Dendrogram")
plt.xlabel("샘플")
plt.ylabel("거리")
plt.show()


클러스터링 평가

레이블이 없는 비지도 학습이므로 평가가 어렵습니다. 내부 평가 지표를 활용합니다.

from sklearn.metrics import silhouette_score, davies_bouldin_score

# 실루엣 점수: -1~1, 1에 가까울수록 좋음
sil = silhouette_score(X_clust, labels)
print(f"실루엣 점수: {sil:.4f}")

# Davies-Bouldin 점수: 낮을수록 좋음
db = davies_bouldin_score(X_clust, labels)
print(f"Davies-Bouldin 점수: {db:.4f}")


교차 검증 (Cross-Validation)

단순한 train/test 분할보다 신뢰할 수 있는 모델 평가 방법입니다.

from sklearn.model_selection import cross_val_score, StratifiedKFold

model = RandomForestClassifier(n_estimators=100, random_state=42)

# 5-fold 교차 검증
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=cv, scoring="f1")

print(f"F1 점수: {scores}")
print(f"평균: {scores.mean():.4f} ± {scores.std():.4f}")


Pipeline: 전처리 + 모델을 하나로

전처리와 모델을 파이프라인으로 묶으면 데이터 누출 없이 교차 검증을 안전하게 수행할 수 있습니다.

from sklearn.pipeline import Pipeline

pipeline = Pipeline([
    ("scaler", StandardScaler()),
    ("classifier", RandomForestClassifier(n_estimators=100, random_state=42))
])

scores = cross_val_score(pipeline, X, y, cv=5, scoring="f1")
print(f"Pipeline F1: {scores.mean():.4f} ± {scores.std():.4f}")

 

Pipeline을 사용하면 fit()이 호출될 때 각 단계가 순서대로 실행되고, 교차 검증 시 각 fold마다 독립적으로 전처리가 적용되어 데이터 누출을 방지합니다.


정리표

작업 대표 알고리즘 클래스
분류 로지스틱 회귀 LogisticRegression
분류 랜덤 포레스트 RandomForestClassifier
분류 SVM SVC
분류 KNN KNeighborsClassifier
회귀 선형 회귀 LinearRegression
회귀 Ridge / Lasso Ridge, Lasso
클러스터링 K-Means KMeans
클러스터링 DBSCAN DBSCAN
클러스터링 계층적 AgglomerativeClustering
전처리 표준화 StandardScaler
평가 교차 검증 cross_val_score
통합 파이프라인 Pipeline

태그: 파이썬, 파이썬기초, scikit-learn, 머신러닝, 분류, 회귀, 클러스터링, RandomForest, KMeans, DBSCAN, Pipeline, 생물정보학, 데이터분석

'BI&Programming-Tools > Python' 카테고리의 다른 글

[파이썬 기초] 차원 축소 (PCA, UMAP)  (0) 2026.06.21
[파이썬 기초] 데이터 전처리 심화 (결측값, 이상값, 정규화, 인코딩)  (0) 2026.06.20
[파이썬 기초] argparse로 커맨드라인 도구 만들기  (0) 2026.06.20
[파이썬 기초] 통계 기초 (scipy)  (0) 2026.06.19
[파이썬 기초] Matplotlib / Seaborn 시각화  (0) 2026.06.18
'BI&Programming-Tools/Python' 카테고리의 다른 글
  • [파이썬 기초] 차원 축소 (PCA, UMAP)
  • [파이썬 기초] 데이터 전처리 심화 (결측값, 이상값, 정규화, 인코딩)
  • [파이썬 기초] argparse로 커맨드라인 도구 만들기
  • [파이썬 기초] 통계 기초 (scipy)
데이터로 읽는 생명
데이터로 읽는 생명
is-note 님의 블로그 입니다.
  • 데이터로 읽는 생명
    In Silico Note
    데이터로 읽는 생명
  • 전체
    오늘
    어제
    • 분류 전체보기 (190)
      • Bio-Knowledge (16)
        • 분자생물학 & 유전학 기초 (0)
        • 전사체학 & 유전자 발현 (0)
        • 구조생물학 & 단백질 (0)
        • 싱글셀 & 다중오믹스 (0)
        • 임상유전학 & 질환 데이터 (0)
      • Programming (4)
        • API (4)
      • BI&Programming-Tools (111)
        • File Formats (14)
        • Linux & Bash Script (38)
        • Python (35)
        • R (11)
        • 통계 (8)
        • Pipeline Manager (0)
        • Etc (5)
      • Bio Data Analysis (28)
        • 서열분석개론 (6)
        • WGS(Whole Genome Seq) (11)
        • WES(Whole Exome Seq) (2)
        • RNA-Seq (4)
        • Metagenome (2)
        • Non-human Resequencing (1)
        • 임상유전체 분석 (1)
        • Multi-Omics (1)
      • Bio-Trends & Tech (1)
      • 코딩테스트 연습 (30)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    bioinformatics
    분자생물학
    리눅스
    유전체분석
    데이터분석
    코딩테스트
    파이썬
    R
    파이썬연습
    파이썬기초
    GATK
    FASTQ
    생물정보학
    ngs
    wgs
    리눅스기초
    fasta
    R기초
    통계
    파일포맷
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
데이터로 읽는 생명
[파이썬 기초] scikit-learn 기초 (분류, 회귀, 클러스터링)
상단으로

티스토리툴바