본문 바로가기
기본적인프로그래밍/python

[scikit-learn, python] machine learning 에 주로 사용되는 python module

by 인포메틱스 2024. 4. 4.
반응형

 

 이번 포스팅은 machine learning을 하려면 필수적으로 알아야할 library인 scikit-learn에 대해서 이야기하고자 합니다.

 

1. scikit-learn은 (소개)

 

 머신러닝은 데이터에서 지식을 추출하고, 패턴을 학습하며, 예측을 수행할 수 있는 강력한 기술로, 현대의 많은 기술 혁신과 응용 프로그램에서 중심적인 역활을 합니다. 요즘은 딥러닝이 핫한거 아닌가? 라고 하실 하실 수 있겠지만, 딥러닝은 머신러닝에 속해 있습니다. 그리고 여전히 딥러닝 이외의 machine learning들이 최근 연구에서도 다양하게 사용되는 것을 연구하다보면 알수가 있습니다.  예를들어 netfilx에서 개인에게 작품을 추천할때에도 machine learning을 이용한다고 들었습니다.

 

scikit-learn은 python을 통한 machine learning에서 없어서는 안될 library.

 

 

 

scikit-learn은 머신러닝과 데이터 분석을 위한 Python 기반의 무료 오픈 소스 라이브러리입니다. 간결하고 기능에 대한 문서화도 잘되어있습니다. 그리고 광범위한 알고리즘과 도구들로 인하여 초보자부터 전문가까지 모두 손쉽게 machine learning 프로젝트를 실행할 수가 있습니다.

 

scikit-learn에서는 분류, 회귀, 클러스터링 등 다양한 머신러닝 작업을 지원합니다. 이 라이브러리는 전처리 모델의 학습과 예측 그리고 모델의 성능 평가까지 머신러닝 파이프라인의 모든 단계를 아우르는 강력한 기능들을 제공합니다.

 해당 library를 이용하여 주가분석, 이미지 분륳, 소셜미디어 트렌드 분석등 다양한 분야에서 활용이 가능합니다.

 

2. 핵심 기능과 사용법

 핵심기능과 사용법으로는 소개에서 설명햇듯이 주요한 4가지 영역인 분류, 회귀, 클러스터링, 차원 축소에 대한 강력한 기능들을 제공합니다.

 예시를 들기에 앞서 scikit-learn에 4가지 주요 기능들에 대해서 간단하게 설명하고 넘어가고자 합니다.

 

2-1. 분류 (Classification)

 미리 정의된 여러 클래스 레이블 중 하나를 예측하는 과제입니다. 정말 흔한 예로 이메일의 스팸인지 아닌지 구별하는 분류문제를 이야기할 수 있습니다. 이러한 문제는 SVM, 나이브 베이즈, 결정트리 등의 다양한 분류 알고리즘을 이용할 수 있습니다.

 

2-2. 회귀 (Regression)

 연속적인 값을 예측하는 작업으로 주택 가격이나, 주식 가격같은 수치를 예측하는데 사용됩니다. 이는 가장 기본적인 선형회귀부터  릿지 회귀, 라쏘 회귀 등 여러 회귀 알고리즘을 사용할 수가 있습니다.

 

2-3. 클러스터링 (Clustering)

 비슷한 특성을 가진 데이터 포인트들을 그룹화하는 비지도 학습 기법입니다. 시장 세분화, 사회적 네트워킹 분석 등에 활용될 수가 있으며, K-means, 계층적 클러스터링 DBSCAN 등의 알고지름을 제공합니다.

 

2-4. 차원 축소 (Dimensionality Reduction) 

 데이터의 특성 수를 줄이면서 정보 손실을 최소화하는 과정입니다. 고차원 데이터를 시각화하거나, 노이즈를 줄이거나, 효율적인 저장 및 계산을 위해 사용됩니다.

 

이렇게 scikit-learn에서 할 수 있는 주요 4가지 machine learning방법에 대해 설명을 해보았고, 위에 설명한 4가지 말고도 다양한 전처리 기능들도 포함되어 있습니다. 데이터 크기를 줄이는 scaling, 결측치 처리, 범주형 데이터 인코딩들이 포함됩니다. 모델의 성능을 평가하고 선택하기 위한 교차 검증, 그리드 서치 등의 기능들도 제공됩니다.

 

3.실제 예제를 통한 설명

 간단한 예시를 들어보도록 하겠습니다.

 

3-1. 분류 (Classification)

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

# 데이터 로드
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)

# 분류 모델 학습
classifier = RandomForestClassifier(n_estimators=100)
classifier.fit(X_train, y_train)

# 예측 및 정확도 평가
predictions = classifier.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, predictions)}")

 

3-2. 회귀 (Regression)

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 데이터 로드
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)

# 회귀 모델 학습
regressor = LinearRegression()
regressor.fit(X_train, y_train)

# 예측 및 MSE 평가
predictions = regressor.predict(X_test)
print(f"Mean Squared Error: {mean_squared_error(y_test, predictions)}")

 

3-3. 클러스터링 (Clustering)

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 데이터 생성
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 클러스터링 모델 학습
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

# 클러스터링 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5)
plt.show()

 

 

3-4. 차원 축소 (Dimensionality Reduction)

from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 데이터 로드
iris = load_iris()
X, y = iris.data, iris.target

# PCA를 사용한 차원 축소
pca = PCA(n_components=2)
X_reduced = pca

 

