본문 바로가기
자격증/AICE🎓

[AICE] 머신러닝

by 무명오리 2023. 9. 19.
linear Regression

 

모델 학습

목표: 최적 직선 구하기

직선별 손실함수 구하기(실제값-예측값)^2/N

손실함수 최소값 구하기(경사하강법으로)

 

 

지도학습(supervised learning)

정답 필수

데이터와 레이블(정답) 함께 제공

 

분류모델(Classification)
- 레이블 값들이 이산적으로 나눠질 수 있는 문제에 사용

예측모델(Regression)
- 레이블 값들이 연속적인 문제에 사용

 

비지도학습(un-supervised learning)

정답 없이 진행

데이터 자체에서 패턴을 찾아내야 할 때 사용

 

 

confusion matrix

모델의 대략적인 성능확인과 모델의 성능을 오차행렬을 기반으로 수치로 표현

 

맞느냐 틀렸느냐 → T/F   P/N ← 예측한 값

 

 

성능지표

정밀도 : 모델이 True라고 분류한 것 중에서 실제 True인 것의 비율

재현율 : 실제 True인 것 중에서 모델이 True라고 예측한 것의 비율

정확도

F1 score : 정밀도와 재현율의 조화평균

 


 

scikit-learn

 

회귀 : Linear Regression

from sklearn.linear_model import LinearRegression
model = LinearRefression()

# y = Wx
model.fit(x_train, y_train)

# y hat
pred = model.predict(x_test)

 

분류 : Logistic Regression

from sklearn.linear_model import LogisticRegression
model = LogisticRegression()

# y = Wx
model.fit(x_train, y_train)

# y hat
pred = model.predict(x_test)

 

회귀분류 : Decision Tree, Random Forest, K-Nearest Neighbor

# 결정 트리
from sklearn.tree import DecisionTreeClassifier
model = DecisionTressClassifier(max_depth=2)

# y = Wx
model.fir(x_train, y_train)

# y hat
pred = model.predict(x_test)
# 랜덤포레스트
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=50)

# y = Wx
model.fit(x_train, y_train)

# y hat
pred = model.predict(x_test)
# KNN
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=3)

# y = Wx
knn.fit(x_train, y_train)

# y hat
pred = knn.predict(x_test)

 

 


 

Ensemble

여러 개의 분류기를 생성하고, 그 예측을 결합함으로써 보다 정확한 예측을 도출하는 기법

약한 모델 여러 개를 조합하여 더 정확한 예측 방식 적절한 Hyperparameter 튜닝이 중요

 

1. Boosting

이전 학습에 대하여 잘못 예측된 데이터에 가중치를 부여해 오차를 보완해 나가는 방식

순차적인 학습 → 긴 학습시간

ex) XGBoost, LightGBM

!pip install xgboost
from xgboost import XGBClassifier

model = XGBClassifier(n_estimators=50)

model.fit(x_train, y_train)

prred=model.predict(x_test)
!pip install lightgbm
from xgboost import LGBMClassifier

model = LGBMClassifier(n_estimators=50)

model.fit(x_train, y_train)

pred = model.predict(x_test)

 

2. Stacking

여러 개 모델이 예측한 결과 데이터를 기반으로 final_estimator 모델로 종합하여 예측 수행

성능 향상 가능 but 과대적합 유발 가능

from sklearn.ensemble import StackingRegressor, StackingClassifier

stack_models = [ ('LogisticRegression', lg), ('KNN', knn), ('DecisionTree', dt), ]

# stack_models로 선언된 모델(LogisticRegression,KNN,DecisionTree)의 예측결과를
# 최종 meta_model(final_estimator)을 RandomForest(rfc) 사용하여 분류 예측
stacking = StackingClassifier(stack_models, final_estimator=rfc, n_jobs=-1)

stacking.fit(X_train, y_train) 

stacking_pred = stacking.predict(X_test)

accuracy_eval('Stacking Ensemble', stacking_pred, y_test)

 

3. Weighted Blending

각 모델의 예측값에 대하여 weight를 곱하여 최종 output 계산

가중치의 합은 1.0이 되도록 함

final_outputs = { 'DecisionTree': dt_pred, 'randomforest': rfc_pred, 'xgb': xgb_pred, 'lgbm': lgbm_pred, 'stacking': stacking_pred, }

final_prediction=\
final_outputs['DecisionTree'] * 0.1\
+final_outputs['randomforest'] * 0.2\
+final_outputs['xgb'] * 0.25\
+final_outputs['lgbm'] * 0.15\
+final_outputs['stacking'] * 0.3\

# 가중치 계산값이 0.5 초과하면 1, 그렇지 않으면 0
final_prediction = np.where(final_prediction > 0.5, 1, 0)

accuracy_eval('Weighted Blending', final_prediction, y_test)

 


① 라이브러리 임포트(import)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

 

② 데이터 가져오기(Loading the data)

df = pd.read_csv('data.csv')


③ 탐색적 데이터 분석(Exploratory Data Analysis)

df.info()
df.tail()
df["col A"].value_counts().plot(kind='bar')

 

④ 데이터 전처리(Data PreProcessing) : 데이터타입 변환, Null 데이터 처리, 누락데이터 처리, 더미특성 생성, 특성 추출 (feature engineering) 등

cols = ['class', 'sex']
df1 = pd.get_dummies(data=df, columns=cols, drop_first=True)
df1.info()

 

⑤ Train, Test 데이터셋 분할

from sklearn.model_selection import train_test_split

x = df1.drop('sex_M', axis=1).values
y = df1['sex_M'].values

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, stratify=y, random_state=42)

x_train.shape
y_train.shape

 

⑥ 데이터 정규화(Normalizing the Data)

df1.tail()

# 0~1로 스케일링
from sklearn.preprocessing improt MinMaxScaler

scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

# 확인하기
x_train[:2], y_train[:2]

 

⑦ 모델 개발(Creating the Model)

⑧ 모델 성능 평가

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import classification_report

lg = LogisticRegression(C=1.0,max_iter=2000)
lg.fit(X_train, y_train)

# 분류기 성능 평가(score)
lg.score(X_test, y_test)

lg_pred = lg.predict(X_test)


# 오차행렬
# TN FP
# FN TP

confusion_matrix(y_test, lg_pred)

accuracy_score(y_test, lg_pred)
precision_score(y_test, lg_pred)
recall_score(y_test, lg_pred)
f1_score(y_test, lg_pred)

print(classification_report(y_test, lg_pred))

# accuracy_eval 함수 따로 만듦
accuracy_eval('LogisticRegression', lg_pred, y_test)

 

 

 

 

 

 

 

 

 

 

 

'자격증 > AICE🎓' 카테고리의 다른 글

[AICE] 머신러닝 분류  (0) 2023.09.22
[AICE] 딥러닝  (0) 2023.09.20
[AICE] 데이터 전처리  (0) 2023.09.17
[AICE] Matplotlib 활용  (0) 2023.09.15
[AICE] Pandas 이해 및 활용  (0) 2023.09.13