PIMA 부족 당뇨병 질환 발생 데이터
1. 해당 데이터를 가져오겠습니다.
PIMA_url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/refs/heads/master/dataset/diabetes.csv'
PIMA = pd.read_csv(PIMA_url)
PIMA.head()
확인 결과 해당 컬럼과 값들을 확인 할 수 있었습니다.
2. 결측치 확인을 하기 위해 해당 값들 중 0인 값이 있는지 확인해보겠습니다.
(PIMA == 0).astype(int).sum()
# 0인 값들의 개수를 세기 위해 0인 값들을 더해줍니다.
여기서 PIMA == 0을 설정하면 True로 바뀌게 될 것이고 해당 값을 int형으로 바꿔주면 1이 될 것입니다. 그 상태에서 sum을 사용하여 더해주면 0의 개수가 세어질 것입니다.
확인 결과 여기서 혈압이 0인 값이 35개 정도 보이며 혈압, BMI, 포도당, 피하지방 측정값이 0인 것은 이상합니다.
즉, 해당 값들이 결측치 인것같습니다.
3. 이제 결측치가 확인되는 컬럼을 따로 빼주고 0인 값들은 해당 컬럼값들의 평균으로 교체 해주도록 하겠습니다.
zero_features = ['Glucose', 'BloodPressure', 'SkinThickness', 'BMI'] # 결측치 값들을 따로 모아놓음
PIMA[zero_features]=PIMA[zero_features].replace(0, PIMA[zero_features].mean())
(PIMA[zero_features] == 0).astype(int).sum()
값을 교체하기 위해 replace함수를 사용하였습니다.
결측치가 제대로 교체 됬는지 확인결과 모두 0으로 확인되었습니다.
4. X(Features), y(Label)을 구분하고 테스트세트와 훈련세트로 나누어 주겠습니다.
from sklearn.model_selection import train_test_split
X = PIMA.drop('Outcome', axis=1)
y = PIMA['Outcome']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=13)
5. Pipeline을 통해 작업을 묶어주고 모델은 로지스틱회귀를 사용해보겠습니다.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
estimators = [
('scaler', StandardScaler()),
('clf', LogisticRegression(solver='liblinear', random_state=13))
]
pipe_lr = Pipeline(estimators)
pipe_lr.fit(X_train, y_train)
pred = pipe_lr.predict(X_test)
마무리로 pred 변수에 학습 결과를 저장해놓았습니다.
6. Accuracy, Precision, recall, f1 score와 confusion metrix를 통해 모델 성능 결과를 확인 해보겠습니다.
from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix, f1_score
print('accuracy : {:.2f}'.format(accuracy_score(y_test, pred)))
print('precision_score : {:.2f}'.format(precision_score(y_test, pred)))
print('recall_score : {:.2f}'.format(recall_score(y_test, pred)))
print('F1 score : {:.2f}'.format(f1_score(y_test, pred)))
print(confusion_matrix(y_test, pred))
# 0인데 0으로 맞춘것: 89, 0인데 1이라 틀린 것: 8
# 1인데 0이라 틀린것: 26, 1인데 1이라 맞춘 것: 31
우선 confusion metrix는 제 블로그 분류모델평가에서 설명했던 TP, FP, TN, FN의 확률이 아닌 개수가 출력 됩니다.
로지스틱 회귀에 대한 모델 성능 지표 결과를 자세하게 설명하겠습니다.
1. Accuracy (정확도): 0.78
- 정확도는 전체 예측 중에서 맞게 예측한 비율을 나타냅니다.
- 0.78이라는 값은 모델이 전체 샘플 중 78%를 올바르게 예측했다는 의미입니다.
2. Precision (정밀도): 0.79
- 정밀도는 모델이 양성(Positive)으로 예측한 값 중에서 실제 양성인 비율입니다.
- 0.79라는 값은 양성으로 예측한 것들 중 79%가 실제로 맞았다는 의미입니다. 즉, False Positive(잘못된 양성 예측)를 줄이는 것이 중요한 경우, 정밀도가 높은 것이 좋습니다.
3. Recall (재현율): 0.54
- 재현율은 실제 양성인 것 중에서 모델이 양성으로 예측한 비율을 나타냅니다.
- 0.54라는 값은 실제 양성인 것 중 54%만 양성으로 정확히 예측했다는 의미입니다. 재현율이 낮으면 False Negative(잘못된 음성 예측)가 많다는 뜻입니다. 즉, 놓치는 양성 사례가 많다는 것을 나타냅니다.
4. F1 Score: 0.65
- F1 스코어는 정밀도와 재현율 간의 조화 평균입니다.
- 0.65라는 값은 정밀도와 재현율의 균형을 보여주며, 두 값이 큰 차이가 날 때 이를 조정하여 전반적인 성능을 평가하는 데 유용합니다.
- F1 스코어가 낮다는 것은 정밀도나 재현율 중 하나가 특히 낮아 모델의 성능에 불균형이 있음을 시사합니다.
요약:
- 모델의 정확도는 78%로 비교적 괜찮지만, 재현율이 낮아 54%의 실제 양성 샘플만 올바르게 예측했습니다. 정밀도는 79%로 높은 편이지만, 양성 클래스에 대한 전반적인 성능을 고려했을 때 F1 스코어가 0.65로, 모델이 균형 있게 양성과 음성을 잘 예측하지 못하고 있음을 나타냅니다.
7. 각 Feature마다 몇 정도의 중요성을 가지고 있는지 시각화해보겠습니다.
coeff = list(pipe_lr['clf'].coef_[0]) # 계수값
labels = list(X_train.columns) # 컬럼
# 중요한 feature를 알아보기 위한 그래프이다.
features = pd.DataFrame({'Features': labels, 'Importance': coeff})
features.sort_values(by=['Importance'], ascending=True, inplace=True)
features['Positive'] = features['Importance'] > 0
features.set_index('Features', inplace=True)
features['Importance'].plot(kind='barh', figsize=(8,5), color=features['Positive'].map({True: 'blue', False: 'red'}))
coeff 변수는 모델이 학습한 계수(가중치)를 나타냅니다. 각 계수는 대응하는 Feature가 예측 결과에 얼마나 영향을 미치는지를 나타냅니다. 즉, Featrue의 중요도를 말합니다.
1. 뽑아낸 coeff와 labels로 DataFrame을 만들어줍니다.
2. 그래프로 출력하였을 때 내림차순으로 정렬되도록 만들어줍니다.
3. 이제 coeff에 있는 값이 양수일 경우 Positive라는 컬럼에 True라고 넣어줍니다.(그래프에서 음수 일 경우 다른 색을 넣기 위함입니다.)
4. 마지막으로 그래프를 그려줍니다.
위의 사진과 같은 모습이 확인되고 Glucose 컬럼이 제일 영향이 많은 컬럼으로 확인 되었습니다.
이상으로 로지스틱 회귀 설명을 마치겠습니다.
이 글은 제로베이스 데이터 분석 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.
'Data Analyst > ML' 카테고리의 다른 글
[Zero-base] Cross Validation(교차 검증) - 2 (0) | 2024.10.04 |
---|---|
[Zero-base] Cross Validation(교차 검증) - 1 (0) | 2024.10.04 |
[Zero-base] Logistic Regression - 1 (1) | 2024.10.03 |
[Zero-base] Pipeline (0) | 2024.10.03 |
[Zero-base] Scaling & 분류 모델 평가 (1) | 2024.10.03 |