scikit-learn에서 할 수 있는 주요 기능들에서 train_test_split 와 같은 전처리 기법들도 포함되어 있는것을 확인할 수 있습니다.

 

 그리고  그림을 그릴때 matplotlib을 이용하여 그렸는데, scikit-learn에서도 visualization 기능들도 지원을 합니다.

 

예를 들어 classification을 할때, 범위를 표현을 해줄수도 있습니다.

from sklearn.inspection import DecisionBoundaryDisplay
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt

iris = load_iris(as_frame=True)
X = iris.data[['petal length (cm)', 'petal width (cm)']]
y = iris.target


svc_clf = make_pipeline(StandardScaler(), 
                        SVC(kernel='linear', C=1))
svc_clf.fit(X, y)

# classification 영역을 색으로 칠해줌.
display = DecisionBoundaryDisplay.from_estimator(svc_clf, X, 
                                                 grid_resolution=1000,
                                                 xlabel="Petal length (cm)",
                                                 ylabel="Petal width (cm)")
plt.scatter(X.iloc[:, 0], X.iloc[:, 1], c=y, edgecolors='w')
plt.title("Decision Boundary")
plt.show()

 

 

또한 모델들의 성능을 비교해줄 수 있도록 표현해줄 수도 있습니다.

from sklearn.calibration import CalibrationDisplay
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.ensemble import RandomForestClassifier

X, y = make_classification(n_samples=1000,
                           n_classes=2, n_features=5,
                           random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                            test_size=0.3, random_state=42)
proba_clf = make_pipeline(StandardScaler(), 
                          SVC(kernel="rbf", gamma="auto", 
                              C=10, probability=True))
proba_clf.fit(X_train, y_train)

CalibrationDisplay.from_estimator(proba_clf, 
                                            X_test, y_test)

proba_clf1 = make_pipeline(StandardScaler(), 
                        SVC(kernel='linear', C=1,probability=True))
proba_clf1.fit(X_train, y_train)

ax = plt.gca()
CalibrationDisplay.from_estimator(proba_clf1,
                                  X_test, y_test,
                                  ax=ax,name='linear')

rndf_cls = RandomForestClassifier(max_depth=5, random_state=42)
rndf_cls.fit(X_train, y_train)

ax = plt.gca()
CalibrationDisplay.from_estimator(rndf_cls,
                                  X_test, y_test,
                                  ax=ax)
plt.show()

 

4. 최적사용방법 과 팁

 scikit-learn을 이용한 machine learning을 할때 최적 사용 방법과 팁을 이야기해보자면,

4-1. 데이터 전처리의 중요성을 이해하기

 데이터의 표준화와 정규화는 대부분의 머신러닝 알고리즘에서 데이터의 스케일이 비슷할때, 잘 작동을 합니다. 그렇기 때문에 StandardScaler, MinMaxScaler 와 같은 기능들을 잘 사용해야합니다. 그리고 누락값들 또한 SimpleImputer 기능을 통해 평균값, 중앙값 등으로 채울수 있습니다. 그리고 모델에 따라 누락된 값을 다르게 처리해야할 수도 있다는 것을 생각해야합니다.

 

4-2. 모델 선택과 하이퍼파라미터 튜닝

 데이터에 적절한 모델을 선택하는 것도 중요합니다. 소규모의 데이터에서는 복잡한 모델보다 간단한 모델이 더 적합할수가 있습니다. 복잡의 기준은? 변수 종류의 개수라고 생각하시면 됩니다. 예를 들어 사람의 연봉을 예측하려고 할때, 키,외모, 학력, 부모님 재력, 친구의 수, 집에 화장실 개수 등등 다양한 데이터를 가졌을 경우 쓸모없는 변수 예를들어 집 화장실 개수 같은 경우는 필요없다고 판단할 수가 있습니다. 이런 변수들을 제거하는 것도 중요하다고 생각합니다.

 

4-3 모델 복잡도와 데이터의 양의 균형

 가능하다면 다양하고 많은 데이터를 이용해야 합니다. 소규모의 데이터로는 모델이 overfitting 될 가능성이 높습니다. 그리고 모델의 복잡도도 마찬가지로, 너무 복잡하면 overfitting이 될 가능성이 높습니다. 교차 검증 (cross validation)을 통해서 복잡도를 적절하게 조절하는 것도 중요합니다(복잡도 조절? -> random foreast에서 가지의 개수를 조절하는 등으로 복잡도를 조절할 수 있음)

 

4-4. 파이프라인 사용

가장 중요하다고 생각합니다. 데이터 전처리와 모델 학습 과정을 하나의 워크플로우로 연결하면 코드를 더 깔끔하게 유지하고, 실수를 줄일 수 있습니다. 

 

4-5. 결과 해석과 검증

 모델의 결과를 어떻게 잘 해석하는가도 중요합니다. 각 다양한 모델에서 feature_importances_나  SHAP 값 같은 기범을 사용하여 모델의 결정을 해석할수 있습니다. 그리고 문제에 적합한 성능 지표를 선택해야합니다. 불균형 데이터셋의 경우 Accuracy보다는 F1 score, ROC AUC 가 더 유용할 수 있습니다.

 

 

 

5. 결론

 scikit-learn은 오랜 시간이 지났는데에도 여전히 많이 사용되는 library중 하나입니다. Deep learning의 보조적인 역활로써 Machine learning이 사용되고는 합니다. 데이터 사이언스가 되기 위해서는 필수로 알아야할 library라고 이야기하고 싶습니다.

 

 다음 포스팅에서는 더 자세한 내용과 예시를 다뤄 보도록 하겠습니다.

 

감사합니다.

 

 

728x90
반응형

댓글