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) #예측값
내가 참고하려고 추가한 블로그
728x90
반응형
'PYTHON > 빅데이터분석기사' 카테고리의 다른 글
ML_03 (classification s3-16~21 작업형 2 예시/고객 성별 예측) (0) | 2023.11.14 |
---|---|
ML_03 (classification s3-10~15 분류 모델) (1) | 2023.11.13 |
ML_01-1 (basic s3-03 자녀의 키 예측하기) (0) | 2023.11.10 |
ML_01 (basic s3-01~02) (0) | 2023.11.05 |
Pandas-03 (fine_dust s2-17~23) / 미세먼지 분석 다시(파일 오류로 끊음 영상 s2-23) (0) | 2023.11.05 |