본문 바로가기

멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차/ML

4/4 월

728x90

월요일!

 

오늘은 금요일에 실습 예제로 주어졌던 admission(대학원 합격 여부) 데이터셋을 Sklearn, Tensorflow로 구현하고,

지난주에 배운 Logistic Regression을 활용해 평가지표(Metrics)를 알아본다.

 

1. Logistic Regression by Sklearn

import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn import linear_model
from sklearn.preprocessing import MinMaxScaler
from scipy import stats
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')

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

# display(df.head())
# df.info()
# print(df.isnull().sum()) # 결치값 없음

# figure = plt.figure()
# ax1 = figure.add_subplot(1,4,1)
# ax2 = figure.add_subplot(1,4,2)
# ax3 = figure.add_subplot(1,4,3)
# ax4 = figure.add_subplot(1,4,4)

# ax1.set_title('ADMIT')
# ax2.set_title('GRE')
# ax3.set_title('GPA')
# ax4.set_title('RANK')

# ax1.boxplot(df['admit'])
# ax2.boxplot(df['gre'])
# ax3.boxplot(df['gpa'])
# ax4.boxplot(df['rank'])

# figure.tight_layout()
# plt.show() # df['gre'], df['gpa']에 이상치가 있다

zscore_threshold = 2.0 # zscore로 이상치 제거
for col in df.columns:
    outlier = df[col][np.abs(stats.zscore(df[col])) > zscore_threshold]
    df = df.loc[~df[col].isin(outlier)] # ~는 Not

x_data = df.drop('admit', axis = 1, inplace=False) # 정규화 진행
t_data = df['admit'].values.reshape(-1,1) # 0과 1로만 구성되어 있음

scaler = MinMaxScaler()
scaler.fit(x_data) # fit으로 변환을 위한 사전구조 맞추기

norm_x_data = scaler.transform(x_data) # 0 ~ 1 사이의 값으로 변환
# print(norm_x_data) # norm_x_data, t_data 준비

model = linear_model.LogisticRegression() # Sklearn 구현
model.fit(x_data, t_data)
my_score = np.array([[600, 3.8, 1]])
predict_val = model.predict(my_score) # 1. 0 or 1로 결과 도출
predict_proba = model.predict_proba(my_score) # [[0.43740782 0.56259218]]. 확률값으로 결과 도출

print('Sklearn이 예측한 결과 : 합격여부 : {}, 확률 : {}'.format(predict_val, predict_proba)) # 합격!

 

2. Logistic Regression by Tensorflow

X = tf.placeholder(shape=[None,3], dtype=tf.float32) # placeholder
T = tf.placeholder(shape=[None,1], dtype=tf.float32)

# Weight, bias
W = tf.Variable(tf.random.normal([3,1]))
b = tf.Variable(tf.random.normal([1]))

# Hypothesis, Model, Predict Model, Logistic Regression Model
logit = tf.matmul(X,W) + b
H = tf.sigmoid(logit)

# loss func, cross entropy 혹은 log loss
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logit, labels=T)) # logits은 선형회귀, y. label은 T

# train node
train = tf.train.GradientDescentOptimizer(learning_rate=1e-4).minimize(loss)

# Session & 초기화
sess = tf.Session()
sess.run(tf.global_variables_initializer())

# 반복 학습
for step in range(300000):
    _, loss_val = sess.run([train, loss], feed_dict={X: norm_x_data, T: t_data})
    
    if step % 30000 == 0:
        print('loss의 값 : {}'.format(loss_val))
# Prediction + MinMaxScaler
my_score = np.array([[600, 3.8, 1]])
norm_my_score = scaler.transform(my_score)

result = sess.run(H, feed_dict={X: norm_my_score})
print('Tensorflow가 예측한 : 확률 : {}'.format(result)) # [[0.4715909]]. 불합격!

 

Model을 구현한 후 Evaluation(성능평가)를 진행해야 함 - Metrics

 

Training Data Set을 이용해서 학습한 뒤, Training Data Set을 이용해서 성능평가를 하면 당연히 안됨!

(모의고사 문제 = 본고사 문제)

 

그러므로, Original Data Set을 Training(독립 · 종속변수 혼재)과 Test Data Set(독립변수만)으로 나눠줘야 함

예측을 제출하기 전 자체 평가하기 위해, Training Data Set을 Validation Data Set으로 또 나눠줌(Model의 수정)→ Hold-Out Validation : Training Data Set의 일부를 Validation Data Set으로 희생단점 : 데이터 양이 적으면 쓰기 곤란함, 데이터의 편향이 생길 수 있음

 

다른 Validation 방식은 K-Fold Cross Validation 

 

1. Regression의 Metrics (Hold-Out Validation, Sklearn)

import numpy as np
import pandas as pd
from sklearn import linear_model
from scipy import stats
from sklearn.model_selection import train_test_split # Training set / Test set 나누기

df = pd.read_csv('./data/ozone.csv')
# print(df.shape) # (153, 6)

training_data = df.dropna(how='any', inplace=False) # 결측치 제거
# print(training_data.shape) # (111, 6)

