728x90
반응형

모델 저장 및 불러오기

훈련모델 저장 및 불러오는 2가지 방법

  • joblib 방식
  • pickle 방식

모델 저장하기 전에 와인데이터로 rf모델 생성함

 joblib 방식

import joblib
''' 
훈련모델 저장하기 
 - 파일 확장자는 자유롭게
'''

joblib.dump(rf, "./model/rf_model_joblib.md")

''' 모델 파일 불러들이기 '''
joblib_model = joblib.load("./model/rf_model_joblib.md")
joblib_model

joblib_model.predict(test_input)

 

pickle 방식

import pickle

''' 
훈련모델 저장하기 
 - wb : w는 쓰기, b는 바이너리 => 바이너리 형태로 쓰기
'''

with open("./model/rf_model_pickle.md", "wb") as fw :
    pickle.dump(rf, fw)
''' 
모델 파일 불러오기
 - rb : r는 읽기, b는 바이너리 => 바이너리 형태의 파일 내용 읽기
'''
with open ("./model/rf_model_pickle.md", "rb") as f :
    load_pickle_model = pickle.load(f)

load_pickle_model

load_pickle_model.predict(test_input)

728x90
반응형
728x90
반응형

군집모델

군집(Clustering)분석

  • 비지도 학습
  • 군집분석은 분류를 위한 분석
  • 패턴이 유사한 데이터들끼리 묶는 작업
  • 묶음 단위를 군집(Cluster)이라고 칭한다.
  • 대표 모델 : KMeans(K평균)

KMeans(K평균) 군집 모델

  • 모델 스스로 패턴이 유사한 특성(컬럼)들을 묶으면서 중심 평균을 구하는 방식
  • 점진적으로 패턴이 유사한 특성들끼리 묶어나가는 방식
  • 특성들이 묶이면서 중심에 대한 평균이 이동됨
  • 가장 대표적인 군집모델

🖍️ 특징

  • 군집할 갯수를 미리 정의해야 함
  • 군집할 갯수는 종속변수의 범주의 갯수와 동일함(이미 종속변수를 알고 있는 경우도 있고, 아닌 경우도 있음)
  • 군집의 갯수를 이미 알고 있는 경우에는 직접 갯수 정의, 모르는 경우에는 하이퍼파라미터 튜닝을 통해 적절한 갯수 선정 

🖍️ 작동방식

  1. 데이터들을 이용해서 무작위로 K개의 클러스터 중심을 정함
  2. 각 샘플에서 가장 가까운 클러스터 중심을 찾아서 해당 클러스터의 샘플로 지정
  3. 특정 클러스터에 속한 "샘플들의 평균값"으로 클러스터 중심을 변경
  4. 클러스터 중심에 변화가 없을 때까지 2번 ~ 3번을 반복 수행하게 되는 모델임

사용할 라이브러리

import pandas as pd
import numpy as np

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, confusion_matrix

''' KMeans 군집 모델 '''
from sklearn.cluster import KMeans

 

사용할 데이터 셋 - 와인데이터

'''
 - 데이터 불러오기 : 변수명 data
 - 독립변수와 종속변수로 나누기 : 변수명은 X, y
'''
data = pd.read_csv("./data/08_wine.csv")
X = data.iloc[:,:-1]
y = data["class"]
X.shape, y.shape

 

데이터 스케일링 - 정규화

'''
 - 정규화 클래스 변수 : scaler
 - 독립변수 정규화 변수명 : X_scaled
'''

scaler = StandardScaler()
scaler.fit(X)
X_scaled = scaler.transform(X)

X_scaled.shape

 

훈련 : 테스트 분리하기 (8:2)

'''
 - 변수명 : X_train, X_test, y_train, y_test
'''
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, random_state=42, test_size=0.2)

print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)

 

하이퍼파라미터 튜닝을 위한 매개변수 정의하기

'''
 - n_clusters : 군집갯수
 - n_init : 초기 중심점 설정 횟수
 - max_iter : 최대 반복 횟수
 - tol : 중심정의 이동이 설정 값보다 작으면 종료
'''

param_grid = {
    "n_init" : [10, 30, 50],
    "max_iter" : [10, 30, 50],
    "tol" : [0.0001, 0.001, 0.01, 0.1]
    # "n_clusters" : [2, 3, 4, 5]
}

 

 

튜닝 및 훈련모델 생성

  • 튜닝에 사용할 훈련모델 생성
kmeans = KMeans(n_clusters=2, random_state=42)
  • GridSearchCV 생성하여 베스트 모델 찾기
grid_search = GridSearchCV(kmeans, param_grid, cv=5, scoring="accuracy")
grid_search

  • 튜닝 시작하기
grid_search.fit(X_train, y_train)

  • 최적의 매개변수를 가지는 모델 추출하기
best_model = grid_search.best_estimaitor_
best_model

 

훈련 및 검증(테스트) 모델 평가하기

'''
 - 훈련 및 테스트 예측
 - 훈련 및 테스트 정확도 확인
 - 오차행렬(혼동행렬) 추출
'''

train_pred = best_model.predict(X_train)
test_pred = best_model.predict(X_test)

train_acc = accuracy_score(y_train, train_pred)
test_acc = accuracy_score(y_test, test_pred)

''' 오차행렬도(혼동행렬) '''
cm = confusion_matrix(y_test, test_pred)

print(f"훈련 정확도 : {train_acc} / 테스트 정확도 : {test_acc}")
print(f"오차행렬(혼동행렬) : {cm}")

결과

와인 데이터는 군집분석으로 적절하지 않다

지도학습 기반의 분류모델이 적절하다.

지도학습을 하려면 정답을 알아야 한다.

정답을 알지 못한다면 라벨링을 해야 한다.(종속변수를 만들어야 한다)

 

시각화 하기

  • 시각화 라이브러리
import matplotlib.pyplot as plt
import seaborn as sns

plt.rc("font", family="Malgun Gothic")
plt.rcParams["axes.unicode_minus"] = False
  • 시각화에 사용할 데이터 생성하기
data = {
    "alcohol" : X_train[:, 0],
    "sugar" : X_train[:, 1],
    "pH" : X_train[:, 2],
    "class" : y_train,
    "cluster" : train_pred
}   
train_data = pd.DataFrame(data=data)
train_data

  • 시각화하기
sns.pairplot(train_data, hue="cluster")
plt.show()

 

class가 0과 1 밖에 없기 때문에 위와 같은 일직선 모양의 그래프가 나타남

섞여있으면 군집이 안된 것 (예를 들어, alcohol과 pH)

파란색(0)이 1에 있으면 틀린 것 > 분류를 잘못함

