import pandas as pd
titanic_df = pd.read_csv('C:/Users/82109/OneDrive/문서/ML/titanic/train.csv', encoding='utf-8')
titanic_df.head(3)
- 변수 설명
- PassengerId: 승객 식별자(Primary Key)
- Survival : 사망(0) 생존(1)
- Pclass: 티켓 등급(1,2,3 등급)
- Name: 이름
- Sex: 성별
- Age: 나이
- SibSp: 승객의 형제와 배우자 수
- Parch: 승객의 부모님과 자식 수
- Ticket: 티켓 번호
- Fare: 요금
- Cabin: 객실 이름
- Embarked: 승선한 항구 C(Cherbourg), Q(Queenstown), S(Southampton)
✳️ 로지스틱회귀 실습
💟 자주 쓰는 함수
- sklearn.linear_model.LogisticRegression : 로지스틱회귀 모델 클래스
- 속성
- classes_ : 클래스(Y)의 종류
- n_features_in_ : 들어간 독립변수(X) 개수
- feature_names_in_ : 들어간 독립변수(X)의 이름
- coef_ : 가중치
- intercept_ : 바이어스
- 메소드
- fit : 데이터 학습
- predict : 데이터 예측
- predict_proba : 데이터가 Y = 1일 확률을 예측
- 속성
- sklearn.metrics.accuracy : 정확도
- sklearn.metrics.f1_socre : f1_score
1️⃣ 데이터 확인
titanic_df.head(3)
- 숫자형 데이터
: Age, SibSp, Parch, Fare - 범주형 데이터
: Pclass, Sex, Cabin, Embarked - X변수 1개, Y변수(Survived)
titanic_df.info()
Age와 Cabin, Embarked 컬럼에 결측치 존재
2️⃣ 데이터 확인
🤖 1차 모델 : Fare 이용
- 변수 지정
# X변수 : Fare
# Y변수 : Survived
X_1 = titanic_df[['Fare']]
y_true = titanic_df[['Survived']]
- Fare 데이터 확인하기
# 산점도로 데이터 확인하기
sns.scatterplot(titanic_df, x = 'Fare', y = 'Survived')
- Fare 데이터들이 뒷쪽에 몰려있을 것이라 생각했지만 경기도 오산,
- 현재는 데이터 전처리도 되어있지 않음
- 이렇게 바로 산점도를 보는 것보다, X변수로 지정해 놓은 데이터에 대해 히스토그램으로 분포를 보는 것이 좋다.
# 히스토그램으로 Fare의 분포 확인
sns.histplot(titanic_df, x = 'Fare')
- 기술 통계 확인
# 기술통계(수치형)
titanic_df.describe()
- 평균 요금은 32달러 정도
- 중위값은 14달러 정도
- 히스토그램을 통해 최빈값은 14달러 이하임을 알 수 있고 표준편차는 49달러로 굉장히 크다.
3️⃣ 모델 수립과 모델 평가
- 모델 수립 및 훈련
from sklearn.linear_model import LogisticRegression
# 모델 설계도 불러오기
model_lor = LogisticRegression()
로지스틱회귀를 이용하기 위해 LogisticRegression을 불러왔다.
# 훈련
model_lor.fit(X_1, y_true)
훈련이 잘 되어진 것을 확인했다.
# sklearn.linear_model.LogisticRegression 클래스의 속성에 대해 한 번에 출력해주는 함수 제작
def get_att(x):
# x에는 모델을 넣기
print('클래스 종류', x.classes_)
print('독립변수 개수', x.n_features_in_)
print('들어간 독립변수(x)의 이름', x.feature_names_in_)
print('가중치', x.coef_)
print('바이어스', x.intercept_)
get_att(model_lor)
추가로 클래스 내의 attribute에 해당되는 내용들을 출력해서 보기 위해 함수를 짜서 출력해보았다.
- 예측
# 예측
y_pred_1 = model_lor.predict(X_1)
- 모델 평가
# 평가를 위한 함수 제작
from sklearn.metrics import accuracy_score, f1_score
def get_metrics(true, pred):
print('정확도', accuracy_score(true, pred))
print('f1-score', f1_score(true, pred))
get_metrics(y_true, y_pred_1)
- 정확도는 나름 높지만 f1-score는 높지 않다.
- 그다지 좋은 모델은 아닌 것으로 여겨진다.
✳️ 다중로지스틱회귀 실습
* 전처리 과정이 제일 복잡하지 않는 경우로 실습하는 중
1️⃣ 데이터 처리
# 성별 인코딩 Female = 0 , Male = 1
def get_sex(x):
if x == 'female':
return 0
else:
return 1
titanic_df['Sex_en'] = titanic_df['Sex'].apply(get_sex)
titanic_df.head(3)
성별의 데이터를 남자는 1, 여자는 0이 되도록 인코딩해주고 컬럼을 추가하여 데이터 프레임에 나타내었다.
2️⃣ 모델 수립과 모델 평가
🤖 2차 모델 : Pclass, Sex, Fare 이용
X_2 = titanic_df[['Pclass', 'Sex_en', 'Fare']]
y_true = titanic_df[['Survived']]
- 모델 수립 및 훈련
# 모델 설계도 가져오기
model_lor_2 = LogisticRegression()
# 학습
model_lor_2.fit(X_2, y_true)
get_att(model_lor_2)
클래스 내의 attribute에 해당되는 내용들을 출력해서 보기 위해 함수를 짜서 출력
- 예측
# 예측
y_pred_2 = model_lor_2.predict(X_2)
- 모델 평가
# 모델 평가
get_metrics(y_true, y_pred_2)
- 정확도가 올라감
- f1-score도 많이 올라감
- 좋은 모델로 평가 받을 수 있음
✏️ 추가 - 확률 확인
# 각 데이터별 Y=1인 확률 뽑아내기(생존할 확률)
model_lor_2.predict_proba(X_2)
# 아까 예측한 사망여부 데이터
y_pred_2[:10]
- 결과를 보면 사망할 확률, 생존할 확률을 보여줌
- 예측한 사망여부 데이터가 생존확률을 계산한 걸 토대로 임계값이 0.5 기준으로 판별을 내린 것
- 그래서 예측한 사망여부 데이터의 첫 값인 0은 생존 확률을 봤을 때 죽을 확률이 0.8, 생존 확률이 0.1이라 죽을 확률이 더 높으므로 사망처리
'📒 Today I Learn > 🤖 Machine Learning' 카테고리의 다른 글
[머신러닝 심화] 분류와 회귀 모델링 심화 이론 (0) | 2024.08.13 |
---|---|
[머신러닝 심화] 프로세스 적용 실습 (0) | 2024.08.13 |
[머신러닝 기초] 로지스틱회귀(분류 분석) 이론 (0) | 2024.08.12 |
[머신러닝 기초] 선형회귀 정리 (0) | 2024.08.09 |
[머신러닝 기초] 다중선형회귀 실습 (0) | 2024.08.09 |