9. 최적화 및 기계 학습: scikit-learn

최적화 및 기계 학습: scikit-learn | 지식에 대한 탐구

소개

 

scikit-learn은 파이썬에서 가장 널리 사용되는 기계 학습 라이브러리 중 하나입니다. 데이터 전처리, 차원 축소, 분류, 회귀, 클러스터링 등 다양한 기계 학습 작업을 수행할 수 있는 도구를 제공합니다. 이 라이브러리는 사용하기 쉽고, 효율적이며, 다른 파이썬 라이브러리들과 잘 통합됩니다. 이 글에서는 scikit-learn의 주요 기능과 사용법을 상세히 살펴보겠습니다.

 

1. scikit-learn 설치 및 기본 구조

1.1 설치

scikit-learn은 pip를 사용하여 쉽게 설치할 수 있습니다:

# scikit-learn 설치 명령어
pip install scikit-learn

 

1.2 기본 구조

scikit-learn은 일관된 인터페이스를 제공합니다. 대부분의 알고리즘은 다음과 같은 메서드를 가집니다:

  • fit(): 모델을 학습합니다.
  • predict(): 새로운 데이터에 대해 예측합니다.
  • transform(): 데이터를 변환합니다 (예: 전처리, 차원 축소).
  • fit_transform(): fit과 transform을 한 번에 수행합니다.

 

2. 데이터 전처리

 

2.1 특성 스케일링

특성의 스케일을 조정하는 것은 많은 기계 학습 알고리즘에서 중요합니다.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)  # X는 원본 데이터

 

2.2 범주형 데이터 인코딩

범주형 데이터를 수치형으로 변환합니다.

from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder(sparse=False)
X_encoded = encoder.fit_transform(X)  # X는 범주형 데이터

 

2.3 결측치 처리

결측치를 처리하는 방법 중 하나는 평균값으로 대체하는 것입니다.

from sklearn.impute import SimpleImputer

imputer = SimpleImputer(strategy='mean')
X_imputed = imputer.fit_transform(X)  # X는 결측치가 있는 데이터

 

3. 차원 축소

3.1 주성분 분석 (PCA)

PCA는 데이터의 분산을 최대한 보존하면서 차원을 줄입니다.

from sklearn.decomposition import PCA

pca = PCA(n_components=2)  # 2차원으로 축소
X_reduced = pca.fit_transform(X)  # X는 고차원 데이터

 

3.2 t-SNE

t-SNE는 고차원 데이터를 시각화하는 데 유용한 비선형 차원 축소 기법입니다.

from sklearn.manifold import TSNE

tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)  # X는 고차원 데이터

 

4. 분류

4.1 로지스틱 회귀

로지스틱 회귀는 이진 분류 문제에 널리 사용됩니다.

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 데이터를 훈련set과 테스트set으로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LogisticRegression()
model.fit(X_train, y_train)  # 모델 학습

predictions = model.predict(X_test)  # 테스트 데이터로 예측

 

4.2 결정 트리

결정 트리는 해석하기 쉬운 모델을 제공합니다.

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier(max_depth=5)  # 트리의 최대 깊이를 5로 제한
model.fit(X_train, y_train)  # 모델 학습

 

4.3 랜덤 포레스트

랜덤 포레스트는 여러 개의 결정 트리를 결합하여 성능을 향상시킵니다.

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators=100)  # 100개의 트리 사용
model.fit(X_train, y_train)  # 모델 학습

 

5. 회귀

5.1 선형 회귀

선형 회귀는 종속 변수와 독립 변수 사이의 선형 관계를 모델링합니다.

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(X_train, y_train)  # 모델 학습

predictions = model.predict(X_test)  # 테스트 데이터로 예측

 

5.2 라쏘 회귀

라쏘 회귀는 L1 정규화를 사용하여 특성 선택을 수행합니다.

from sklearn.linear_model import Lasso

model = Lasso(alpha=0.1)  # alpha는 정규화 강도
model.fit(X_train, y_train)  # 모델 학습

 

6. 클러스터링

6.1 K-평균 클러스터링

K-평균은 데이터를 K개의 클러스터로 나누는 알고리즘입니다.

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=5)  # 5개의 클러스터로 나눔
clusters = kmeans.fit_predict(X)  # 클러스터링 수행

 

6.2 계층적 클러스터링

계층적 클러스터링은 데이터 포인트들을 트리 구조로 구성합니다.

from sklearn.cluster import AgglomerativeClustering

clustering = AgglomerativeClustering(n_clusters=5)  # 5개의 클러스터로 나눔
clusters = clustering.fit_predict(X)  # 클러스터링 수행

 

7. 모델 평가

7.1 교차 검증

교차 검증은 모델의 일반화 성능을 평가하는 데 사용됩니다.