주황색(1)이 0에 있으면 틀린 것 > 분류를 잘못함

 

Iris(붓꽃) 데이터셋을 이용한 군집(Clustering)분석

  • 사용 라이브러리
from sklearn.cluster import KMeans

''' 
 군집분석 평가 방법 : 실루엣 score로 평가함
 - 값의 범위 : -1 ~ 1 사이의 값
 - -1에 가까울 경우 : 군집 분류가 잘 안된 경우
 - 0에 가까울 경우 : 이도 저도 아닌 상태()
 - 1에 가까울 경우 : 군집이 잘 된 경우
'''

from sklearn.metrics import silhouette_score

''' Iris(붓꽃) 데이터셋 라이브러리 '''
from sklearn.datasets import load_iris

import seaborn as sns
  • Iris 데이터 읽어들이기
iris = load_iris()
iris
  • 특성 설명

- sepal length : 꽃받침 길이
- sepal width : 꽃받침 너비
- petal length : 꽃잎 길이
- petal width : 꽃잎 너비

 

  • 종속변수 특성 설명
    - 0, 1, 2의 값 (붓꽃의 품종)
    - 0 : 세토사(setosa)
    - 1 : 버시컬러(verstcolor)
    - 2 : 버지니카(virginica)

  • 분석 주제
    - 4가지 독립변수 특성을 이용하여 붓꽃의 품종 종류별로 군집(클러스터) 분류하기

독립변수와 종속변수 데이터 추출하기

'''
독립변수명 : X
종속변수명 : y
'''

X = iris.data
y = iris.target
X.shape, y.shape

 

군집 모델 생성 / 훈련 및 예측

'''
 - 군집분류에서는 별도로 훈련과 검증데이터로 분류하기 않고, 전체 데이터를 사용하여 군집합니다.
'''
'''
 * 군집모델 생성하기
  - 군집 갯수 지정
  - n_init : 초기 중심점 설정 횟수는 10으로 설정
  - 랜덤 규칙 : 42번 
'''
kmeans_model = KMeans(n_clusters=3, n_init=10, random_state=42)
kmeans_model

''' 
 - 모델 훈련 및 군집하기(예측)
 - 군집분석에서는 훈련과 동시에 예측이 수행 됨
'''
kmeans_labels = kmeans_model.fit_predict(X)
print(kmeans_labels)
print(y)

 

군집결과 시각화하기

  • 주성분분석(PCA)을 통해 시각화하기
  • 주성분분석(PCA)
    →  훈련에 사용된 특성들 중에 특징을 가장 잘 나타낼 수 있는 특성을 추출하는 방식
    → 특성을 추출하여 특성을 축소시키는 방식으로 "차원축소"라고 칭한다.
    → 주요 성분의 특성만을 사용하기 때문에 빠른 성능을 나타냄
  • 주성분분석(차원축소) 라이브러리
from sklearn.decomposition import PCA

 

  • 주성분분석(PCA) 클래스 생성하기
'''
 - n_components : 주성분 몇개로 차원을 축소할지 정의
'''
pca = PCA(n_components=2)
pca

 

  • 주성분 찾기
pca.fit(X)
X_pca = pca.transform(X)
X_pca.shape

 

  • 시각화 하기
plt.title("K평균 군집화 결과")
plt.scatter(X_pca[:, 0], X_pca[:,1], c=kmeans_labels)
plt.show()

 

 

1개(초록)는 분류가 잘 되었고, 나머지 2개(보라, 노랑)는 섞여있다.

3개의 범주 중 1개는 정확히 분류 되었고 나머지는 섞여있다. 이 둘은 50% 의 확률로 분류되지 않을 수도 있다. 그렇기 때문에 이  분류모델을 사용하기엔 부족한 부분이 있다고 판단한다

 

그러나 보라 노랑이 섞여는 있지만 어느정도 분류된 것 처럼 보이기 때문에 사용할 수 도 있다.

 

 

 

 

  • 군집분석 평가하기 : 실루엣 평가
s_score = silhouette_score(X, kmeans_labels)
s_score

 

728x90
반응형
728x90
반응형

분류모델_선정하기

사용할 라이브러리 정의

''' 데이터 처리 '''
import pandas as pd

''' 데이터 분류 '''
from sklearn.model_selection import train_test_split

''' 하이퍼파라미터 튜닝 '''
from sklearn.model_selection import GridSearchCV

''' 사용할 분류모델들 '''
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import HistGradientBoostingClassifier
from xgboost import XGBClassifier

''' 데이터 스케일링 : 정규화 '''
from sklearn.preprocessing import StandardScaler

''' 평가 '''
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score

''' 오차행렬(혼동행렬) '''
from sklearn.metrics import confusion_matrix
from sklearn.metrics import ConfusionMatrixDisplay

 

데이터 셋

data = pd.read_csv("./data/08_wine.csv")
data.info()
data.describe()

 

데이터프레임에서 독립변수와 종속변수로 데이터 분리하기

''' 
 사용할 변수
 - 독립변수 : X
 - 종속변수 : y
'''

# X = data[["alcohol", "sugar", "pH"]]
X = data.iloc[:,:-1]
y = data["class"]
X, y

 

 

정규화

'''
사용할 변수
 - 독립변수 정규화 : X_scaled
'''
ss = StandardScaler()
ss.fit(X)
X_scaled = ss.transform(X)
X_scaled

훈련:검증:테스트 = 6:2:2로 분리하기

'''
사용할 변수
 - X_train, y_train
 - X_val, y_val
 - X_test, y_test
'''

X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.4, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_test, y_test, random_state=42, test_size=0.5)

print(f"{X_train.shape} / {y_train.shape}")
print(f"{X_val.shape} / {y_val.shape}")
print(f"{X_test.shape} / {y_test.shape}")

 

훈련에 사용할 모든 모델 생성하기

rf_model = RandomForestClassifier()
et_model = ExtraTreesClassifier()
gd_model = GradientBoostingClassifier()
hg_model = HistGradientBoostingClassifier()
xgb_model = XGBClassifier()

''' 리스트 타입의 변수에 모델 객체 담기 '''
models = [rf_model, et_model, gd_model, hg_model, xgb_model]
models

''' 모델 이름을 리스트 변수에 담기 '''
model_name = [rf_model.__class__.__name__,
              et_model.__class__.__name__,
             gd_model.__class__.__name__,
             hg_model.__class__.__name__,
              xgb_model.__class__.__name__]
model_name

 

