


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]]


