。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/AI

머신러닝 1 -model, scaling

quarrrter 2023. 5. 15. 14:56

퍼셉트론의 과제 : XOR

(퍼셉트론으로 AND, OR 해결 가능. 하지만 ,, XOR은 못 함. 인공지능의 winter, ,,, ) 

 

AND : 0이 하나라도 있으면 0

OR: 1이 하나라도 있으면 1

XOR 

#1. 데이터 xor: 다르면 1 
x_data = [[0,0],[0,1],[1,0],[1,1]]
y_data = [0,1,1,0]

#2. 모델
model = Perceptron()

모델의 score :  0.5
# [[0, 0], [0, 1], [1, 0], [1, 1]] 의 예측결과 :  [0 0 0 0]
# acc :  0.5

MODEL

SVM 모델 (suport vecter machine)

  • 서포트 벡터 머신은 여백(margin)을 최대화하는 지도 학습 알고리즘 
  • 여백은 주어진 데이터가 오류를 발생키지 않고 움직일 수 있는 최대공간
  • 분류를 위한 서포트 벡터 머신: SVC
  • 회귀를 위한 서포트 벡터 머신: SVR 
  • 딥러닝의 MLP(Multi Layer Perceptron) 와 비슷한 값을 내지만 때에 따라 효율이 다름 
#1. 데이터 xor: 다르면 1 
x_data = [[0,0],[0,1],[1,0],[1,1]]
y_data = [0,1,1,0]

#2. 모델 
model = SVC()   

#3. 훈련
model.fit(x_data, y_data)

#4. 평가 예측- 생략

모델의 score :  1.0
[[0, 0], [0, 1], [1, 0], [1, 1]] 의 예측결과 :  [0 1 1 0]
acc :  1.0

분류 모델 cancer SVM 과 tf keras 성능 비교

# [실습] svm 모델과 나의 tf keras 모델 성능비교하기

#1. 데이터
datasets = load_breast_cancer()
train, test set 설정

#2. 모델
model = LinearSVC()

#3. 훈련 
model.fit(x_train,y_train)

#4. 평가 예측
SVC 결과 acc:   0.9064327485380117
Linear SVC 결과 acc:   0.9415204678362573
딥러닝: accuracy :  0.9064327485380117

 

 

Decision Tree

  • 분류와 회귀 문제에 널리 사용하는 모델
  • 예/아니오 질문을 이어 나가면서 학습
  • DecisionTreeRegressor와 DecisionTreeClassifier

decisiontree_iris

from sklearn.tree import DecisionTreeClassifier

#2. 모델
model = DecisionTreeClassifier()
*************
decision tree
scaler: minmax 결과 acc:   0.9555555555555556

decisiontree_iris

from sklearn.tree import DecisionTreeClassifier

#2. 모델
model = DecisionTreeClassifier()
*********************
decision tree
minmax: 0.935672514619883
MaxAbs: 0.9415204678362573
Robuster: 0.9298245614035088

decisiontree_cali

from sklearn.tree import DecisionTreeRegressor

#2. 모델
model = DecisionTreeRegressor()
****************************************************
#SVR 결과 acc:  -0.01663695941103427
#Linear SVC 결과 acc:   -0.055781872981941705
#딥러닝: accuracy 결과 acc:   -1.8172916629018916

#decision tree- regressor
#Minmax: 결과 r2 :  0.6252904174582093
#Standard 결과 : 0.610199889411199

 

Random Forest

여러 개의 결정 트리들을 임의적으로 학습하는 방식의 앙상블 방법

boost 나오기 전에 많이 사용됐었음 

Decision Tree보다 값이 좋음 

 

cancer 앙상블

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier


#2. 모델
model = RandomForestClassifier()

*********************************************
decision tree
minmax: 결과 acc:   0.935672514619883
MaxAbs: 0.9415204678362573
Robuster:    0.9298245614035088

앙상블
Robuster: 결과 acc:   0.9649122807017544

cali 앙상블

from sklearn.ensemble import RandomForestRegressor

#2. 모델
model = RandomForestRegressor()

*********************************************
decision tree
Minmax: 결과 r2 :  0.6252904174582093
Standard 결과 : 0.610199889411199

앙상블
standard : 0.8134721940607257

[Boosting 계열의 모델]

Boosting 이란 약한 분류기를 결합하여 강한 분류기를 만드는 과정 

Adaptive Boosting (AdaBoost) : 다수결을 통한 정답 분류 및 오답에 가중치 부여

Gradient Boosting Mode (GBM) : LightGBM, CatBoost, XGBoost - Gradient Boositng Alogorithm을 구현한 패키지

 

XGBoost 

#2. 모델(conda에서 xgboost 설치)
from xgboost import XGBClassifier
model = XGBClassifier()

xgboost : 0.8666666666666666666666

LightGBM

#2. 모델(conda에서 xgboost 설치)
from lightgbm  import LGBMClassifier
model = LGBMClassifier()

xgboost : 0.8666666666666666666666
lgbm :  0.2

CatBoost

#2. 모델(conda에서 catboost 설치)
from catboost import CatBoostClassifier
model = CatBoostClassifier()

xgboost : 0.8666666666666666666666
lgbm :  0.2
catboost: cv predict acc :  0.9666666666666667

 

