이번 주는 머신러닝을 배운다.
머신러닝은 많이 해봤지만, 그래도 새롭게 알게 되거나, 개념을 더 자세히 알게 되거나, 잊고 있던 것을 상기시킬 수 있어서 좋다.
머신러닝
변수들에 NaN이 있는지 확인
df.isna().sum()
변수에 NaN이 포함된 행 제거
df.dropna(subset=['a'], axis=0, inplace=True) #axis=0을 해줘야 행이 제거
df.dropna(여러개의 열 리스트, axis=0, inplace=True)
NaN값 처리하기
앞/뒤 값으로 채우기 (시계열에서 많이 사용)
- method='ffill': 바로 앞의 값으로 채우기
- method='bfill': 바로 뒤의 값으로 채우기
df['a'].fillna(method='ffill', inplace=True)
선형 보간법으로 채우기
df['a'].interpolate(method='linear', inplace=True)
가변수화
범주형 변수에 One-Hot Encoding을 해서 여러 개의 변수를 만든다.
이는 값들을 독립적으로 만들어준다.
다중공선성 문제를 없애기 위해 drop_first=True 옵션을 지정해준다.
이는 첫 번째 열은 사용하지 않게 해 준다.
예) 성별이 남/녀가 있다면 여자만 출력 (남자가 없어도 여자의 값이 0이면 남자라고 추측할 수 있으니까)
df = pd.get_dummies(df, columns=가변수화를 진행할 열들의 리스트, drop_first=True)
분류와 회귀
회귀는 연속적인 숫자를 예측하는 것이고, 분류는 범주값을 예측하는 것이다.
열은 특성(feature), 변수라고도 부르고, 행은 관측치라고도 부른다.
X: features - 독립변수
Y: target - 종속변수
상관관계 시각화 (히트맵)
sns.heatmap(df.corr(),
annot=True, #상관계수 표시
cmap='Blues', #색상
fmt='.2f', #소수 두째자리까지
cbar=False, #칼라 바
square = True, #정사각형
annot_kws={'size':8}) #글자크기
학습용, 평가용 데이터 분리
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2, random_state=1, shuffle=True, stratify=y)
random_state는 값이 고정되어 반복해서 실행해도 같은 값이 나온다.
x가 80%, y가 20% 랜덤 하게 섞인다.
shuffle=True는 무작위로 섞는다.
stratify=y를 써주면 성능이 좋아지는 경우가 있다. Y의 분포 비율을 맞춰준다. 분류만 가능
회귀와 분류 모델 평가
분류 모델 평가는 정확도를 높이는 게 중점 – 정확도로 평가
회귀 모델 평가는 오차를 줄이는 게 중점 – 오차로 평가
< 회귀 평가 지표 (오차) >
오자 제곱(SSE)의 합을 구한 후 평균을 구함 – MSE(mean squared error)
MSE에서 루트 씌어준 애 – RMSE (root mean squared error)
오차 절댓값의 합을 구한 후 평균을 구함 – MAE(mean absolute error)
위 세 개의 값이 작을수록 모델 성능이 좋은 것이다.
결정계수 R^2 : 오차의 비이다. 전체 오차 중에서 회귀식이 잡아낸 오차 비율
R^2 = 1 이면 MSE=0인 것과 같다. 데이터를 완벽하게 학습한 것!
R^2는 일반적으로 0~1의 값인데 1에 가까워질수록 좋다.
MAE(mean absolute error)
from sklearn.metrics import mean_absolute_error
print('MAE:', mean_absolute_error(y_test, y_pred))
MSE(mean squared error)
from sklearn.metrics import mean_squared_error
print('MSE:', mean_squared_error(y_test, y_pred))
RMSE (root mean squared error)
from sklearn.metrics import mean_squared_error
print('MSE:', mean_squared_error(y_test, y_pred)**(1/2))
# print('MSE:', mean_squared_error(y_test, y_pred, squared=False)) 이것도 가능
결정계수 R^2
from sklearn.metrics import r2_score
print('R2:', r2_score(y_test, y_pred))
회귀에서 score을 해주면 R^2의 값이 나온다.
회귀에서 R^2는 꼭 확인해보는 게 좋다.
print(model.score(x_test,y_test))
< 분류 성능 평가 지표 (정확도) >
정확도 accuracy는양성(1)과 음성(0)을 정확히 예측한 비율
정밀도 precision는양성(1)이라 예측한 것 중에서 실제 양성(1)인 비율
재현율 recall는실제 양성(1)인 것을 양성(1)이라고 예측한 비율
F1-score : 정밀도와 재현율의 조화 평균
Confusion Matrix : 혼동 행렬(오분류표)
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, y_pred))
Accuracy
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred))
분류에서 score을 해주면 정확도와 같은 값이 나온다.
print(model.score(x_test, y_test))
Precision
from sklearn.metrics import precision_score
print(precision_score(y_test, y_pred)) #이진 분류이다. 기본값인 average=binary으로 1만 보여준다.
print(precision_score(y_test, y_pred, average=None)) #보통 이걸 쓴다.(오류 방지) 각각의(0,1) 평균을 그대로 다 구한다.
print(precision_score(y_test, y_pred, average='weighted')) # 가중치 평균, average=’macro’는 각각 합의 평균
Recall
from sklearn.metrics import recall_score
print(recall_score(y_test, y_pred, average=None))
F1-Score
from sklearn.metrics import f1_score
print(f1_score(y_test, y_pred, average=None))
정밀도와 재현율이 비슷할 수록 F1 score도 높아진다. f1-score의 값이 커질수록 좋다고 볼 수 있다.
Classification Report 분류 보고서
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))
분류와 회귀에 사용해야 하는 성능 평가 지표가 다르다는 것을 처음 알았다.
그냥 모르고 사용하고 있었다. 앞으로는 분류에 맞는, 회귀에 맞는 성능 평가 지표를 써야겠다.
다양한 평가 지표의 사용법과 개념을 알아서 기쁘다.
'kt aivle' 카테고리의 다른 글
kt_aivle7_웹크롤링 (0) | 2023.08.29 |
---|---|
kt_aivle6_클래스 (1) | 2023.08.28 |
kt_aivle5 (0) | 2023.08.19 |
kt_aivle4 (0) | 2023.08.18 |
kt_aivle3 (0) | 2023.08.11 |