GridSearchCV를 위한 하이퍼파라미터 매개변수 정의

  •  n_estimators()
        - 트리의 갯수를 의미함
        - 트리의 갯수를 늘리게 되면 모델의 복잡성이 증가됨
        - 과적합을 방지하고 더 좋은 성능을 낼 수 있음
        - 설정값 : 제한은 없으나, 50, 100 ~ 1000 사이의 값을 주로 사용
        - rf, xt, gb, xgb에서 사용가능
        - hg에서는 max_iter() 함수를 사용함

  • max_depth()
        - 각 트리의 최대 깊이를 의미함(root 노드는 제외)
        - 트리의 최대 깊이가 길어질 수록 모델의 복잡성이 증가함
        - 설정값 : 제한 없음, 주로 None ~ 50 사이의 값이 주로 사용됨
        - 모든 모델 사용가능

  •  min_samples_split()
        - 노드를 분할하기 위한 최소한의 갯수를 의미함
        - 설정값: 제한없음, 2 ~ 10 사이의 값이 주로 사용됨
        - rf, xt, gb 모델만 사용가능

  •  min_samples_leaf()
        - 리프 노드 (결정노드)의 최소한의 샘플 수를 의미함
        - 설정값 : 제한없음, 1 ~ 10 사이의 값이 주로 사용됨
        - rf, xt, gb, hg 모델 사용가능
        - xgb 모델은 min_child_weight() 함수 사용

 

모든 모델에 대해서 GridSearchCV 수행 후 정확도 평가하기

''' RF, GB에서 특성중요도 추출 라이브러리 '''
from sklearn.feature_selection import SelectFromModel
''' HGB에 대한 특성중요도 추출 라이브러리 '''
from sklearn.inspection import permutation_importance

''' 최종 결과는 DataFrame에 저장하여 출력 '''
df = pd.DataFrame()

for model, modelName in zip(models, model_name):
    print(f"------------------{modelName} 시작------------------")
    ''' ------------------하이퍼파라미터 매개변수 정의하기------------------ '''
    if modelName == "HistGradientBoostingClassifier" :
        param_grid = {
            "max_iter" : [50, 100],
            "max_depth" : [None, 10],
            "min_samples_leaf" : [1, 2, 4]
        }

    elif modelName == "XGBClassifier" : 
         param_grid = {
             "n_estimators" : [50, 100],
             "max_depth" : [None, 10],
             "min_child_weight" : [1, 2, 4]
        }
     
    else :
         param_grid = {
             "n_estimators" : [50, 100],
             "max_depth" : [None, 10],
             "min_samples_split" : [2, 5],
             "min_samples_leaf" : [1, 2, 4]
        }

    ''' GridSearchCV 수행하기 '''    
    grid_search = GridSearchCV(model, param_grid, cv=5, scoring="accuracy")
    # print(grid_search)
    
    grid_search.fit(X_train, y_train)

    ''' 최적의 모델 받아오기 '''
    model = grid_search.best_estimator_
    #print(model)

    ''' ------------------훈련 및 검증정확도 확인하기------------------ '''
    ''' 정확도를 확인하기 위하여 예측하기 '''
    train_pred = model.predict(X_train)
    val_pred = model.predict(X_val) 

    ''' 정확도 확인하기 '''
    train_acc = accuracy_score(y_train, train_pred)
    val_acc = accuracy_score(y_val, val_pred)

    ''' ------------------최종 테스트 평가하기------------------ '''
    ''' 테스트 데이터로 예측하기 '''
    test_pred = model.predict(X_test)

    ''' 정확도 확인하기 '''
    test_acc = accuracy_score(y_test, test_pred)
    ''' 정밀도 확인하기 '''
    test_pre = precision_score(y_test, test_pred)
    ''' 재현율 확인하기 '''
    test_rec = recall_score(y_test, test_pred)
    ''' F1 확인하기 '''
    test_f1 = f1_score(y_test, test_pred)

    ''' 오차행렬도(혼동행렬) '''
    cm = confusion_matrix(y_test, test_pred)

    ''' 데이터 프레임에 담기 '''
    df_temp = pd.DataFrame({
        "모델명" : [modelName],
        "훈련정확도" : [train_acc],
        "검증정확도" : [val_acc],
        "테스트정확도" : [test_acc],
        "(훈련-검증)" : [train_acc - val_acc],
        "정밀도" : [test_pre],
        "재현율" : [test_rec],
        "F1-score" : [test_f1]
    })

    ''' 하나의 데이터프레임에 추가하기 '''
    df = pd.concat([df, df_temp], ignore_index=True)

    print(df)

    ''' ------------------특성 중요도------------------ '''
    ''' 독립변수의 특성이름 추출하기 '''
    columnNames = X.columns

    ''' 특성중요도를 담을 리스트 변수'''
    feature_importances = []

    ''' 특성중요도는 모델 훈련에 따른 중요도, 따라서 훈련데이터 사용 '''
    ''' 추출된 특성중요도의 리스트 값의 순서는 특성의 실제 순서와 동일함 '''
    if modelName == "HistGradientBoostingClassifier" :
        feature_importances = permutation_importance(model, X_train, y_train, n_repeats=10, random_state=42)
        feature_importances = feature_importances.importances_mean
    else :
        feature_importances = model.feature_importances_
  
    ''' 추출된 특성중요도 값과 실제 특성명과 매핑하여 딕셔너리에 담기 '''
    feature_importances_dict = {k : v for k, v in zip(columnNames, feature_importances)}

    print(f"특성중요도 : ", feature_importances_dict)
    print()

728x90
반응형
728x90
반응형

https://mzero.tistory.com/115 에 이어서

 

[인공지능][ML] Machine Learning - 분류모델 / 앙상블모델 / 배깅 / 부스팅 / 랜덤포레스트

분류 앙상블 모델 🍇 앙상블 모델 tree구조(결정트리)를 기반으로 만들어진 모델 여러개의 트리 모델을 이용해서 훈련하는 모델을 앙상블 모델이라고 칭한다. 🍇 앙상블 모델 분류 회귀와 분류

 

 

 

 

 

mzero.tistory.com

Randomforest(랜덤포레스트)

🍇 훈련하기

1. StandardScaler 사용

''' 훈련모델 생성하기 '''
from sklearn.ensemble import RandomForestClassifier

''' 모델(클래스) 생성하기
 - cpu의 코어는 모두 사용, 랜덤값은 42번을 사용하여 생성하기
 - 모델 변수의 이름은 rf 사용
'''
rf = RandomForestClassifier(n_jobs=-1, random_state=42)

''' 모델 훈련 시키기 '''
rf.fit(train_std_scaler, train_target)

