TIL 21. 머신러닝 - 타이타닉
sns.countplot(data = train, x = "Survived")
정규화 => 숫자 스케일의 차이가 클 때 값을 정규분포로 만들어 주거나 스케일 값을 변경해 주는 것
이상치 => 이상치를 제거하거나 대체
대체 => 결측치를 다른 값으로 대체
인코딩 => 호칭, 탑승지의 위치, 문자 데이터를 수치화, 너무 범위가 큰 수치 데이터를 구간화 해서 인코딩
(실제값 == 예측값) => 평균(올바르게 예측한 샘플 개수 / 전체 샘플 개수) => Accuracy
로그 그래프에서 이진로그, 자연로그, 상용로그의 공통점
1) x가 1 일 때 y는 0이다.
2) x 는 0보다 큰 값을 갖는다.
3) x가 1보다 작을 때 y값이 마이너스 무한대로 수렴한다
Q 프로젝트 등을 할 때 지니불순도 등을 참고하게 되나요?
=> A 캐글이나 데이콘 등에 제출하기 전에 시각화를 해보고 그 모델이 얼마나 잘 나뉘었는지 여러가지로 평가해 볼 수 있는데 이 때 함께 참고해 볼 수 있다. 이 때 함께 참고해 볼 수 있는 것은 피처 중요도, 교차검증(cross validation) 값 등을 참고
Q 지니계수와 엔트로피가 노드의 성능을 평가하는 지표라고 이해했는데, 현실적으로 이 두 지표는 어떻게 사용되나요?
=> 0에 가까운지를 본다. 지니 불순도는 0.5일 때 가장 값이 많이 섞여있는 상태이며, 엔트로피는 np.log2(클래스 개수) 값과 같을 때가 가장 많이 섞여있는 상태로 보면 된다. 0에 가까운지를 보면 되고, 트리를 보게 되면 트리 아래로 갈 수록 0에 가까워진다. 지니 불순도나 엔트로피가 0이 되면 트리 분할을 멈춘다.
캐글에 있는 타이타닉 데이터셋을 이용한 실습
Kaggle URL: https://www.kaggle.com/competitions/titanic
Titanic - Machine Learning from Disaster | Kaggle
www.kaggle.com
# 데이터 분석을 위한 pandas, 수치계산을 위한 numpy
# 시각화를 위한 seaborn, matplotlib.pyplot 을 로드합니다.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
실습에 필요한 데이터셋 로드, 위 링크에서 다운받을 수 있습니다.
# 각각 train과 test에 저장
train = pd.read_csv("data/titanic/train.csv",index_col = "PassengerId")
test = pd.read_csv("data/titanic/test.csv",index_col = "PassengerId")
구하고자 하는건 생존여부를 예측하는것 따라서 Lable은 'Survived'
시각화를 통해 lable값의 빈도수를 확인
sns.countplot(data = train, x = "Survived")
결측치 확인
train.isnull().mean() * 100
test.isnull().mean() * 100
정답값이자 예측해야될 값인 'Survived'를 label_name이라는 변수에 저장하겠습니다.
label_name = "Survived"
다음은 학습, 예측에 사용할 컬럼명들만 가져오겠습니다.
# feature_names 라는 변수에 학습과 예측에 사용할 컬럼명을 가져옵니다.
# 수치데이터만 가져온 이유 => 머신러닝 내부에서 연산을 할 수 없기 때문
train.select_dtypes(include = "number").columns # 수치데이터만 가져오기
Index(['Survived', 'Pclass', 'Age', 'SibSp', 'Parch', 'Fare'], dtype='object')
성별은 중요한 역할을 하는데 문자로 되어있으면 머신러닝 내부에서
연산을 할 수 없기 때문에 수치 데이터로 변환하는 인코딩 작업을 수행합니다.
binary encoding 이라고도 불립니다.
train["Gender"] = train["Sex"] == "female"
test["Gender"] = test["Sex"] == "female"
# 각각의 데이터가 제대로 인코딩이 되어있는지 확인해 보기 위해서
display(train["Gender"].head(2))
display(test["Gender"].head(2))
feature_names에 저장
feature_names = ['Pclass', 'Age', 'SibSp', 'Parch', 'Fare',"Gender"]
학습, 예측 데이터셋을 만들고 아까 확인한 결측치도 0으로 채우도록 하겠습니다.
- X_train : feature_names 에 해당되는 컬럼만 train에서 가져옵니다.
- 학습(훈련)에 사용할 데이터셋 예) 시험의 기출문제
- X_test : feature_names 에 해당되는 컬럼만 test에서 가져옵니다.
- 예측에 사용할 데이터셋 예) 실전 시험문제
- y_train : label_name 에 해당 되는 컬럼만 train에서 가져옵니다.
- 학습(훈련)에 사용할 정답 값 예) 기출문제의 정답
# X_train : feature_names 에 해당되는 컬럼만 train에서 가져옵니다.
# 학습(훈련)에 사용할 데이터셋 예) 시험의 기출문제
# 결측치도 채워줌
X_train = train[feature_names].fillna(0)
print(X_train.shape)
print("결측치 합계 : ", X_train.isnull().sum().sum())
X_train.head()
# X_test : feature_names 에 해당되는 컬럼만 test에서 가져옵니다.
# 예측에 사용할 데이터셋 예) 실전 시험문제
X_test = test[feature_names].fillna(0)
print(X_test.shape)
print("결측치 합계 : ", X_test.isnull().sum().sum())
X_test.head()
# y_train : label_name 에 해당 되는 컬럼만 train에서 가져옵니다.
# 학습(훈련)에 사용할 정답 값 예) 기출문제의 정답
# y_train는 정답이라 결측치가 없음. 그래서 제거해도 제거할게 없음
y_train = train[label_name].fillna(0)
print(y_train.shape)
print("결측치 합계 : ", y_train.isnull().sum().sum())
y_train.head()
의사결정트리중 분류를 사용하도록 합니다.
머신러닝 알고리즘을 가져오겠습니다.
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(random_state = 42,criterion = "entropy")
model
생성한 모델로 학습데이터를 훈련시키도록 하겠습니다.
model.fit(X_train,y_train)
다음은 예측을 실시합니다.
y_predict = model.predict(X_test)
y_predict
완료가 되었습니다. 캐글에 제출하기 위해 submission데이터셋에 예측값을 넣어주겠습니다.
# 데이터 불러오기
submit = pd.read_csv("data/titanic/gender_submission.csv", index_col = "PassengerId")
submit["Survived"] = y_predict
submit.to_csv("data/titanic/submit2.csv")
* 본 글은 멋쟁이사자처럼 ai스쿨의 강의내용과 자료를 참고하였습니다.