-
#12 : KT_AIVLE_SCHOOL : DX_4th : 6주차 : 머신러닝-지도학습KT_AIVLE_SCHOOL_DX_4th 2023. 9. 19. 00:47
지난시간에는
#10 미니프로젝트3차 ( https://datawithu.tistory.com/21 )
#11 쉬어가기편 ( https://datawithu.tistory.com/22 )
에 대해서 다루었다.
이번시간에는 약 5일 동안 머신러닝(Machine-Learning)중 지도학습에 대해여 배운다.
이번 강의는 이강래 강사님께서 진행해주셨다.
- 1. 머신러닝
- 2.성능평가
- 3.알고리즘
- 4.K-Fold Cross validation
- 5.Hyperparameter 튜닝
- 6.앙상블
이번 5일 동안은 머신러닝 중에서도 지도학습에 관하여 배우게 되었다.
# Intro ) 교육 후 짧은 생각 정리
머신러닝이라는 말을 들었때, 드디어 !!! 라는 생각이 들었다.
사실 데이터 자격증도 그렇게 많이(?) 따고서는 (정확히는 날림으로 따고서는 )
한번도 제대로 공부를 해보아야 겠다.
또는 적어도 이 정도는 알아야 데이터분석을 할 수 있는 거 아냐
결심만 수백번했는데, 에이블스쿨이라는 강제성이 더해지니, 역시 :) 하게 되었서
정신+몸은 힘들었지만, MY Brain 내 뇌는 약간 좋아?한것 같다.
그래도 지도학습의 경우, 이미 빅데이터분석 기사를 올해 7월에 취득했어서
비교적 프로세스는 어렵지 않았다.
물론 강사님이 친절하게 설명해주시는 부분과 내가 가진 오류들을 검토하고,
또 겸손이라는 말을 가슴에 새기면서 듣고자 했다.
특히, 성능평가 부분에서 RMSE, Confusion_matrix는 항상 항상 어렵고 안 외워졌는데,
이번에는 마참내 드디어 외울수 있게 된것 같아 매우 기쁘다.
1. 머신러닝
- 머신러닝에는 지도학습, 비지도학습. 강화학습으로 나눌수 있다.
- 지도학습 : 정답이 정해져있음 (분류/회귀)
- 비지도학습: 정답이 없음(군집화/변화/연관분석)
- 강화학습 : 결과가 학습에 영향을
1) 분류 VS 회귀
- 회귀: 연속적인 값 예측
- LinearRegression
KNeighborsRegressor
DecisionTreeRegressor
RandomForestRegressor
XGBRegressor
- LinearRegression
- 분류: 범주값 예측
- DecisionTreeClassifier
KNeighborsClassifier
LogisticRegression
RandomForestClassifier
XGBClassifier
- DecisionTreeClassifier
2) 모델링과 데이터
- 평균 또한 가장 단순한 모델이며, 관측값(실젯값)과 모델 예측값의 차이를 이탈도= 오차 라고 한다.
- 데이터는 보통 : 학습용(70~80%) + 검증용(30~20%) & 별도의 평가용 데이터로 구성된다.
3) 학습 데이터 성능에 대한 결과
- 과대적합 : 학습 데이터의 성능이 좋지만, 평가데이터의 성능이 나쁨 ; 예측성능이 안좋음
- 과소적합 : 모델이 단순하여 학습데이터에 대한 훈련이 안되어있음. 평가 데이터의 성능이 학습데이터보다 좋거나 전체적으로 나쁨
4) 기본 모델링 코드
#0. 데이터분리 모듈 불러오기 from sklearn.model_selection import train_test_split #1. 학습용, 평가용 데이터 분리 x_train , x_test , y_train , y_test = train_test_split (x, y, test_size 0.3 ) #1. 또는 학습용 성능용 데이터 분리 x_train , x_val , y_train , y_val = train_test_split (x, y, test_size 0.3 ) # 2.사용할 모델 불러오기 from sklearn.모듈 import 회귀/분류 등 #3.사용할 평가지표 불러오기 from sklearn.metrics import mean_absolute_error , r2_score #회귀 from sklearn.metrics import confusion_matrix, classification_report #분류 #4. 모델 선언 & train model = 모델( 튜닝가능 ) model.fit(x_train, y_train) # 모델 학습시키기 #5. 예측 y_pred = model.predict(x_test) #6. 성능 평가 : (실젯값, 예측값) <= 이 순서대로 데이터 넣기!!! mean_absolute_error( y_test , y_pred) #회귀 accuracy_score( y_test , y_pred)#분류 precision_score(y_test , y_pred ,average=None)# 분류
2.성능평가
1 ) 회귀 모델 : 예측값과 실제값의 오차로 모델의 성능을 평가
1-1) 오차 : 작을 수록 좋음
- SSE :오차의 제곱의 합 :Sum Squared Error
- MSE : SSE의 평균 : 오차제곱 합의 평균 : Mean SSE
- RMSE: 오차제곱 합 평균의 제곱근 : Root MSE
- MAE : 오차의 절대값의 합 : Mean Absolute Error
- MAPE : 오차 절대값 합의 비율 : Mean Absolute Percentage Error => 오차의 비율을 보고 싶은 경우에
1-2) 결정계수 : 클수록 좋음
- 결정계수 𝑅 2 (R Squared)
- 전체 오차 중, 회귀식이 잡아낸 오차 비율
- 0 ~ 1 사이 : R2 score가 1이면, 오차=0이라는 말
- 오차의 비 또는 설명력이라고 함
2 ) 분류 모델 : 정확하게 예측하여 분류한 비율로 모델의 성능 평가
2-1) 혼동행렬 : Confusion Matrix
- 정확도 :Accuracy : 0을 0으로 + 1을 1로 예측 / 전체(TN + FP + FN +TP)
- 정분류율 : 양성을 양성으로 음성을 음성으로 정확하게 예측함
- 정밀도 : Precision : 1을 1로 예측 / (0을 1로 예측 + 1을 1로 예측)
- 예측의 관점으로 : 양성으로 예측한 것들 중에 실제 양성인 것
- 재현률: 민감도 : Recall : 1을 1로 맞춤/ (예측0이 실제1 + 예측1이 실제1)
- 실제 관점으로 : 실제 양성 중에서 양성으로 예측한 값 : 예시) 실제 암환자에게 암으로 진단할 수 있는지?
2-2) F1-score : 정밀도와 재현율의 조화평균
- F1-score = ( 2 * 정밀도*민감도 ) / ( 정밀도 + 민감도 )
3.알고리즘
3-1) Linear Regression : 선형 회귀
- 최선의 회귀모델: 전체 데이터의 오차 합이 최소가 되는 모델
# 회귀계수 = 가중치 확인 : model.coef_ # 편향(y절편) = model.intercept_
1.단순 회귀 : 독립변수 1개
2. 다중 회귀 : 독립변수 2개 이상
- 회귀 계수가 여러개가 나오므로 독립변수들의 이름을 같이 확인하는 것이 좋다 예) list(x)
3-2) KNearest Neighbor : KNN : 회귀/분류
- k개의 최근접 이웃의 값을 찾아 그 값들로 새로운 값을 예측함
- default k값은 5, 가장 적절한 K 찾기기 관건
- 스케일링 필요
- 정규화 스케일링: 각 변수의 값을 0~1사이로 만듬
- (X-Xmin) / (Xmax -Xmain)
- 표준화 스케일링 : N(0,1)로 표준정규분포를 따르게 만듬 : 각 변수 평균 0, 표준편차 1 :
- (X-Xmean) / Xstd
- 정규화 스케일링: 각 변수의 값을 0~1사이로 만듬
# min-max 정규화 사용 from sklearn.preprocessing import MinMaxScaler # 정규화 scaler = MinMaxScaler() # 학습용 데이터로 스케일링 할것 !! scaler.fit(x_train) x_train_s = scaler.transform( x_train) x_test_s = scaler.transform( x_test)
# 회귀 from sklearn.neighbors import KNeighborsRegressor from sklearn.metrics import mean_absolute_error , r2_score # 분류 from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import confusion_matrix , classification_report
3-3) Decision Tree : 의사결정나무/결정트리 : 회귀 /분류
- 확률에 근거해 예측을 하는 분류 모델
- 분석과정을 시각화 가능 => 화이트박스 모델
- 튜닝(max_depth)으로 가지치기 필요, 적절한 깊이 찾는 것이 관건
- Root Node(부모노드) ->---------> Terminal Node( =Leaf Node)
- 분류 : 마지막 자식노드에 있는 Samples의 최빈값을 예측으로 반환
- 불순도로 평가 : 순도가 높을 수록 분류가 잘된것
- 지니 불순도 : 0~0.5 사이값으로 지니 불순도가 낮을수록 순도가 높음(0) vs 섞이면 0.5
- 엔트로피 : 0~1 사이 값으로 , 값이 낮을수록 완벽하게 분류됨(0) vs 섞이면 1
- 정보 이득 : 정보이득이 크다 = 불순도가 줄어든다.
- 불순도로 평가 : 순도가 높을 수록 분류가 잘된것
- 트리 시각화
# graphivz 는 따로 사이트에서 다운로드를 받아서 컴터에 설치해야한다. from sklearn.tree import export_graphviz # 이미지 파일 만들기 export_graphviz( model, filled=True, feature_names=x.columns, class_names = y.unique(), rounded=True, precision=5, out_file='tree.dot') # 저장화질 !dot tree.dot Tpng otree.png Gdpi 300 # 이미지 불러오기 from IPython.display import Image Image(filename='tree. png', width=400 )
- 변수 중요도 시각화
plt.barh( list (x), model.feature_importances) plt.ylabel('요인') plt.xlabel('중요도')
- 회귀: 마지막 자식노드에 있는 Samples의 평균을 예측으로 반환
- MAE로 평가
# 회귀 from sklearn.tree import sklearn.tree.DecisionTreeRegressor from sklearn.metrics import mean_absolute_error , r2_score # 분류 from sklearn.tree import sklearn.tree.DecisionTreeClassifier from sklearn.metrics import confusion_matrix , classification_report model = DecisionTreeClassifier max_depth 5
3-4) Logistic Regression : 분류
시그모이드 함수 : -inf ~~ +inf범위에서 0또는1로 분류함
from sklearn.linear_model import LogisticRegression from sklearn.metrics import confusion_matrix , classification_report
4.K-Fold Cross validation : 분할 교차 검증
- 정확도를 향상시킬 수 있음, 일반화된 모델을 만들 수 있음, 과소적합 방지.
- 기본 cv = 5가 디폴트 값
- from sklearn.model_selection import cross_val_score 을 사용
# 1 사용할 모델 불러오기 from sklearn.............. from sklearn.model_selection import cross_val_score # 2 모델 선택 model = 불러온모델(하이퍼파라미터) # 3 성능검증 cv_score = cross_val_score (model, x_train , y_train ,cv=10) # 확인 print( cv_score) print(cv_score.mean())
5.Hyperparameter => 튜닝
1) 하이퍼 파라미터란?
모델링시, 모델의 성능을 최적화하기 위해 인간이 조절할수 있는 매개변수 값.
- KNN에서는 n_neighbors=k의 수에 따라 성능이 달라짐
- k=가장클때, 가장 단순한 모델이 된다. 회귀 : 평균, 분류: 최빈값
- 거리계산 (유클리드 거리(점과 점 직선 거리), 맨하탄 거리( 평면으로만 움직이는 점과 점 거리))
- Decision Tree에서는
- max_depth : 트리 깊이를 제한, 값이 작을 수록 모델이 단순함
- min_samples_leaf : 잎이 되기 위한 최소한의 샘플 데이터수, 값이 클수록 모델이 단순함
- min_samples_split : 노드 분할을 위한 최소 샘플 데이터수 , 값이 클수록 모델 단순
2 ) 최적의 하이퍼 파라미터 찾는 방법
2-1) Grid Search : 모든 파라미터 범위를 고려
- 딕셔너리 형태로 파라미터 값의 범위를 지정 후,
- Grid Search 모델 선언 후에 학습데이터 학습을 하여
- 가장 좋은 성능을 보인 파라미터 값으로 자동으로 학습
- 예측 및 평가
2-2) Random Search : 모든 파라미터 범위를 고려
- 딕셔너리 형태로 파라미터 값의 범위를 지정 후,
- Random Search 모델 선언 후에 학습데이터 학습을 하여
- 가장 좋은 성능을 보인 파라미터 값으로 자동으로 학습
- 예측 및 평가
# 파라미터 정하기 params = { 'max_depth': range(1,11), 'min_samples_split' : range(10,51,10) } # 모델 from sklearn.tree import DecisionTreeClassifier model_dt = DecisionTreeClassifier() # Grid 또는 RandomSerach 사용 from sklearn.model_selection import GridSearchCV model = GridSearchCV(model_dt, params, cv=10) ## GridSearchCV 의 경우 n_iter옵션을 지정하지 않음 => 반복횟수 model = RandomizedSearchCV( model_dt, params,cv=3 ,n_iter=20) # 모델 학습 model.fit(x_train, y_train) # 결과확인하기 => 어디에서 하이퍼파라미터가 최적일지 찾기 model.cv_results_ #t수행정보 값들 model.best_params_ #최적파라미터 값들 model.best_score_ #최고 성능 값들 ## 결과를 시각화해서 보는 것도 좋음 pd.Dataframe 만들어서 시각화 해보기
6.앙상블
여러 모델을 쒺끼해서 더 강한 모델을 만드는 것
1.) voting 보팅
=> 여러 모델들중에서 투표로 최종 예측결과를 결정
2.) Bagging 배깅 : 복원추출 샘플
=> 여러 샘플 데이터를 부트스트랩하여 한가지 모델유형로 학습후, 모델 예측결과를 집계하여 결정
- 범주형데이터는 투표방식으로 결과 집계
- 연속형 데이터는 평균으로 결과 집계
- 대표 : RandomForest :
- 여러 Decision Tree모델을 만들어서 각각 데이터 샘플링을 가지고 개별 학습후, 결과집계 후 결정
- 주요 파라미터 : max_depth, n_estimators
- 여러 Decision Tree모델을 만들어서 각각 데이터 샘플링을 가지고 개별 학습후, 결과집계 후 결정
3.) Boosting 부스팅
=> 가중치를 부여하는 방식으로 이전 모델과 다음모델을 순차적으로 학습하여 진행,
=> Gradient Boosting : 이전의 모델의 학습 결과가 다음 모델읠 학습 결과에 영향을 주는 줘서 가중치를 계산
- 3-1) XGBoost : GBM(gradient boost machine)의 병렬 학습을 구현
- 장점
- 회귀/분류 가능,
- 자체적으로 tree모델에서 가지치기 함
- 결측치 알아서 처리
- Cross validation 알아서 함
- 주요 하이퍼 파라미터
- n_estimator : 디폴트 100
- max_depth : 디폴트 6
- early_stopping_rounds : 모델 학습시에 n_estimator 갯수를 정할 때 유용
- 장점
model.fit (x_train , y_train , eval_set= [(x_train , y_train ), (x_val , y_val )], early_stopping_rounds=10 )
- 3-2) LightGBM
4.) Stacking 스태킹
=> 여러 모델의 예측값을 , 최종 모델의 학습데이터로 사용하여 예측을 함
- -기본 모델을 3~4개 정도 선택하기 -> 예측값을을 최종모델의 학습데이터로 사용
### 정리
회귀 : LinearRegression, KNeighborsRegressor, DecisionTreeRegressor, RandomForestRegressor, XGBRegressor,LGBMRegressor
회귀-성능평가 : MAE, MSE, MAPE, r2_score
분류 : LogisticRegression. KNeighborsClassifier, DecisionTreeClassifier, RandomForestClassifier XGBClassifier,LGBMClassifier
분류-성능평가 : Accuarcy, Recall, Precision, confusion_matrix, f1_score, classification_report
성능튜닝 : cross_val_score, RandomizedSerachCV, GridSearchCV
다음편은 머신러닝- 비지도 학습을 배울 예정이다 가보자굿 ~~~
'KT_AIVLE_SCHOOL_DX_4th' 카테고리의 다른 글
#14 : KT_AIVLE_SCHOOL : DX_4th : 미니 프로젝트 3차 (1) 2023.10.04 #13 : KT_AIVLE_SCHOOL : DX_4th : 7주차 : 머신러닝-비지도학습 (0) 2023.09.24 #11: KT_AIVLE_SCHOOL : DX_4th : DX분반에서는.... (0) 2023.09.11 #10: KT_AIVLE_SCHOOL : DX_4th : 5주차 : 미니 프로젝트 2차 (1) 2023.09.11 #9: KT_AIVLE_SCHOOL : DX_4th : 5주차 : 데이터 수집 (2) 2023.09.04