''' 훈련 및 검증(테스트) 정확도(score) 확인하기 '''
train_score = rf.score(train_std_scaler, train_target)
test_score = rf.score(test_std_scaler, test_target)
print(f"훈련 = {train_score} / 검증 = {test_score}")

 

2. RobustScaler 사용

''' 모델(클래스) 생성하기
 - cpu의 코어는 모두 사용, 랜덤값은 42번을 사용하여 생성하기
 - 모델 변수의 이름은 rf 사용
'''
rf = RandomForestClassifier(random_state=42, n_jobs=-1)

''' 모델 훈련 시키기 '''
rf.fit(train_rbs_scaler, train_target)

''' 훈련 및 검증(테스트) 정확도(score) 확인하기 '''
train_score = rf.score(train_rbs_scaler, train_target)
test_score = rf.score(test_rbs_scaler, test_target)
print(f"훈련 = {train_score} / 검증 = {test_score}")

 

3. MinMaxScaler 사용

''' 모델(클래스) 생성하기
 - cpu의 코어는 모두 사용, 랜덤값은 42번을 사용하여 생성하기
 - 모델 변수의 이름은 rf 사용
'''
rf = RandomForestClassifier(random_state=42, n_jobs=-1)

''' 모델 훈련 시키기 '''
rf.fit(train_mm_scaler, train_target)

''' 훈련 및 검증(테스트) 정확도(score) 확인하기 '''
train_score = rf.score(train_mm_scaler, train_target)
test_score = rf.score(test_mm_scaler, test_target)
print(f"훈련 = {train_score} / 검증 = {test_score}")

 

해석
 - 가장 일반화된 모델을 나타내는 스케일링 방법으로는 StandardScaler 정규화 방법을 사용했을 때 이다.
 - 3개 모두 0.1 이상의 과대적합 양상을 보인다.
 - 따라서, 하이퍼파라미터 튜닝 및 다른 분류모델에 의한 훈련이 필요할 것으로 보인다.
 

🍇 예측하기

''' 모델(클래스) 생성하기 '''
rf = RandomForestClassifier(n_jobs=-1, random_state=42)

''' 모델 훈련 시키기 '''
rf.fit(train_std_scaler, train_target)

''' 예측하기 '''
y_pred = rf.predict(test_std_scaler)
y_pred

 

🍇 성능평가하기

  • 분류 모델 평가 방법
    - 정확도, 정밀도, 재현율, F1-score 값을 이용해서 평가함
    - 예측에 오류가 있는지 확인 : 오차행렬도(혼동행렬도)를 통해 확인

  • 평가 기준
    - 정확도를 이용하여 과적합 여부 확인(이미 위에서 실행함)
    - 재현율이 높고, F1-score 값이 높은 값을 가지는 모델을 선정하게 됨
    - 정확도, 정밀도, 재현율, F1-score의 모든 값은 0~1 사이의 값을 가지며, 값이 높을 수록 좋다.
    - 재현율을 가장 중요시 여긴다.


  • 성능 평가에 시각화 자료 사용
''' 시각화 라이브러리 정의하기 '''
import matplotlib.pyplot as plt
import seaborn as sns

''' 한글처리 '''
plt.rc("font", family = "Malgun Gothic")
''' 마이너스 기호 처리 '''
plt.rcParams["axes.unicode_minus"] = True

import numpy as np
''' 오차행렬 계산 라이브러리 '''
from sklearn.metrics import confusion_matrix
''' 오차행렬도 시각화 라이브러리 '''
from sklearn.metrics import ConfusionMatrixDisplay

 

  • 오차행렬도 그리기
''' 오차행렬의 기준 특성은 종속변수 기준 '''
''' 훈련에서 사용한 종속변수의 범주 확인하기 '''
rf.classes_

''' 오차행렬 평가 매트릭스 추출하기 '''
cm = confusion_matrix(test_target, y_pred, labels=rf.classes_)

''' 오차행렬도 시각화 하기 '''
disp = ConfusionMatrixDisplay(confusion_matrix=cm,
                       display_labels=rf.classes_)

disp.plot()

TN (0, 0) 실제 0인 값을 0으로 예측 > 참
FP (0, 1) 실제 0인 값을 1로 예측 > 긍정적 오류
FN (1, 0) 실제 1인 값을 0으로 예측 > 부정적 오류 : 해당 값이 많을 수록 사용할 수 없는 모델이 된다.
TP (1, 1) 실제 1인 값을 1로 예측 > 참

<오차행렬(혼동행렬)>
- 어떠한 유형의 오류가 발생하고 있는지를 나타내는 값
- 이를 시각화한 것을 오차행렬도 또는 혼동행렬도라고 칭함
- 정확도(score)의 값과 오차행렬도의 시각화 결과로 최종 모델을 선정한다.

<해석 방법>
- 긍정(Positive)적 오류인지, 부정(Negative)적 오류인지로 해석함

* FP(False Positive)
     : 예측결과가 맞지는 않음(False)
     : 긍정적(Positive)로 해석함 : 위험하지 않은 오류

* FN(False Negative)
     : 예측결과가 맞지는 않음(False)
     : 부정적(Negative) 오류로 해석함 
     : 위험한 오류로 해석
     : FN의 값이 크다면, 정확도(score)의 값이 높더라도 예측 모델로 사용하는데 고려해야함

* TP(True Positive)
     : 예측결과가 맞는 경우(True)
     : 1을 1로 잘 예측한 경우

* TN(True Negative)
     : 예측결과가 맞는 경우(True)
     : 0을 0으로 잘 예측한 경우
<평가에 사용되는 값 : 정확도, 정밀도, 재현율, F1_score>

* 정확도
    - 예측결과가 실제값과 얼마나 정확한가를 나타내는 값
    - Accuracy = (TP + TN) / (TP + TN + FP + FN)

* 정밀도(Precision)
    - 모델이 1로 예측한 데이터 중에 실제로 1로 잘 예측한 겂
    - Precision = TP / (TP + FP)

* 재현율(Recall)
    - 실제로 1인 데이터를 1로 잘 예측한 값
    - Recall = TP / (TP + FN)
    - 위험한 오류가 포함되어 있음

* F1-score
    - 정밀도와 재현율을 조합하여 하나의 통계치로 반환한 값
    - 정밀도와 재현율의 평균이라고 생각해소 됨
    - F1 Score = 2 * {(정밀도 * 재현율) / (정밀도 + 재현율)}

<최종 모델 선정 방법>
 - 과소 및 과대 적합이 일어나지 않아야 함
 - 재현율과 F1-score가 모두 높으면 우수한 모델로 평가할 수 있음
 - 재현율이 현저히 낮은 경우에는 모델 선정에서 고려, 또는 제외

 

  • 분류모델 평가 라이브러리
