TP
,와 TN
은 실제값을 맞게 예측한 부분이고, FP
와 FN
은 실제값과 다르게 예측한 부분을 의미한다. 모델 평가 기준에 사용됩니다.가장 직관적인 성능 평가 지표입니다.
단점으로는 데이터의 편향이 심한 경우 오류가 발생할 수도 있습니다.
ex) 희귀병환자 데이터에서 모델은 0을 출력할 때가 더 많습니다.
반비례
관계를 가지고 있습니다- A모델에서는 검출률이 99%, B모델에서는 검출률이 60%라고 했을때
- 어느 모델이 좋은지는 검출률만보고 판단하기 어렵습니다.
- 이유는 A와 B둘다 오검출을 고려하지 않았기때문입니다.
- A에서 강아지, 고양이 모든 애완동물을 검출해서 99%가 나온 것일 수도 있기 때문입니다.
- B에서는 고양이만 검출했다고 해도 검출률이 낮기 때문에 모델이 좋은지 판단이 되지 않습니다.
- Precision과 Recall의 조화평균입니다.
- 주로 데이터가 불균형
할때 사용합니다
- 실제 값을 예측하는 확률에 로그를 취하여 부호를 반전시킨 값입니다.
- 즉 ,분류 모델 자체의 잘못 분류된 수치적인 손실값(loss)를 계산합니다.
- log-loss는 낮을수록 좋은 지표이다.
- hyperparameter로 사용하고 기준은 없지만 대부분 1e-4로 시작한다.
- 미분, 경사하강법에 사용이되고, 알파가 크면 최적의 W를 못찾게 된다.
- 이런 현상을 `Overshooting`이라고 한다.
- 반대로 알파가 작게되면 학습이 적게되어 그것보다 더 좋은 값이 있는데 진행이 되지 못하고 멈추는 것을 말합니다.
- 이런 값을 `local minimum`이라고 합니다.
0 ~ 1
사이의 값으로 만드는 것많은 Training Data를 사용
독립변수(Feature)
의 개수를 줄입니다 -> 다중공선성 문제해결
다중공선성
이란 독립변수가 독립변수에 상관 영향이 높아 모델에 영향을 주는것을 말합니다.Deep Learning
Dropout
기법을 사용합니다.규제(Regularization)
데이터 비대칭 문제(Imbalanced Data Problem)
undersampling
: 데이터의 개수를 줄이는 방법.oversampling
: 데이터의 개수를 늘리는 방법.K-Fold Cross Validation
# Logistic Regression을 구현해 보아요!
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 이상치 처리를 위한 import
from scipy import stats
# 정규화 진행을 위한 import
from sklearn.preprocessing import MinMaxScaler
from sklearn import linear_model
# keras import
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import SGD
# Raw Data Loading
df = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/ML/data/admission/admission.csv')
# display(df) # 400 rows × 4 columns
# 결측치 부터 알아보아요!
df.info()
df.isnull().sum()
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 admit 400 non-null int64
# 1 gre 400 non-null int64
# 2 gpa 400 non-null float64
# 3 rank 400 non-null int64
# 결측치는 존재하지 않네요!
# 이상치도 알아보아야 해요!
# 이상치를 눈으로 확인하려면 boxplot을 그려보면 되요!
fig = plt.figure()
fig_gre = fig.add_subplot(1,3,1)
fig_gpa = fig.add_subplot(1,3,2)
fig_rank = fig.add_subplot(1,3,3)
fig_gre.boxplot(df['gre'])
fig_gpa.boxplot(df['gpa'])
fig_rank.boxplot(df['rank'])
plt.tight_layout()
plt.show()
# 수치상 이상치로 표현이 되지만
# 실제 데이터예요!(이상치가 아니예요!)
# 하지만 우리학습을 위해 이상치로 판별된 데이터를 삭제하고 진행
zscore_threshold = 2.0 # zscore 임계값 -2이하, 2이상이면 이상치
for col in df.columns:
outlier = df[col][np.abs(stats.zscore(df[col])) > zscore_threshold]
df = df.loc[np.isin(df[col], outlier, invert=True)]
print(df.shape) # (382, 4) 18개의 데이터가 이상치로 제거!
# 정규화를 진행해야 해요!
x_data = df.drop('admit', axis=1, inplace=False).values
t_data = df['admit'].values.reshape(-1,1)
scaler = MinMaxScaler()
scaler.fit(x_data)
x_data_norm = scaler.transform(x_data)
# Model을 구현해 보아요!
# sklearn부터 구현해 보아요!
sklearn_model = linear_model.LogisticRegression()
sklearn_model.fit(x_data,
t_data.ravel())
# predict
predict_value = np.array([[600, 3.8, 1]])
result_proba = sklearn_model.predict_proba(predict_value)
print(result_proba) # [[0.43740782 0.56259218]]
----------------------------------------------------------
# Tensorflow로 구현해 보아요!
keras_model = Sequential()
keras_model.add(Flatten(input_shape=(3,)))
keras_model.add(Dense(units=1,
activation='sigmoid'))
keras_model.compile(optimizer=SGD(learning_rate=1e-4),
loss='binary_crossentropy')
keras_model.fit(x_data_norm,
t_data,
epochs=500,
verbose=0)
# predict
predict_value = np.array([[600, 3.8, 1]])
predict_value_norm = scaler.transform(predict_value)
result = keras_model.predict(predict_value_norm)
print(result)
# sklearn : [[0.43740782 0.56259218]]
# tensorflow : [[0.57682455]]