본문 바로가기
PYTHON/빅데이터분석기사

ML_02 (Introduction s3-05~09 붓꽃 품종 예측 / sklearn lib)

by 쿠룽지 2023. 11. 13.
728x90
반응형
728x90

 

<기본 ML 단어>

 

지도학습(Supervised)

  • 종류: Regression, Classification
  • 회귀(Regression) : 숫자화된 데이터로 예측
  • 분류(Classification) : 어떤 데이터에 대한 category 예측 (주어진 것 외에 다른 값 X)

 

데이터 세트 (Data Set)

  • Data Set: 입력(X), 출력(Y)에 사용되는 데이터 묶음
    • 1개 이상의 입력(X)과 1개의 출력(Y)으로 구성
    • X: 2차원 구조/ 1개 sample은 1차원 구조
    • Y: 1차원 구조/ 1개 sample에 대한 target은 1개 scaler 값

 

홀드 아웃(Hold Out)

  • 성능 검증을 위해 Data Set을 trainSet, testSet으로 분리하여 사용
    • train set = 학습 / test set = 성능 검증
  • 일반적으로 7:3 ~ 8:2로 많이 구분

 

교차검증(Cross Validation)

  • 주어진 데이터를 가지고 반복적으로 성과 측정, 그 결과를 평균한 것으로 모형 평가
  • 데이터가 충분하지 않을 경우 hold-out으로 나누면 많은 양의 분산 발생 -> 교차검증 사용
  • 클래스 불균형 데이터에는 적합 x (ex- 남9 여1 데이터)

 

 

 

Overfitting

  • Training data에만 너무 잘 맞아 그 이외의 데이터들에 대해서는 신뢰가 떨어지는 경우
  • 해결방법
    • Cross validation
    • regularization (L1, L2)
    • remove features
    • ensembling
  • <> under fitting: 학습이 제대로 이루어지지 않은 상태

 

 

 

 

파라미터(Parameter)와 하이퍼 파라미터(HyperParameter)

  • parameter: 모델의 구성요소, 데이터로부터 학습되는 것
    • Linear Regression y=Wx+b -> 직선 방정식의 기울기, 절편 등
  • hyperparameter: 모델 학습 과정에 반영되며, 학습 시작 전 사용자가 미리 값을 결정하는 것
    • kNN -> k 개수, Ridge, Lasso -> a값, Learning Rate 등

 


 

 

1. lib import + data 가져오기

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neightbors import KNeighborsClassifier

df = pd.read_csv('./bigdata/iris_data.csv')
df.head(5)

 

 

 

 

2. 데이터 전처리 (sklearn.preprocessing.StandardScaler)

  • fit(X_train) : 전처리에 필요한 값(mean, std) 준비, return scaler
  • transform(X_train) : 전처리 실행, return 변환된 값
  • fit_transform(X_train) : fit + transform, return 변환된 값

 

 

2-1)

X_train/ test를 합쳐서 전처리 예시

작업 후 분리해서 train-학습 모델 생성/ test-제출용 값 구하는데 사용

scaler.fit_transform(X_train + X_test)

 

X_train/ test를 분리해서 각각 전처리 예시

X_train에 적용된 전처리가 그대로 X_test에 적용되어야 함

scaler.fit(X_train) #전처리에 필요한 값 준비
scaler.transform(X_train) #X_train 전처리 실행
scaler.transform(X_test) #X_test 전처리 실행

 

 

 

#X, Y 데이터로 분리
X = df.iloc[:, :-1]
Y = df['target']

#StandardScaler 사용, 정규분포 만들기 (fit_transform)
scaledX = StandardScaler().fit_transform(X)
print(scaledX.mean(), scaledX.std())

#(fit, transform 각각 사용)
scaler = StandardScaler().fit(X)
scaledX = scaler.transform(X)
print(scaledX.mean(), scaledX.std())

 

 

 

 

3. 데이터 분할 (sklearn.model_selection.train_test_split)

  • x_train,x_test,y_train,y_test=train_test_split(X,Y, test_size, train_size, random_state, shuffle, stratify)
  • 배열들을 지정된 비율로 나눠 반환
    • test_size =  테스트 데이터셋 비율
    • train_size = 훈련 데이터셋 비율
    • shuffle(기본값:True) = 섞을지 말지 결정
    • stratify = Y의 지정한 데이터 비율 유지(층화추출), Y가 범주형일 때 사용
from sklearn.model_selection import train_test_split