''' 정확도 : 훈련 및 검증 정확도에서 사용한 score()함수와 동일함 '''
from sklearn.metrics import accuracy_score
''' 정밀도 '''
from sklearn.metrics import precision_score
''' 재현율 '''
from sklearn.metrics import recall_score
''' F1-score '''
from sklearn.metrics import f1_score

 

1. 정확도

acc = accuracy_score(test_target, y_pred)
acc

 

2. 정밀도

pre = precision_score(test_target, y_pred)
pre

 

3. 재현율

rec = recall_score(test_target, y_pred)
rec

 

4. F1-score

rec = recall_score(test_target, y_pred)
rec

해석
- 정확도는 0.89로 높은편
- 정밀도, 재현율, F1_score의 값이 0.92 이상으로 매우 높은 값을 나타내고 있음
- 따라서, 랜덤포레스트 모델을 이용해서 해당 데이터에 대한 예측을 하는데 사용가능
- 즉, 예측 모델로 사용가능
728x90
반응형
728x90
반응형

분류 앙상블 모델

🍇 앙상블 모델

  • tree구조(결정트리)를 기반으로 만들어진 모델
  • 여러개의 트리 모델을 이용해서 훈련하는 모델을 앙상블 모델이라고 칭한다.

🍇 앙상블 모델 분류

  • 회귀와 분류에서 모두 사용한 모델들 이다
  • sklearn 패키지 모델은 모두 가능
  • xgb도 가능

🍇 배깅(Bagging)과 부스팅(Boosting) 방식

  • 앙상블 모델은 여러개의 트리를 사용하기 때문에 훈련 데이터를 여러 모델(여러 트리)에 적용하는 방식에 따라서 배깅과 부스팅 방식으로 구분한다.

🍇 배깅(Bagging)

  • 사용되는 여러개의 모델(여러 트리)들은 서로 독립적을 사용 된다.(연관성 없음)
  • 훈련데이터는 여러 모델에 랜덤하게 적용되며, 중복되는 데이터가 있을 수 도 있다.
  • 훈련데이터를 사용 후에는 반환하는 방식을 사용한다
    → 반환 후에 다시 랜덤하게 추출하여 여러 모델(여러 트리)에 적용한다
  • 대표적인 배깅 앙상블 모델은 랜덤포레스트 모델이 있다.
  • 배깅 앙상블 모델 : 랜덤 포레스트, 엑스트라트리
  • 예측 : 회귀에서는 평균값을 이용하며, 분류에서는 과반수(확률)에 따라 결정 된다.
  • 과적합을 해소하는 모델로 주로 사용된다.

🍇 부스팅(Boosting)

  • 사용되는 여러개의 모델(여러 트리)들은 서로 연관성을 가진다.
  • 이전 모델(이전 트리)의 오차를 보완하여 다음 모델(다음 트리)에서 이어서 훈련이 진행되는 방식
  • 훈련 데이터는 랜덤하게 추출되어 사용되지만, 이전 모델 훈련에서 오차가 크게 발생했던 훈련데이터에 가중치를 부여하여 사용하게 된다.
  • 대표적인 부스팅 앙상블 모델로 그레디언트 부스팅 모델이 있다.
  • 모델 : 그래디언트 부스팅, 히스트그레디언트 부스팅, 엑스지부스팅
  • 정확도를 높이는 모델로 주로 사용된다.

 🍇실제 모델 적용 순서

  • 분류시 최초에는 주로 랜덤포레스트 모델을 이용해서 수행한다.
     정확도가 높은 모델로 유명했다. 지금은 부스트 모델이 우수한 편이다.
  • 최종 모델 선정시에는 분류모델 전체 사용하여 선정한다.

Randomforest(랜덤포레스트)

 🍇 데이터 불러들이기

import pandas as pd
wine = pd.read_csv("./data/08_wine.csv")
wine


🍇 와인종류 분류하기

  • 와인종류 : 레드와인(0), 화이트와인(1)
  • 훈련에 사용할 데이터
    - 독립변수 : Alcohol(알콜), Sugar(설탕, 당도), pH(수소이온농도; 산성 또는 염기성)
    - 종속변수 : class(와인종류; 0또는 1, 0은 레드와인, 1은 화이트와인)

🍇 독립변수와 종속변수로 데이터 분리하기

'''독립변수'''
data = wine[["alcohol", "sugar", "pH"]].to_numpy()

'''종속변수'''
target = wine["class"].to_numpy()

data.shape, target.shape

 

🍇 훈련 테스트데이터로 분리하기(8:2)

'''
사용변수 : train_input, test_input, train_target, test_target
'''
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(data, target, test_size=0.2, random_state=42)

print(f"train_input={train_input.shape} / train_target={train_target.shape}")
print(f"test_input={test_input.shape} / test_target={test_target.shape}")

 

🍇 데이터 스케일링(정규화 또는 표준화)

  • 서로 다른 변수(특성)의 값의 범위(단위)를 일정한 수준으로 맞추는 작업을 의미함
  • 수치형 변수(특성, 퓨터, 항목, 컬럼 같은 용어)에만 적용된다
  • 스케일링 방법 3가지 (아래 3가지는 구분만 될 뿐 의미는 모두 스케일링이다)
    1. 정규화 : StandardScaler → 분류 또는 회귀에서 사용가능하며, 주로 분류에서 사용됨
    2. 정규화 : RobustScaler → 분류 및 회귀 모두 사용가능
    3. 표준화 : MinMaxScaler → 분류 또는 회귀에서 사용가능 하며, 주로 회귀에서 사용됨(최대 및 최소 범위 내에서 처리되는 방식)

1. 정규화 : StandardScaler  

'''
훈련데이터 정규화 변수 : train_std_scaler
테스트데이터 정규화 변수 : test_std_scaler
'''

from sklearn.preprocessing import StandardScaler

''' 정규화 클래스 생성하기 '''
ss = StandardScaler()

''' 정규화 패턴 찾기 : 훈련데이터만 사용 '''
ss.fit(train_input)

''' 훈련 및 테스트 독립변수 변환하기 '''
train_std_scaler = ss.transform(train_input)
test_std_scaler = ss. transform(test_input)
train_std_scaler.shape, test_std_scaler.shape

 

2. 정규화 : RobustScaler 

''' 
훈련데이터 정규화 변수 : train_rbs_scaler
테스트데이터 정규화 변수 : test_rbs_scaler
'''
from sklearn.preprocessing import RobustScaler

''' 정규화 클래스 생성하기 '''
rbs = RobustScaler()

