이진분류 평가지표¶
In [ ]:
# 머신러닝 예시 코드
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
# train
train = pd.DataFrame({
'f1': [2, 3, 5, 7, 11, 13, 17, 19, 23, 29],
'f2': [30, 28, 26, 24, 22, 20, 18, 16, 14, 12],
'target': ['A', 'A', 'A', 'B', 'B', 'A', 'A', 'A', 'A', 'B']
})
# test
test = pd.DataFrame({
'f1': [7, 9, 15],
'f2': [23, 18, 26]
})
# target 데이터 분리
target = train.pop('target')
# 머신러닝 학습 및 예측
clf = RandomForestClassifier(random_state=0)
clf.fit(train, target)
pred = clf.predict(test)
print(pred)
In [ ]:
# 머신러닝 예시 코드(predict)
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
train = pd.DataFrame({
'f1': [2, 3, 5, 7, 11, 13, 17, 19, 23, 29],
'f2': [30, 28, 26, 24, 22, 20, 18, 16, 14, 12],
'target': ['A', 'A', 'A', 'B', 'B', 'A', 'A', 'A', 'A', 'B']
})
# 검증 데이터 분리
target = train.pop('target')
X_train, X_val, y_train, y_val = train_test_split(train, target, test_size=0.3, random_state=0)
# 머신러닝 학습 및 예측
clf = RandomForestClassifier(random_state=0)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_val)
print("val:", y_pred) # 예측값
print("정확도:", accuracy_score(y_val, y_pred)) # 정확도 평가
# test
test = pd.DataFrame({
'f1': [7, 9, 15],
'f2': [23, 18, 26]
})
pred = clf.predict(test)
print("test:", pred)
val: ['A' 'A' 'A'] 정확도: 0.6666666666666666 test: ['B' 'A' 'A']
In [ ]:
# 이진분류 데이터
import pandas as pd
y_true = pd.DataFrame([0, 1, 1, 0, 0, 1, 1, 1, 1, 0]) #실제값
y_pred = pd.DataFrame([0, 0, 1, 1, 0, 0, 0, 1, 1, 0]) #예측값
y_true_str = pd.DataFrame(['B', 'A', 'A', 'B', 'B', 'A', 'A', 'A', 'A', 'B']) #실제값
y_pred_str = pd.DataFrame(['B', 'B', 'A', 'A', 'B', 'B', 'B', 'A', 'A', 'B']) #예측값
In [ ]:
# 정확도(Accuracy)
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_true, y_pred)
print("정확도:", accuracy)
accuracy = accuracy_score(y_true_str, y_pred_str)
print("정확도:", accuracy)
In [ ]:
# F1 스코어(F1 Score) ***
from sklearn.metrics import f1_score
f1 = f1_score(y_true, y_pred)
print("F1 스코어:", f1)
f1 = f1_score(y_true_str, y_pred_str, pos_label='A')
# 타겟이 문자일때 pos_label사용 / pos_label = positive label
print("F1 스코어:", f1)
In [ ]:
# 머신러닝 예시 코드(predict_proba)
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
df = pd.DataFrame({
'f1': [2, 3, 5, 7, 11, 13, 17, 19, 23, 29],
'f2': [30, 28, 26, 24, 22, 20, 18, 16, 14, 12],
'target': ['A', 'A', 'A', 'B', 'B', 'A', 'A', 'A', 'A', 'B']
})
target = df.pop('target')
X_train, X_val, y_train, y_val = train_test_split(df, target, test_size=0.5, random_state=0)
clf = RandomForestClassifier(random_state=42)
clf.fit(X_train, y_train)
y_pred = clf.predict_proba(X_val)
print(y_pred) # 예측값
roc_auc_score(y_val, y_pred[:,1]) # 정확도 평가
[[0.32 0.68] [1. 0. ] [0.75 0.25] [1. 0. ] [0.74 0.26]]
Out[ ]:
0.25
In [ ]:
# ROC-AUC ***
from sklearn.metrics import roc_auc_score
import numpy as np
# 실제값 (0: 음성, 1: 양성)
y_true = pd.DataFrame([0, 1, 0, 1, 1, 0, 0, 0, 1, 1])
# 예측값 중 양성(1) 확률
y_pred_proba = np.array([
[0.8, 0.2],
[0.1, 0.9],
[0.77, 0.23],
[0.6, 0.4],
[0.2, 0.8],
[0.4, 0.6],
[0.6, 0.4],
[0.8, 0.2],
[0.3, 0.7],
[0.4, 0.6]
])
roc_auc = roc_auc_score(y_true, y_pred_proba[:,1])
print("ROC-AUC:", roc_auc)
In [ ]:
y_true_str = pd.DataFrame(['B', 'A', 'A', 'B', 'B', 'A', 'A', 'A', 'A', 'B']) #실제값
y_pred_proba_str = np.array([
[0.8, 0.2],
[0.1, 0.9],
[0.77, 0.23],
[0.6, 0.4],
[0.2, 0.8],
[0.4, 0.6],
[0.6, 0.4],
[0.8, 0.2],
[0.3, 0.7],
[0.4, 0.6]
]) # 예측값
roc_auc = roc_auc_score(y_true, y_pred_proba_str[:,1])
print("ROC-AUC:", roc_auc)
다중분류 평가지표¶
In [ ]:
# 다중분류 데이터
y_true = pd.DataFrame([2, 2, 3, 3, 2, 1, 3, 3, 2, 1]) # 실제값
y_pred = pd.DataFrame([2, 2, 1, 3, 2, 1, 1, 2, 2, 1]) # 예측값
y_true_str = pd.DataFrame(['B', 'B', 'C', 'C', 'B', 'A', 'C', 'C', 'B', 'A']) # 실제값
y_pred_str = pd.DataFrame(['B', 'B', 'A', 'C', 'B', 'A', 'A', 'B', 'B', 'A']) # 예측값
In [ ]:
# 정확도(Accuracy)
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_true, y_pred)
print("정확도:", accuracy)
accuracy = accuracy_score(y_true_str, y_pred_str)
print("정확도:", accuracy)
정확도: 0.7 정확도: 0.7
In [ ]:
# F1 스코어(F1 Score) ***
from sklearn.metrics import f1_score # 다중분류일때 다르점있음
f1 = f1_score(y_true, y_pred, average='macro') # average= micro, macro, weighted
print("F1 스코어:", f1) # 문제에서 요구하는 대로
f1 = f1_score(y_true_str, y_pred_str, average='macro') # 숫자와 문자의 차이는 없음
print("F1 스코어:", f1)
F1 스코어: 0.6518518518518519 F1 스코어: 0.6518518518518519
In [ ]:
# 다중분류 데이터(확률값) (심화학습 , 여유가 될때)
y_true = pd.DataFrame([0, 1, 2, 0, 1]) # 실제값
y_pred_proba = pd.DataFrame([[0.2, 0.5, 0.3], [0.7, 0.2, 0.1], [0.4, 0.3, 0.3], [0.4, 0.1, 0.5], [0.1, 0.8, 0.1]], columns=[0, 1, 2]) # 예측값(각 클래스 확률)
In [ ]:
y_pred_proba
Out[ ]:
0 | 1 | 2 | |
---|---|---|---|
0 | 0.2 | 0.5 | 0.3 |
1 | 0.7 | 0.2 | 0.1 |
2 | 0.4 | 0.3 | 0.3 |
3 | 0.4 | 0.1 | 0.5 |
4 | 0.1 | 0.8 | 0.1 |
In [ ]:
# 원핫인코딩 - 숫자는 자동으로 원핫인코딩 되지 않음 -> 컬럼지정
pd.get_dummies(y_true[0])
Out[ ]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1 | 0 | 0 |
1 | 0 | 1 | 0 |
2 | 0 | 0 | 1 |
3 | 1 | 0 | 0 |
4 | 0 | 1 | 0 |
In [ ]:
from sklearn.metrics import roc_auc_score
# 실제값이 예측값형태와 같은지 확인 -> 다르면 인코딩으로 변경
# 수치형일 때는 자동으로 원핫인코딩에서 제외함. 컬럼 지정 필요
y_true_onehot = pd.get_dummies(y_true[0])
# 인코딩된 순서와 확률 컬럼 순서가 같인지 확인
print("y_true의 원-핫 인코딩된 컬럼 순서:", y_true_onehot.columns)
print("y_pred_proba의 컬럼 순서:", y_pred_proba.columns)
# 'ovo' 방식 - 하이퍼파라미터
roc_score_ovo = roc_auc_score(y_true_onehot, y_pred_proba, multi_class='ovo')
print("ROC AUC (OvO):", roc_score_ovo)
# 'ovr' 방식
roc_score_ovr = roc_auc_score(y_true_onehot, y_pred_proba, multi_class='ovr')
print("ROC AUC (OvR):", roc_score_ovr)
y_true의 원-핫 인코딩된 컬럼 순서: Int64Index([0, 1, 2], dtype='int64') y_pred_proba의 컬럼 순서: Int64Index([0, 1, 2], dtype='int64') ROC AUC (OvO): 0.5694444444444445 ROC AUC (OvR): 0.5694444444444445
In [ ]:
# 다중분류 데이터(확률값)
y_true_str = pd.DataFrame(['A', 'B', 'C', 'A', 'B']) # 실제값
y_pred_proba = pd.DataFrame([[0.2, 0.5, 0.3], [0.7, 0.2, 0.1], [0.4, 0.3, 0.3], [0.4, 0.1, 0.5], [0.1, 0.8, 0.1]], columns=['A', 'B', 'C']) # 예측값(각 클래스 확률)
from sklearn.metrics import roc_auc_score
# 원핫인코딩
y_true_onehot = pd.get_dummies(y_true_str)
# 인코딩된 순서와 확률 컬럼 순서가 같인지 확인
print("y_true의 원-핫 인코딩된 컬럼 순서:", y_true_onehot.columns)
print("y_pred_proba의 컬럼 순서:", y_pred_proba.columns)
# 'ovo' 방식
roc_score_ovo = roc_auc_score(y_true_onehot, y_pred_proba, multi_class='ovo')
print("ROC AUC (OvO):", roc_score_ovo)
# 'ovr' 방식
roc_score_ovr = roc_auc_score(y_true_onehot, y_pred_proba, multi_class='ovr')
print("ROC AUC (OvR):", roc_score_ovr)
참고1(다중분류 확률의 컬럼명)¶
- pred_proba의 결과값이 배열 형태로 되어있어 컬럼명이 없음
- 확인하는 방법은 model.classes_ (아래 코드 참고)
In [ ]:
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# 예제 데이터 생성
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, n_classes=3, random_state=0)
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
# RandomForestClassifier 모델 생성 및 훈련
rf = RandomForestClassifier(random_state=0)
rf.fit(X_train, y_train)
# 검증 데이터에 대한 클래스 확률 예측
pred_proba = rf.predict_proba(X_val)
pred_proba
# 클래스 확률 출력
print(pred_proba[:3])
# 훈련 데이터에 있는 클래스 레이블의 순서 출력
print("클래스 레이블의 순서:", rf.classes_)
[[0.07 0.35 0.58] [0.11 0.58 0.31] [0.45 0.33 0.22]] 클래스 레이블의 순서: [0 1 2]
참고2(다중분류 확률값을 데이터프레임으로 만들기)¶
- 예측한 결과를 제출용 파일로 만든다면, 각 클래스에 대한 확률을 각각의 컬럼으로 만들어야 함
- 예를 들어, 클래스가 A, B, C 세 가지라면 A에 대한 확률, B에 대한 확률, C에 대한 확률을 각각의 컬럼으로 만들어야 함
In [ ]:
# 각 클래스의 확률을 데이터프레임의 컬럼으로 만들기
# 참고1을 실행한 뒤에 실행해주세요:)
import pandas as pd
pred_proba = rf.predict_proba(X_val)
result_df = pd.DataFrame()
result_df['A'] = pred_proba[:, 0]
result_df['B'] = pred_proba[:, 1]
result_df['C'] = pred_proba[:, 2]
result_df.head(3)
Out[ ]:
A | B | C | |
---|---|---|---|
0 | 0.07 | 0.35 | 0.58 |
1 | 0.11 | 0.58 | 0.31 |
2 | 0.45 | 0.33 | 0.22 |
회귀 평가지표¶
In [ ]:
# 회귀 데이터
import pandas as pd
y_true = pd.DataFrame([0, 2, 5, 2, 4, 4, 7, 10]) # 실제값
y_pred = pd.DataFrame([1.14, 2.53, 4.87, 3.08, 4.21, 5.53, 7.51, 10.32]) # 예측값
In [ ]:
# MSE(Mean Squared Error)
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_true, y_pred)
print("MSE:", mse)
MSE: 0.6889125
In [ ]:
# MAE(Mean Absolute Error)
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(y_true, y_pred)
print("MAE:", mae)
MAE: 0.68125
In [ ]:
# 결정 계수(R-squared) ***
from sklearn.metrics import r2_score
r2 = r2_score(y_true, y_pred)
print("결정 계수:", r2)
결정 계수: 0.9207007194244604
In [ ]:
# RMSE(Root Mean Squared Error) ***
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_true, y_pred)
rmse = mse ** 0.5
print("RMSE:", rmse)
RMSE: 0.830007530086324
In [ ]:
'빅데이터 분석 기사 공부' 카테고리의 다른 글
작업형3 범주형 데이터 분석 (0) | 2023.11.08 |
---|---|
작업형3 가설검정 (0) | 2023.11.08 |
작업형2 모의문제3 (0) | 2023.11.06 |
작업형2 모의문제2 (0) | 2023.11.06 |
작업형2 모의문제1 (0) | 2023.11.06 |