우선 데이터를 Linear Regression을 이용해서 분석해본다.
1. train data/ test data 나누기
from sklearn.model_selection import train_test_split
train_feature, test_feature, train_target, test_target = train_test_split( data, target, train_size =0.7, random_state=42)
len(train_feature), len(test_feature) # train 데이터 갯수, test 데이터 갯수
여기서 data 에 df["target"]을 제외한 feature 들만 넣어준다.
2. 모델 학습
from sklearn.linear_model import LinearRegression
model = LinearRegression() #클래스 선언
model.fit(train_feature, train_target) #모델 학습
train_pred = model.predict(train_feature) # train_feature 넣었을 때의 예측값
test_pred = model.predict(test_feature) # test_feature 넣었을 때의 예측값
3. 학습한 모델 시각화
fig, axes = plt.subplots(nrows =1, ncols =2, figsize =(10, 5))
preds =[
("Train", train_feature, train_pred),
("Test", test_feature, test_pred)
]
for idx, (name, d, pred) in enumerate(preds):
ax = axes[idx]
ax.scatter(x=d[:,0], y=pred)
ax.axhline(0, color = "red", linestype="--")
ax.axhline(1, color = "red", linestype="--")
ax.set_xlabel("mean_radius")
ax.set_ylabel("predict")
ax.set_title(f"{name}Data")
4. 평가하기.
from sklearn.metrics import auc, roc_curve
fpr, tpr, threshold = roc_curve(train_target, train_pred) # 실제값과 예측값을 넣으면 fpr, tpr, threshold가 나옴
auroc = auc(fpr, tpr) # fpr, tpr 그래프의 아래 면적
plt.plot(fpr, tpr)
plt.xlabel("fpr")
plt.ylabel("tpr")
print(f"AUROC : {auroc:.4f}") # AUROC 계산값 소수점 4째자리까지 출력
fpr, tpr, threshold 는 각각 같은 크기의 행렬로 나오는데,
각각 행렬에서의 같은 위치의 값이 해당 threshold 일 때의 fpr, tpr 이라고 생각하면 된다.
5. Best Threshold 찾기
요덴 index 를 이용해서 threshold 책정.
요덴인덱스 : TPR - FPR 이 Max 가 되는 target의 인덱스값.
J= tpr - fpr
idx = np.argmax(J)
best_thresh = threshold(idx)
plt.plot(fpr, tpr)
plt.plot(np.linspace(0,1,10), np.linspace(0,1,10))
plt.plot((fpr(idx),fpr(idx) ), (fpr(idx),tpr(idx), color= 'red', linestyle = "--")
plt.xlabel("fpr")
plt.ylabel("tpr")

최대가 되는 지점 (빨간 점선)의 threshold 값이 best threshold 이다.
6. 정확도 측정
from sklearn.metrics import accuracy_score
linear_train_accuracy = accuracy_score(train_target, train_pred_label)
linear_test_accuracy = accuracy_score(test_target, test_pred_label)
----------------------------------------------------------------------------------------------------------------------------------------------------
Logistic Regression을 이용한 예측
1. 정규화 (Scaling) : logistic regression 은 exp 함수를 쓴다. 변수들이 정규화/scaling 되어있지 않으면 exp 함수에 넣었을 때, 값이 너무 크면 overflow/ 수렴이 잘 되지 않을 수 있다.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(train_feature)
정규화를 할 때는 모든 데이터를 한번에 학습 (정규화)시키지 않고, train/ test 나눠서 정규화한다.
한번에 학습할 경우 overfitting이 될 수 있다.
학습해서 만들어진 scaler로 train/test 데이터를 변환한다.
scaled_train_feature = scaler.transform(train_feature)
scaled_test_feature = scaler.transform(test_feature)
2. Logistic regression 학습
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(scaled_train_feature, train_target)
3. 모델을 사용해 예측
predict : 어떤 클래스(0/1)에 속할 지 바로 알려줌.
predict_proba : 각 클래스에 속할 확률 알려줌.
train_pred = lr.predict(scaled_train_feature)
test_pred = lr.predict(scaled_test_feature)
train_pred_logit = lr.predict_proba(scaled_train_feature)
test_pred_logit = lr.predict_proba(scaled_test_feature)
4. 모델 평가 : AUROC 계산
AUROC를 계산하기 위해서는 1로 분류될 확률만 필요.
train_pred_logit = train_pred_logit[:, 1]
test_pred_logit = test_pred_logit[:, 1]
from sklearn.metrics import auc, roc_curve
fpr, tpr, threshold = roc_curve(train_target, train_pred_logit)
auroc = auc(fpr, tpr)
5. Best threshold 계산
J = tpr - fpr
idx = np.argmax(J)
best_thresh = threshold[idx]
6. Best threshold 로 예측값 0, 1로 변환 후 정확도 확인.
train_pred_label = list(map(int, (train_pred_logit > best_thresh))) # threshold 조정 후의 예측값
test_pred_label = list(map(int, (test_pred_logit > best_thresh))
proba_train_accuracy = accuracy_score(train_target, train_pred_label) # threshold 조정 후의 accuracy
proba_test_accuracy = accuracy_score(test_target, test_pred_label)
train_accuracy = accuracy_score(train_target, train_pred) # predict_proba로 측정한 accuracy
test_accuracy = accuracy_score(test_target, test_pred)
7. 불균형한 이진 데이터 -> Balanced Accuracy
0/ 1을 분류하는 모델에서, 0에 비해 1이 매우 적은 불균형 데이터의 경우,
1 예측이 틀리더라도 전체 예측 중에 틀린 1 예측의 비중이 굉장히 낮다.
따라서 Accuracy를 뽑아봐도 Accuracy는 높게 나온다 -> 모델을 평가하는 지표로 부족하다.
이런 경우 Balanced Accuracy를 사용.
from sklearn.metrics import balanced_accuracy_score
balanced_accuracy_score(test_target, test_pred)

'파이썬 > 머신러닝' 카테고리의 다른 글
[이진 분류 모델 평가하기] Classification Report (0) | 2022.06.16 |
---|---|
[분류모델] SVM: Support Vector Machine 개념 (0) | 2022.06.06 |
[회귀분석] 05. Logistic Regression 이론 (0) | 2022.06.03 |
[분류모델] 03. Random Forest (0) | 2022.05.30 |
[분류모델] 02. Decision Tree (0) | 2022.05.30 |