''' 정규화 패턴 찾기 : 훈련데이터만 사용 '''
rbs.fit(train_input)

''' 훈련 및 테스트 독립변수 변환하기 '''
train_rbs_scaler = rbs.transform(train_input)
test_rbs_scaler = rbs. transform(test_input)
train_rbs_scaler.shape, test_rbs_scaler.shape

 

3. 표준화 : MinMaxScaler  

'''
훈련데이터 표준화 변수 : train_mm_scaler
테스트데이터 표준화 변수 : test_mm_scaler
'''
from sklearn.preprocessing import MinMaxScaler

''' 표준화 클래스 생성하기 '''
mm = MinMaxScaler()

''' 표준화 패턴 찾기 : 훈련데이터만 사용 '''
mm.fit(train_input)

''' 훈련 및 테스트 독립변수 변환하기 '''
train_mm_scaler = mm.transform(train_input)
test_mm_scaler = mm. transform(test_input)
train_mm_scaler.shape, test_mm_scaler.shape

 

 🍇 훈련하기

''' 훈련모델 생성하기 '''
from sklearn.ensemble import RandomForestClassifier

''' 모델(클래스) 생성하기
 - cpu의 코어는 모두 사용, 랜덤값은 42번을 사용하여 생성하기
 - 모델 변수의 이름은 rf 사용
'''
rf = RandomForestClassifier(random_state=42, n_jobs=-1)

''' 모델 훈련 시키기 '''
rf.fit(train_std_scaler, train_target)

''' 훈련 및 검증(테스트) 정확도(score) 확인하기 '''
train_score = rf.score(train_std_scaler, train_target)
test_score = rf.score(test_std_scaler, test_target)
print(f"훈련 = {train_score} / 검증 = {test_score}")

 

728x90
반응형
728x90
반응형

🍡 선형회귀모델 (LR; Liner Regression Model)

 

### 모델 라이브러리 불러들이기
from sklearn.linear_model import LinearRegression
### 사용할 데이터
train_input, train_target, test_input, test_target
### 모델(클래스 생성하기)
lr = LinearRegression()

### 모델 훈련 시키기
lr.fit(train_input, train_target)

### 훈련 정확도
train_r2 = lr.score(train_input, train_target)

### 테스트(검증) 정확도
test_r2 = lr.score(test_input, test_target)

print(f"훈련={train_r2} / 테스트={test_r2}")

### (해석)
# - 결정계수 확인 결과, 훈련 결정계수 > 테스트 결정계수이므로 과소적합은 일어나지 않았으나,
# - 두 계수의 차이가 0.12로 과대적합이 의심됨

 

🍡임의 데이터로 예측하기

  • KNN에서는 1033g을 예측했었음
lr.predict([[50]])

 

🍡추세선 그리기

  • 추세선(예측선 이라고도 함)를 그리기 위한 계수값 추출하기
  • 직선의 방정식 y = a * x + b
  •  coef_ : 기울기(계수) → a
  • intercept_ : y절편 → b
lr.coef_, lr.intercept_

### 훈련데이터 산점도
plt.scatter(train_input, train_target)

### 예측값 산점도
plt.scatter(50, 1241.839, marker='^')

### 추세선
plt.plot([15, 50], [lr.coef_ * 15 + lr.intercept_,
                   lr.coef_ * 50 + lr.intercept_])

plt.grid()
plt.show()

# 선으로부터 떨어진 거리 = 오차 값(MAE)

 

  • 추세선 시작값을 0으로 설정
### 훈련데이터 산점도
plt.scatter(train_input, train_target)

### 예측값 산점도
plt.scatter(50, 1241.839, marker='^')

### 추세선
plt.plot([0, 50], [lr.coef_ * 0 + lr.intercept_,
                   lr.coef_ * 50 + lr.intercept_])

plt.grid()
plt.show()

 

해석

 - 임의 값 예측 시 KNN보다는 성능이 좋은 예측이 가능하며, 과적합이 발생하지 않는 일반화된 모델로 보여지나, y절편의 값이 음수로 예측시 음수의 데이터가 예측 될 가능성이 있는 모델로 보여짐
 - 종속변수 무게의 값은 0이하로 나올 수 없기에 이상치를 예측할 수 있는 모델로 현재 사용하는 데이터를 예측하기에는 부적합한 모델로 여겨짐

 

 

 

🧁 다항회귀모델

 

  • 데이터의 분포가 선형이면서 곡선을 띄는 경우에 사용됨
  • 곡선(포물선)의 방정식이 적용되어 있음
  • y = (a * x^2) + (b * x) +c
  • 독립변수는 2개가 사용됨 : x^2값과 x값

🧁 훈련 및 테스트데이터의 독립변수에 x^2값 추가하기

# - 훈련 독립변수
train_poly = np.column_stack((train_input**2, train_input))

# - 테스트 독립변수
test_poly = np.column_stack((test_input**2, test_input))

train_poly.shape, test_poly.shape

 

🧁 모델 훈련 및 예측

### 모델 생성하기
# - 선형, 다형, 다중 회귀모델은 하나의 모델(클래스) 사용
# - 직선, 곡선에 대한 구분은 독립변수의 갯수로 모델이 알아서 구분해준다. 
lr = LinearRegression()

### 모델 훈련 시키기
lr.fit(train_poly, train_target)

### 훈련 정확도 확인하기
train_r2 = lr.score(train_poly, train_target)

### 테스트 정확도 확인하기
test_r2 = lr.score(test_poly, test_target)

### 과적합 여부 확인(해석)
# - 0.007 정도의 과소적합(훈련 < 검증)이 발생

print(f"훈련 결정계수 = {train_r2} / 테스트 결정계수 = {test_r2}")

### 임의 값 길이 50으로 예측하기
pred = lr.predict([[50**2, 50]])
print(f"길이 50 예측 결과 : {pred}")

 

🧁 추세선 그리기

  • 추세선을 그리기 위해서는 곡선의 방정식에 사용할 계수 a,b와 절편 c를 알아야 함
print(f"계수 = {lr.coef_} / 절편 = {lr.intercept_}")

a = lr.coef_[0]
b = lr.coef_[1]
c = lr.intercept_
print(f"a = {a} / b = {b} / c = {c}")

 

plt.scatter(train_input, train_target)
plt.scatter(50, pred[0], marker='^')

# 추세선
# - 추세선이 사용할 x축값 지정(0~50까지의 순차적인 값 사용)
point = np.arange(0, 51)
plt.plot(point, a*point**2 + b*point + c)

plt.grid()
plt.show()