zscore_threshold = 2.0 # zscore로 이상치 제거

for col in training_data.columns:
    outlier = training_data[col][np.abs(stats.zscore(training_data[col])) > zscore_threshold]
    training_data = training_data.loc[~training_data[col].isin(outlier)] # ~는 Not

# display(training_data.head()) # Sklearn 쓸 거라서 정규화는 따로 하지 않음

# Data Set
x_data = training_data[['Solar.R', 'Wind', 'Temp']].values
t_data = training_data[['Ozone']].values.reshape(-1,1)

# Train / Validation Data Set으로 분리
train_x_data, valid_x_data, train_t_data, valid_t_data = \
train_test_split(x_data,
                 t_data,
                 test_size=0.3,
                 random_state=2) # random_state은 seed 역할

# print(train_x_data.shape, valid_x_data.shape, train_t_data.shape, valid_t_data.shape)
# (67, 3) (29, 3) (67, 1) (29, 1)

# Model
model = linear_model.LinearRegression()

# Model 학습
model.fit(train_x_data, train_t_data)

# 예측값. 정답은 valid_t_data
predict_value = model.predict(valid_x_data)

- 1. MAE(Mean Absolute Error) : 예측값과 정답의 차이를 절대값으로 평균 냄

직관적이고 단위가 같으나 scale(종속변수의 단위)에 따라 의존적임

from sklearn.metrics import mean_absolute_error # MAE

print(mean_absolute_error(valid_t_data, predict_value)) # 13.924465776324642

- 2. MSE(Mean Squared Error) : 오차의 제곱의 평균. MAE보다 이상치에 민감함

from sklearn.metrics import mean_squared_error # MSE

print(mean_squared_error(valid_t_data, predict_value)) # 271.5671192367061

- 3. RMSE(Root Mean Squared Error) : MSE에 루트 씌운 것

- 4. MAPE(Mean Absolute Percentage Error) : MAE의 100 분율 표현. 값이 작을수록 좋은 모델. At가 정답, Ft가 예측

- 5. R-Squared : 분산을 기반으로 한 평가지표. 예측값의 variance / 정답의 variance. 1에 가까울수록 좋은 모델

from sklearn.metrics import r2_score # R-Squared

print(r2_score(valid_t_data, predict_value)) # 0.3734728354920861

 

2. Classification(이항분류)의 Metrics

- Confusion Matrix를 이용해서 Metric을 정의

- 1. Accuracy : TP + TN / TP + FN + FP + TN. bias 데이터의 편향(치우침)을 반드시 고려해야 함

- 2. Recall(재현율) : TP / TP + FN. 실제 positive 중에서 얼마나 진짜를 잘 찾았는지에 대한 비율

- 3. Precision(정밀도) : TP / TP + FP. positive라고 예측한 것들 중에 얼마나 잘 맞추었는지에 대한 비율. 일반적으로 Recall과 Precision은 반비례 관계. 두 지표 모두 고려해야!

- 4. Precision - Recall graph

 

- 5. F1-Score : Precision과 Recall의 조회 평균

- 6. Fall-out : FP / TN + FP. 실제 값이 False인데 Model이 True로 잘못 예측한 비율

- 7. ROC curve : Recall과 Fall-out의 값을 시각화

- 8. Log-loss : 다항분류에서 일반적으로 사용

 

1. 3/15 화 2. 3/16 수 3. 3/17 목 4. 3/18 금 5. 3/21 월
ML
환경 설정

(아나콘다, 주피터 노트북),
Pandas,

Numpy,
ndarray
ML
Numpy,

행렬곱연산,
전치행렬,
iterator,
axis,
Pandas,
Series,
DataFrame
ML
Pandas,
DataFrame,

함수들
ML
Pandas,
데이터 분석,
데이터 전처리
ML
Pandas,
데이터 전처리,
수행평가
6. 3/22 화 7. 3/23 수 8. 3/24 목 9. 3/25 금 10. 3/28 월
ML
데이터 시각화,
Matplotlib,
기술통계
ML
기술통계
ML
기술통계,
머신러닝
ML
미분,
Regression
ML
머신러닝 기법들,
Regression
11. 3/29 화 12. 3/30 수 13. 3/31 목 14. 4/1 금 15. 4/4 월
ML
Regression 구현
(Python, Scikit-Learn)
ML
Outlier,
Z-score,
MinMaxScaler,
다변수
 ML
Tensorflow,
Classification
ML
Classification,
Logistic Regression
ML
평가지표(Metrics)
16. 4/5 화 17. 4/6 수 18. 4/7 목 19. 4/8 금 20. 4/11 월
ML
평가 시 주의사항
       

* 열정 열정 열정! 복습 복습 복습!

728x90

'멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차 > ML' 카테고리의 다른 글

4/6 수  (0) 2022.04.06
4/5 화  (0) 2022.04.05
4/1 금  (0) 2022.04.01
3/31 목  (0) 2022.03.31
3/30 수  (0) 2022.03.30