from sklearn.model_selection import cross_val_score

scores = cross_val_score(model, X, y, cv=5)  # 5-fold 교차 검증
print(f"평균 정확도: {scores.mean():.2f} (+/- {scores.std() * 2:.2f})")

 

7.2 혼동 행렬

혼동 행렬은 분류 모델의 성능을 시각화하는 데 유용합니다.

from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

cm = confusion_matrix(y_test, predictions)
sns.heatmap(cm, annot=True, fmt='d')
plt.ylabel('Actual')
plt.xlabel('Predicted')
plt.show()

 







 

8. 하이퍼파라미터 튜닝

8.1 그리드 탐색

그리드 탐색은 가능한 모든 하이퍼파라미터 조합을 시도합니다.

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

param_grid = {'C': [0.1, 1, 10], 'kernel': ['rbf', 'linear']}
grid_search = GridSearchCV(SVC(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

print(f"최적의 파라미터: {grid_search.best_params_}")

 

8.2 랜덤 탐색

랜덤 탐색은 무작위로 하이퍼파라미터 조합을 선택하여 시도합니다.

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform

param_distributions = {'C': uniform(loc=0, scale=4),
                       'kernel': ['rbf', 'linear']}
random_search = RandomizedSearchCV(SVC(), param_distributions, n_iter=10, cv=5)
random_search.fit(X_train, y_train)

print(f"최적의 파라미터: {random_search.best_params_}")

 

9. 파이프라인

파이프라인은 여러 단계의 데이터 처리와 모델링을 연결합니다.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

pipeline = Pipeline([
    ('scaler', StandardScaler()),  # 첫 번째 단계: 스케일링
    ('svm', SVC())  # 두 번째 단계: SVM 분류기
])

pipeline.fit(X_train, y_train)  # 파이프라인 학습
predictions = pipeline.predict(X_test)  # 테스트 데이터로 예측

 

10. 실제 응용 사례

10.1 아이리스 꽃 분류

아이리스 데이터셋을 사용하여 꽃의 품종을 분류해보겠습니다.

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, 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.3, random_state=42)

# 모델 학습
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# 예측
predictions = model.predict(X_test)

# 성능 평가
print(f"정확도: {accuracy_score(y_test, predictions):.2f}")
print("\n분류 보고서:")
print(classification_report(y_test, predictions, target_names=iris.target_names))

 

10.2 주택 가격 예측

보스턴 주택 가격 데이터셋을 사용하여 주택 가격을 예측해보겠습니다.

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error, r2_score

# 데이터 로드
boston = load_boston()
X, y = boston.data, boston.target

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 학습
model = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, random_state=42)
model.fit(X_train, y_train)

# 예측
predictions = model.predict(X_test)

# 성능 평가
mse = mean_squared_error(y_test, predictions)
r2 = r2_score(y_test, predictions)

print(f"평균 제곱 오차: {mse:.2f}")
print(f"R-squared 점수: {r2:.2f}")

 

scikit-learn은 기계 학습 작업을 위한 강력하고 다양한 도구를 제공합니다. 이 라이브러리를 사용하면 데이터 전처리부터 모델 학습, 평가, 그리고 하이퍼파라미터 튜닝까지 기계 학습의 전체 워크플로우를 효과적으로 구현할 수 있습니다.

scikit-learn의 일관된 API 디자인은 다양한 알고리즘을 쉽게 시도하고 비교할 수 있게 해줍니다. 또한, 파이썬의 다른 데이터 과학 라이브러리들(예: NumPy, Pandas, Matplotlib)과 잘 통합되어 있어 전체적인 데이터 분석 및 기계 학습 프로세스를 원활하게 수행할 수 있습니다.

그러나 scikit-learn을 효과적으로 사용하기 위해서는 기계 학습의 기본 개념과 각 알고리즘의 특성을 이해하는 것이 중요합니다. 또한, 데이터의 특성과 문제의 성격에 따라 적절한 알고리즘과 하이퍼파라미터를 선택하는 것이 성공적인 모델링의 핵심입니다.

scikit-learn은 계속해서 발전하고 있으며, 최신 버전에서는 새로운 알고리즘과 기능이 추가되고 있습니다. 따라서 공식 문서를 주기적으로 확인하고, 커뮤니티의 best practices를 따르는 것이 좋습니다.

마지막으로, 실제 문제에 scikit-learn을 적용해보면서 경험을 쌓는 것이 가장 효과적인 학습 방법입니다. 다양한 데이터셋과 문제에 대해 여러 알고리즘을 시도해보고, 결과를 비교 분석하면서 기계 학습에 대한 이해를 깊이 있게 발전시킬 수 있을 것입니다.

 

추가 학습 자료

© 2024 지식에 대한 탐구. All rights reserved.