XGBoost plot 띄우는 법 - 보기 어려움

#시각화
import matplotlib.pyplot as plt
from xgboost.plotting import plot_importance
plot_importance(model)
plt.show()

K-Fold

ML 모델에서 가장 보편적으로 사용되는 교차 검증 기법

K개의 데이터 폴드 세트를 만들어서 K번만큼 각 폴드 세트에 학습과 검증 평가를 수행

KFold : 회귀 문제에서의 교차검증

StratifedKFold : 레이블 데이터가 왜곡되었을 경우, 분류에서 교차 검증 

 

cancer K-Fold

#kfold
n_splits = 5
random_state = 42
kfold = KFold(n_splits=n_splits, shuffle=True, random_state=random_state)

sclaer RobustScaler() 적용

#2. 모델
model = RandomForestClassifier()

#3. 훈련 
model.fit(x_train,y_train)

********************************************
decision tree
Robuster:    0.9298245614035088

앙상블
Robuster: 결과 acc:   0.9649122807017544

앙상블 + Kfold
acc :  0.9532163742690059

cali K-Fold

from sklearn.model_selection import train_test_split, KFold

#kfold
n_splits = 5
random_state =42
kfold = KFold(n_splits=n_splits, shuffle=True, random_state=random_state)

********************************
decision tree- regressor
Minmax: 결과 r2 :  0.6252904174582093
Standard 결과 : 0.610199889411199

앙상블
standard : 0.8134721940607257

앙상블 + kfold
r2 score : 0.7736576724548081

stratifiedKFold_iris

from sklearn.model_selection import StratifiedGroupKFold

#1. 데이터
datasets = load_iris()

#StratifiedGroupKFold
n_splits = 5 # 11이면 홀수 단위로 자름 10개가 train, 1개가 test
random_state = 42
kfold = StratifiedGroupKFold(n_splits=n_splits, shuffle=True, random_state=random_state) 

# sclaer 적용 scaler = MinMaxScaler()

#2. 모델
model = RandomForestClassifier()

#3. 훈련 
model.fit(x,y)

#4. 평가 예측
result = model.score(x,y) 
print('결과 acc:  ', result)

*************************************************
#decision tree
#scaler: minmax 결과 acc:   0.9555555555555556

#앙상블
#scaler: minmax 결과 acc: 0.9555555555555556

#kfold: n 11,3,5 결과 acc:   1.0
#strait :결과 acc:   1.0

 

스케일링 (Scaling)

Normalization(정규화) : 데이터를 0과 1사이의 범위로 조정, 상대적인 크기를 유지하면서 모델이 더 잘 학습하게 도움

Standardization(표준화) : 평균이 0, 표준편차가 1로 변환, 데이터의 분포를 조정하여 이상치에 대해 덜 민감하게 만듬

 

MinMaxScaler(), 0과 1사이로 스케일링, 이상치에 민감하며, 회귀에 유용

StandardScaler(), 평균을 0, 분산을 1로 스케일링, 이상치에 민감하며, 분류에 유용함

MaxAbsScaler(), 특성의 절대값이 0과 1 사이가 되도록 스케일링. 모든 값은 -1과 1사이로 표현되며 양수일 경우 minmax와 동일 

RobustScaler(), 평균과 분산 대신 중간 값과 사분위 값을 사용, 이상치 영향을 최소화할 수 있음 

 

*train은 fit과 transform, test는 transform scaler 

 

 

* 스케일러 적용 전에도 예측값이 좋았던 건 스케일러 적용했을 때 값이 나빠질 수도 있다.

아래 Iris와 wine 데이터 비교

 

Iris scaler 4개 적용

from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.preprocessing import MaxAbsScaler, RobustScaler

#1. 데이터
datasets = load_iris()
x_train, x_test, y_train, y_test = train_test_split(x,y,train_size=0.7, random_state=100)

# sclaer 적용
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

#2. 모델
model = LinearSVC()

#3. 훈련 
model.fit(x_train,y_train)

#4. 평가 예측
result = model.score(x_test,y_test) 
print('결과 acc:  ', result)

**************************************************
#LinearSVC() 결과 acc:   0.9666666666666667
***************************************************
#Scaler 적용 
#Standard : 0.9333333333333333
#Minmax : 0.9333333333333333
#MaxAbs: 0.9555555555555556
#Robuster:    0.9333333333333333

 

cancer scaler 4개 적용

from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.preprocessing import MaxAbsScaler, RobustScaler

#1. 데이터
datasets = load_breast_cancer()
x_train, x_test, y_train, y_test = train_test_split(x,y,train_size=0.7, random_state=100)

# sclaer 적용
scaler = MaxAbsScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

#2. 모델
model = LinearSVC()

#3. 훈련 
model.fit(x_train,y_train)

#4. 평가 예측
result = model.score(x_test,y_test) 
print('결과 acc:  ', result)
***************************************************
#Linear SVC 결과 acc:   0.9415204678362573
#딥러닝: accuracy :  0.9064327485380117

Scaler 적용 
Standard : 0.9473684210526315
Minmax : 0.9649122807017544
MaxAbs: 0.9649122807017544
Robuster:    0.9532163742690059