해석
 - 선형회귀모델의 경우에는 음의 절편값이 나타나는 모델이었으나, 다항회귀모델의 경우에는 이를 해소할 수 있었음
 - 단, 길이(x)가 10이하의 독립변수는 사용하면 안됨
 - 다항회귀모델의 훈련 및 테스트 결정계수의 결과 미세한 과소적합을 보이고 있으나, 사용가능한 모델로 판단됨
 - 선형회귀모델에 비하여 독립변수들이 전체적으로 추세선에 가깝게 위치하고 있기에 오차가 적은 모델이라고 분석 됨


 

🧁 과소 / 과대 적합을 해소하기 위한 방법

  • 데이터 양(row 데이터, 행)을 늘릴 수 있는지 확인
  • 분석 모델이 좀 더 집중해서 훈련할 수 있도록 특성(독립변수)을 추가하는 방법 확인
    → 특성을 추가(늘리는)하는 방법은 "특성공학" 개념을 적용
    → 특성을 늘려서 사용하는 모델로 다중회귀모델이 있음
    → 특성을 늘린다는 의미는 훈련의 복잡도를 증가시킨다고 표현하며, 복잡도가 증가되면, 훈련의 집중력이 강해지게 됨
  • 복잡도를 늘리는 방법으로는 "규제" 방법이 있음
    → "규제"를 하는 하이퍼파라미터 속성을 이용하는 방식으로 릿지와 라쏘 회귀모델 방식이 있음
  • 이외 다른 회귀모델을 사용하여 비교
  •  특성 → 컬럼, 필드, 퓨처 모두 같은 의미
  • 데이터 처리 분야에서는 컬럼 또는 필드라고 칭하며, 머신러닝에서는 특성이라고 칭하며, 딥러닝에서는 퓨처라고 칭함

💎 다중회귀모델(Multiple Regression)

 

  • 여러개의 특성을 사용한 회귀모델
  • 특성이 많을수록 복잡도가 증가됨(훈련 시간이 오래걸림, 시스템 성능에 따라 빠를 수도 있음)
  • 다중회귀모델 공식
    y = a*x1 + b*x2 + c*x3 + ... + y절편 (x의 값은 3개 이상)

💎 데이터 불러들이기

  • 사용할 데이터프레임 변수
import pandas as pd
df = pd.read_csv("./data/03_농어의_길이_높이_두께_데이터.csv")

 

💎 농어의 길이, 두께 높이 값을 이용해서 무게 예측하기

  • 독립변수 : 길이, 두께, 높이
  • 종속변수 : 무게
  • 독립변수 생성하기
    → 데이터프레임의 특성 중에 독립변수로 사용할 특성들을 2차원의 리스트 또는 배열 형태로 만들어아야 한다.
    → to_numpy() : 행렬 데이터 형태를 리스트 배열 형태로 바꿈
perch_full = df.to_numpy()
perch_full.shape

  • 종속변수 생성하기
import numpy as np
### 농어 무게
perch_weight = np.array(
    [5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 
     110.0, 115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 
     130.0, 150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 
     197.0, 218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 
     514.0, 556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 
     820.0, 850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 
     1000.0, 1000.0]
     )
perch_weight.shape

 

💎 훈련 및 테스트 데이터로 분류하기

  •  분류 기준 : 테스트 데이터를 30%로
from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target = train_test_split(perch_full,
                                                                      perch_weight,
                                                                     test_size=0.3,
                                                                     random_state=42)

print(f"{train_input.shape} : {train_target.shape}")
print(f"{test_input.shape} : {test_target.shape}")

 

💎 모델 훈련 및 평가

from sklearn.linear_model import LinearRegression

### 모델 생성하기
lr = LinearRegression()

### 모델 훈련시키기
lr.fit(train_input, train_target)

### 훈련 정확도 및 검증(테스트) 정확도 확인하기
train_r2 = lr.score(train_input, train_target)
test_r2 = lr.score(test_input, test_target)

print(f"훈련 = {train_r2} / 테스트 = {test_r2}")

  • 과적합 여부 판단하기
    - 훈련과 검증(테스트) 결정계수의 결과로 볼 때 과소적합은 발행하지 않았다. 또한, 0.07 ~ 0.08 정도로 과대적합 또한 일어나지 않은 일반화 된 모델로 볼 수 있음
    - 다만, 검증(테스트) 정확도가 0.8대에서 0.9대로 올릴 수 없을지 고민해 본다.
    - 특성공학을 적용하여 특성 늘리는 방법으로 집중도를 강화하는 방식을 사용해서 성능 향상이 되는지 확인한다.
  • 특성을 생성하는 라이브러리
    - 사용 패키지 : sklearn.preprocessing
    - 사용 클래스 : PolynomialFeatures(변환기라고 보통 칭한다)
    - 사용 함수 : fit(훈련 독립변수에서 생성할 특성의 패턴 찾기), transform(찾은 패턴으로 특성 생성하기)
    - 종속변수는 사용되지 않는다.

💎 테스트 데이터로 예측하기

test_pred = lr.predict(test_input)
test_pred

 

💎 평균절대오차(MAE) 확인하기

from sklearn.metrics import mean_absolute_error

mae = mean_absolute_error(test_target, test_pred)
mae

💎 특성공학

 

💎 특성공학 적용하기

  • 패키지 정의하기
from sklearn.preprocessing import PolynomialFeatures
  • 클래스 생성하기
    - 특성을 생성 시킬 때 y절편값도 생성을 함께 시킨다.
    - 특성만 있으면 되기 때문에 y절편은 생성에서 제외시키기 위해서 include_bias(y절편) = False로 설정한다.
poly = PolynomialFeatures(include_bias = False)
  • sample 데이터로 어떤 특성들이 만들어지는지 확인하기
temp_data = [[2, 3, 4]]
temp_data

  • 특성을 만들 패턴 찾기
poly.fit(temp_data)

  • 찾은 패턴으로 특성 생성하기
poly.transform(temp_data)

 

💎 실제 독립변수를 이용해서 특성 생성하기

  • 클래스 생성하기
  • degree = 2
    - 차원을 의미하며 2는 제곱승을 의미함
    - 3을 넣으면 2의 제곱, 3의 제곱을 수행
    - 4를 넣으면 2의 제곱, 3의제곱, 4의 제곱승을 수행함
    - 기본값은 2 (생략하면 2의 제곱승이 적용됨)
poly = PolynomialFeatures(degree=2, include_bias=False)

  • 패턴 찾기
    - 훈련 독립변수 사용
poly.fit(train_input)

  • 특성 생성하기
### 훈련 독립변수에 특성 추가하기
train_poly = poly.transform(train_input)