#ScaledX, Y를 사용, train, test 세트 8:2로 나누기 (random_state=0, 층화추출, 데이터 섞기 사용)
x_train, x_test, y_train, y_test = train_test_split(scaledX, Y,
													test_size=0.2,
                                                    random_state=0,
                                                    stratify=Y) #회귀에서는 사용 X
                                                    #shuffle은 기본값이 true라 생략함

 

 

 

4. 머신러닝 모델(Estimator) Interface (sklearn.base.BaseEstimator)

모델의 기반 클래스 모든 ML 모델은 반드시 상속 구현

fit(X_train, y_train): 모델 학습, 훈련

score(X_test, y_test): 성능 측정 (1에 가까울 수록 좋음)

predict(X_test): 예측 값 반환

 

 

4-1) 모델 생성 및 학습

#k가 3인 knn 분류기 생성
knn = KNeighborsClassifier(n_neighbors=3)

#knn에 trainset 전달 > 모델 생성(학습)
knn.fit(x_train, y_train)

# 위 두 문항을 합친 문장
knn = KNeighborsClassifier(n_neighbors=3).fit(x_train, y_train)

 

 

 

4-2) 평가하기

#train set/ test set 각각 사용
print('train 성능 :', knn.score(x_train, y_train))
print('test  성능 :', knn.score(x_test, y_test))

 

만약 성능이 낮을 경우

1) hyperparameter 조절

2) estimator(model) 변경

3) 데이터의 전처리 

등을 통해 성능을 향상시켜야함

 

 

4-3) 예측치 얻기

#knn모델에 Test set 적용 -> 예측값 얻기
pred = knn.predict(x_test)

#예측 확률 값 얻기
pred_proba = knn.predict_proba(x_test)

#값이 1.  0.66666   0.33333 이런식으로 나오는데 [0]예측값 [1]1번의 확률 [2]2번의 확률 이라고 생각하면 될듯

 

 

 

 

 

5. GridSearchCV (sklearn.model_selection.GridSearchCV)

  • 성능을 향상시키기 위해 hyperparameter를 바꿔가면서 체크해봐야 하는데 이걸 자동으로 해주는 것
    • = 최고의 hyperparameter를 찾기 위해 사용함
  • GridSearchCV(estimator, param_grid, scoring, n_jobs, refit, cv, verbose, ...)
    • estimator = 학습 모델
    • param_grid = 실행해볼 hyperparameter 목록 or dict 객체
    • cv = CrossValication에 사용할 나누는 개수 (기본값: 5) // 교차검증을 위해 분할되는 학습 데이터의 세트 수
    • verbose = 0(default): 메시지 출력 안함 /  1: 간단한 메시지  /  2: 하이퍼 파라미터별 메시지 출력
    • n_jobs = -1로 지정 시 모든 코어를 다 사용해서 실행 속도가 빨라짐

 

 

5-1) import

from sklearn.model_selection import GridSearchCV

 

 

 

5-2) 

#1. 데이터 섞기
df2 = df.sample(frac=1, random_state=0)

#2. X,Y 분리하기
X = df2.iloc[:, :-1]
Y = df2['target']

#3. X에 대해 Scale
scaledX = StandardScaler().fit_transform(X)

#4. params 지정 (시도해볼 hyperparameter 종류 나열)
params = {'n_neighbors' : range(3,10)} #n_neighbors- 3~9범위

#5. KNeighborsClassifier 학습 모델 객체 생성
model = KNeighborsClassifier()

#6. GridSearchCV 객체 생성
gs = GridSearchCV(model, params, cv=5)

#7. gs 학습
gs.fit(scaledX, Y)

 

 

 

5-3) GridSearch의 주요 attr

#cv_results_ 파라미터 조합별 결과
#best_estimator_ 가장 좋은 성능을 낸 모델 반환
#best_params_ 가장 좋은 성능을 낸 parameter 조합


#결과를 DataFrame으로 확인하기
result = pd.DataFrame(gs.cv_results_)
print(result) #cv_results_를 테이블 형식으로 보려면 DataFrame으로 변환시켜줘야 한다

#최고 점수가 나오는 모델 가져오기, 성능평가
model = gs.best_estimator_
print(model.score(x_test, y_test), gs.score(x_test, y_test), gs.best_params)

#각 calss별 예측 확률 구하기
model.predict_prova(x_test)[:,2]
model.predict(x_test) #예측값

 

 

 

 

 

 

 

내가 참고하려고 추가한 블로그

붓꽃 품종 예측 , 사이킷런 , Model Selection , 데이터 전처리 (tistory.com)

728x90
반응형