우선 데이터를 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)

+ Recent posts