### 테스트 독립변수에 특성 추가하기
test_poly = poly.transform(test_input)

train_poly.shape, test_poly.shape

  • 사용된 패턴 확인하기
poly.get_feature_names_out()

 

💎 모델 생성 / 훈련 / 예측 / 평가

### 모델 생성하기
lr = LinearRegression()

### 모델 훈련시키기
lr.fit(train_poly, train_target)

### 훈련 정확도 및 검증(테스트) 정확도 확인하기
train_r2 = lr.score(train_poly, train_target)
test_r2 = lr.score(test_poly, test_target)

### 예측 하기
test_pred = lr.predict(test_poly)

### 모델 평가하기(MAE)
mae = mean_absolute_error(test_target, test_pred)

print(f"훈련 = {train_r2} / 테스트 = {test_r2} / 오차 = {mae}")

해석
- 특성공학을 적용하지 않은 모델은 검증(테스트) 정확도가 다소 낮았으며, 오차가 50g 정도 있으나- 특성공학을 적용하여 특성을 추가하여 훈련 집중도를 높였을 때는 훈련 및 검증(테스트) 정확도 모두 높아졌으며, 과적합이 발생하지 않은 일반화 모델로 오차는 30g정도의 매우 우수한 모델로 판단 됨
- 이 모델을 사용하려면, 독립변수의 특성 길이, 높이, 두께 3개의 특성을 사용해야 하고 특성 생성 시 degree 2를 적용한 특성을 사용해야 함

💎규제

 

💎 규제

  • 과대 또는 과소 적합 중에 주로 과대적합이 발생 했을 때 사용된다.
  • 훈련의 정확도가 다소 낮아지는 경향이 있으나. 검증(테스트) 정확도를 높이는 효과가 있음
  • 훈련모델을 일반화하는데 주로 사용되는 방법임
  • 규제 개념을 적용한 향상된 모델 : 릿지(Ridge)와 라쏘(Lasso)가 있다.

💎 규제 순서

  1. 정규화(단위(스케일)을 표준화 시키는 방식)
  2. 규제가 적용된 모델 훈련 / 검증

💎 훈련 및 테스트 독립변수 정규화 하기

  • 정규화를 위한 라이브러리
from sklearn.preprocessing import StandardScaler

 

  • 정규화 순서
     1. 정규화 클래스 생성
     2. fit() : 정규화 패턴 찾기(훈련 독립변수 사용)
     3. transform() : 찾은 패턴으로 정규화 데이터로 변환(훈련 및 테스트 독립변수 변환)
''' 1. 정규화 클래스 생성 '''
ss = StandardScaler()

''' 2. 정규화 패턴 찾기 '''
ss.fit(train_poly)

''' 3. 찾은 패턴으로 훈련 및 테스트 독립변수 변환 생성하기 '''
train_scaled = ss.transform(train_poly)
test_scaled = ss.transform(test_poly)

print(f"{train_scaled.shape} / {test_scaled.shape}")

 

릿지(Ridge) 모델

from sklearn.linear_model import Ridge

''' 모델 생성하기'''
ridge = Ridge()

''' 모델 훈련시키기 '''
ridge.fit(train_scaled, train_target)

''' 훈련 및 검증(테스트) 정확도 확인하기 '''
train_r2 = ridge.score(train_scaled, train_target)
test_r2 = ridge.score(test_scaled, test_target)

train_r2, test_r2

''' 예측하기 '''
test_pred = ridge.predict(test_scaled)

''' 평가하기(MAE) '''
mae = mean_absolute_error(test_target, test_pred)

print(f"훈련 = {train_r2} / 테스트 = {test_r2} / 오차 = {mae}")

해석
- 과적합 여부를 확인한 결과, 과소적합은 발생하지 않았으며- 기존 특성공학을 적용한 우수한 모델보다는 훈련 정확도는 0.005정도 낮아 졌지만 검증(테스트) 정확도는 0.013 정도 높아졌음
- 또한, 평균절대오차(MAE)도 1g 낮아졌음
- 따라서, 일반화되고, 오차가 적은 Ridge 모델은 매우 우수한 모델로 판단됨

 

라쏘(Lasso) 모델

### 사용할 패키지
from sklearn.linear_model import Lasso

### 모델 생성하기
lasso = Lasso()

''' 모델 훈련시키기 '''
lasso.fit(train_scaled, train_target)

''' 훈련 및 검증(테스트) 정확도 확인하기 '''
train_r2 = lasso.score(train_scaled, train_target)
test_r2 = lasso.score(test_scaled, test_target)

train_r2, test_r2

''' 예측하기 '''
test_pred = lasso.predict(test_scaled)

''' 평가하기(MAE) '''
mae = mean_absolute_error(test_target, test_pred)

print(f"훈련 = {train_r2} / 테스트 = {test_r2} / 오차 = {mae}")

해석
- 0.0002 정도의 과소적합이 있는 것으로 보임
- 오차값도 3g정도 작아졌음

- 과소적합이 미세한 차이이기 때문에 릿지 모델과 비교 했을 때 나쁜 모델은 아니지만, 사용하기에는 미흡한 부분으로 판단 됨

 

💎 하이퍼파라미터 튜닝하기 (규제 적용)

  • 릿지(Ridge) 모델 규제 튜닝하기
    • alpha : 규제강도 값
    • 값의 범위 0.001 ~ 100 사이의 값
    • 값이 작을 수록 훈련 정확도는 낮아지면서, 과적합에 도움을 주게 됨
    • 값이 커질 수록 훈련 정확도는 높아짐, 과적합에는 도움이 되지 읺을 수도 있음
    • 기본 값은 = 1
ridge = Ridge(alpha=1)
ridge.fit(train_scaled, train_target)
ridge.score(train_scaled, train_target), ridge.score(test_scaled, test_target)
# 규제강도 1 (0.9849041294689239, 0.9845173591615219)
# 0 (0.9898271546307025, 0.971377160062062)
# 0.1 (0.9882780161390031, 0.9868237771849514) best!!
# 0.01 (0.9882780161390031, 0.9868237771849514)
# 0.001 (0.9891665643761299, 0.9844479791505587)
# 0.0001 (0.9897131221945868, 0.9790469305992887)

 

  • 라쏘(Lasso) 모델 규제 튜닝하기
lasso = Lasso(alpha=0.1)
lasso.fit(train_scaled, train_target)
lasso.score(train_scaled, train_target), lasso.score(test_scaled, test_target)

 

# 0.1 (0.9883448062768178, 0.9857016019582314)

 

728x90
반응형

+ Recent posts