새소식

Study/Today_I_Learned

[Datacamp] Supervised learning with scikit-learn

  • -
728x90

Supervised learning의 종류

  1. classification : target variable이 카테고리
  2. Regression : target variable이 연속적인 값
  • 용어 정리

Feature = predictor variable = independent variable = 독립 변수
Target variable = dependent variable = response variable = 종속 변수

  • 지도 학습에 들어 가기 전에 체크해야 할 것
  1. 데이터에 결측치가 없을 것 
  2. 데이터가 숫자로 이루어져 있을 것 (컴퓨터는 멍청해서 글자를 못 읽습니다.)
  3. 데이터는 pandas dataframe 혹은 numpy array 형태로 저장되어 있을 것
  4. EDA를 수행했는지 체크할 것

Classification 분류

 분류 모델의 종류에는 linear classifier, logistic regression, decision tree, random forest 등이 있습니다. 이번 수업에서는 k-Nearest Neighbors을 실습했습니다. (*주의 : K-means와 다릅니다. 일단 K-means는 비지도 학습) 공식 문서를 보면 nearest neighbors모델은 지도 학습, 비지도 학습으로써의 분류 뿐만 아니라 회귀도 가능한 모양이지만 일단 스킵합니다.

출처: t.ly/lSLk

 공식 문서의 예제로, iris dataset으로 만든 모델의 시각화 그래프를 볼 수 있습니다. 이 그래프에 분류하고 싶지만 답을 모르는 새로운 점을 하나 찍게 되면, 가장 가까운 k개의 점에 따라 어떤 카테고리에 속하는지 분류하여 예측합니다. 이때 '가깝다'라는 정의는 어떤 거리 계산법을 쓰는지에 따라 달라질 수도 있습니다.

 분류를 위한 모델 구성의 문법은 아래를 참고하세요.

#model build and data prep
from sklearn.neighbors import KNeighborsClassifier
X = train_df[['col1', 'col2']].values #numpy array
y = train_df['label'].values #numpy array

#fitting the model
knn = KNeighborsClassifier(n_neightbors=15)
knn.fit(X, y)

#predict unseen data
X_test = test_df 
predictions = knn.predict(X_test)

Measuring the performance 성능 측정

 분류 모델의 성능을 평가하기 위해 가장 흔하게 쓰이는 수식은 accuracy ($ \frac{correct\,prediction} {total\,observation} $)입니다. 직접 계산하지 말고 아래와 코드를 치면 프린트할 수 있습니다. 이때, 정답을 모르는 데이터로 점수를 매길 수는 없으므로 원래 사용하려고 했던 데이터셋을 학습용 데이터 / 검증용 (편의상 test data, 저는 평소에 validation data로 부릅니다.)으로 나눕니다. 모델을 학습시킬 때는 학습용 데이터만, 점수를 확인할 때는 검증용 데이터만 사용해야 unseen data에 우리의 모델이 얼마나 잘 예측할 수 있는지 확인할 수 있습니다.

#dataset을 train/test set으로 나누기 
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, # 트테트테로 외움
					test_size=0.2, 
					random_state=42, # 실험이 재현 가능하도록 랜덤시드를 고정
					stratify=y) # label의 비율이 train/test set에서 비슷하도록 함
knn = KNeighborsClassifier(n_neighbors=6)
knn.fit(X_train, y_train)
print(knn.score(X_test, y_test)

Model complexity

 K nearest neighbors 모델에서, K 는 하이퍼파라미터로 볼 수 있습니다. 모델을 만드는 사람이 k를 너무 큰 값으로 설정해 버리면 underfitting, 너무 작은 값으로 설정해 버리면 overfitting 현상이 생길 수 있습니다. 

Regression 회귀

회귀 모델의 예시로는 linear regression, lasso, ridge, XGBoost, LGBM 등을들 수 있습니다. 주의할 점은, feature는 sklearn에서 2d array여야 하기 때문에 한 개의 feature만 쓸 때도 reshape을 통해 (n,1)의 형태가 될 수 있도록 만들어주어야 한다는 점입니다. 

Simple linear regression은 한 개의 feature를 사용해 y를 예측하는 회귀 모델, Multiple linear regression 은 두 개 이상의 feature로 y를 예측하는 모델입니다.  대표적인 Evaluation metric으로는 MSE, RMSE 등이 있습니다. 

# RMSE in sklearn
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, y_pred, squared=False) # squared False = sqrt of MSE

K-fold Cross validation 교차 검증

 앞에서 sklearn의 train_test_split 함수를 이용해 학습시키는 데이터와 검증용 데이터를 분리했었죠. 하지만 데이터의 불균형이 너무 심하거나 우연의 일치로 인해 검증용 데이터셋에 학습 데이터와는 전혀 다른 특징을 가지게 된다면 성능이 좋게 나올 리가 없습니다. 

출처: datacamp

 이런 단점을 보완하기 위해 학습 대 검증 데이터를 8:2로 나눌 때, 그림과 같이 각 fold들을 돌아가면서 검증용 데이터로 사용해보는 것을 K-fold cross validation이라고 합니다. 각 fold 중에서 가장 성능이 좋은 모델을 활용할 수도 있고, 각 fold들을 앙상블해 최종 모델로 활용해 볼 수도 있습니다. 하지만 단점은, fold를 나눈 만큼 학습과 검증을 해보아야 하기 때문에 fold 가 늘어날 수록 리소스가 많이 소모된다는 점입니다. 

#cross validation
from sklearn.model_selection import cross_val_score,KFold
kf = KFold(n_split=6, 
	shuffle=True, #shuffle the dataset before splitting into folds
    	random_state=42)
reg = LinearRegression() # model
cv_results = cross_val_score(reg, X, y, cv=kf)

 머신러닝 기초에 대해서 오랜만에 다시 정리할 수 있었던 챕터였습니다. 내용에 조금 익숙해지고나서 공식 문서를 다시 보니까 훨씬 더 잘 읽혀서 보람 있네요! 

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.