[캐글_kaggle] Titanic - 파이썬 머신러닝 완벽 가이드
1. 데이터 로드 및 칼럼 확인
train_df= pd.read_csv('train.csv')
test_df pd.read_csv('test.csv')
1) DataFrame.head()
- train.csv
- test.csv
2) DataFrame.info()
- train.csv
- test.csv
>>> 칼럼 목록
- int64 형 칼럼
- Passengerld : 탑승자 데이터 일련번호
- Survived: 생존 여부 (0= 사망, 1= 생존) -> Obect 칼럼으로 변경
- Pclass: 티켓의 선실 등급 (1= 일등석, 2= 이등석, 3= 삼등석) -> Obect 칼럼으로 변경
- SipSp: 같이 탑승한 형제자매(siblings) 또는 배우자 인원 수
- Parch: 같이 탑승한 부모님 또는 어린이 인원 수
- float64형 칼럼
- Age: 탑승자 나이
- Fare: 요금
- object(문자형) 칼럼
- Name: 탑승자 이름
- Sex: 탑승자 성별
- Ticket: 티켓 번호 -> 문자열 칼럼이어도 의미없음
- Cabin: 선실 번호
- Embarked: 중간 정착 항구 (C= Cherbourg, Q= Queenstown, S= Southampton)
2. 불필요한 칼럼 제거
: PassengerId, Name, Ticket은 분석에 사용하지 않을 칼럼이므로 제거
train_df= train_df.drop(['PassengerId','Name', 'Ticket'], axis=1)
test_df= test_df.drop(['PassengerId', 'Name', 'Ticker'], axis=1)
3. 데이터 전처리
1) train_df.isnull().sum()
- train.csv
2) test_df.isnull().sum()
- test.csv
: 사이킷런 머신러닝 알고리즘은 결측치를 허용하지 않으므로, 결측치를 어떻게 처리할 지 결정해야 함
1) remove missing data -> 제거하는 방향이 가장 좋지만, 가장 정확!
2) impute missing data -> 결측치 대치
- 그런데, 범주형(categorical) 데이터에서는 중간값이라는 개념이 없기 때문에, 수치형(numerical), 범주형 데이터로 나누고, 수치형 데이터만 채워넣어야 함
: DataFrame 의 fillna() 함수를 사용해 간단하게 결측치를 평균 또는 고정 값으로 변경 (Age의 경우는 평균 나이, 나머지 칼럼은 'N'이라는 값으로 변경)
train_df['Age']= train_df['Age'].fillna(train_df['Age'].mean())
train_df['Cabin']= train_df['Cabin'].fillna('N')
train_df['Embarked']= train_df['Embarked'].fillna('N')
test_df['Age']= train_df['Age'].fillna(test_df['Age'].mean())
test_df['Cabin']= test_df['Cabin'].fillna('N')
: 현재 남아있는 문자열 피처는 Sex, Cabin, Embarked 임 -> 이 피처들의 값 분류를 살펴보면
train_df['Sex'].value_counts()
train_df['Cabin'].value_counts()
train_df['Embarked'].value_counts()
-> Cabin(선실) 칼럼의 경우, 결측치가 많은 것도 특이하지만, 속성값이 제대로 정리되지 않은 것 같음.
예로, 'C23 C25 C27'과 같이 여러 Cabin 이 한꺼번에 표기된 값이 4건이 됨.
'Cabin'의 경우 선실 등급을 나타내는 첫 번쨰 알파벳이 중요해 보임 -> 해석상으로, 선실의 등급별로 살아날 확률이 차이날 것 같기 때문에 : Cabin 속성의 경우 앞 문자만 추출해야 함
train_df['Cabin'] = train_df['Cabin'].str[:1]
test_df['Cabin'] = test_df['Cabin'].str[:1]
* 1) .str[:1]: 문자열 메서드인 .str을 사용하여 'Cabin' 열의 각 값을 문자열로 처리한 후, [:1]을 사용하여 그 문자열의 첫 번째 문자만을 추출함
train_df['Cabin'].value_counts()
머신러닝 알고리즘을 적용해 예측을 수행하기 전에, 데이터를 먼저 탐색해 보자 (EDA).
- 어떤 유형의 승객이 생존 확률이 높았는지 확인해보자! (영화에 나왔듯이, 여성과 아이들, 그리고 노약자가 제일 먼저 구조 대상)
1) 성별이 생존 확률에 어떤 영향을 미쳤는지, 성별에 따른 생존자 수 비교
train_df.groupby(['Sex', Survived'])['Survived'].count() # .agg('count')도 ok
sns.barplot(x= 'Sex', y= 'Survived', data= train_df)
2) 부자와 가난한 사람 간의 생존 확률을 살펴보자. (객실 등급 = Pclass)
-> 단순히 객실 등급별로 생존 확률을 보는 것보다는 성별을 함께 고려해 분석하는 것이 더 효율적일 것 같아 '객실 등급별 성별에 따른 생존 확률' 확인
sns.barplot(x= 'Pclass', y= 'Survived', hue= 'Sex', data= train_df)
: 여성의 경우) 일, 이등실에 따른 생존 확률의 차이는 크지 않으나, 삼등실의 경우 생존 확률이 상대적으로 많이 떨어짐을 알 수 있음
: 남성의 경우) 일등실이 이, 삼등실의 생존 확률에 비해 월등히 높음
3) Age에 따른 생존 확률을 살펴보자.
: Age의 경우 '연속형'이기 때문에 범위별로 분류해 카테고리 값을 할당
: 0-5세는 'Baby', 6-12세는 'Child', 13-18세 'Teenager', 19-25세 'Student', 26-35세 'Young Adult', 36-60세 'Adult', 61세 이상은 'Elderly'로 분류, -1 이하의 오류 값은 'Unknown'으로 분류
def get_category (Age):
cat= '' #카테고리(cat)
if Age <= -1:
cat= 'Unknown'
elif 0 <= Age <6:
cat= 'Baby'
elif 6 <= Age <13:
cat= 'Child'
elif 13 <= Age <19:
cat= 'Teenager'
elif 19 <= Age <26:
cat= 'Student'
elif 26 <= Age <36:
cat= 'Young Adult'
elif 36 <= Age < 61:
cat= 'Adult'
else:
cat= 'Elderly'
return cat
-> return) 값을 함수 외부로 반환 - ' 함수 호출 후 그 값을 사용해서 다른 작업을 할 수 있음'
def add(a, b):
return a + b
result = add(3, 4) # 함수가 값을 반환하고, 그 값을 result에 저장
print(result) # 7
-> print) 단순히 값만 출력- ' print는 결과를 화면에 출력만 할 뿐, 값을 함수 외부로 반환하지 않음. 즉, 그 결과 값을 다른 변수에 저장하거나 다른 작업에 사용할 수 없음.'
def multiply_print(a, b):
print(a * b)
result = multiply_print(2, 3) # 6이 출력되지만, 반환된 값은 없음
print(result) # None 출력
train_df['Age_cat']= train_df['Age'].apply(lambda x: get_category(x))
sns.barplot(x= 'Age_cat', y='Survived', hue='Sex', data=train_df,
order= ['Unknown', 'Baby', 'Child', 'Teenager', 'Student', 'Young Adult', 'Adult', 'Elderly'])
train_df= train_df.drop('Age_cat', axis=1)
: 여자 Baby의 경우 비교적 생존 확률이 높음
(여자 Child의 경우는 다른 연령대에 비해 생존 확률이 낮음, 여자 Elderly의 경우는 생존 확률이 매우 높음)
-> Sex, Age, Pclass 등이 중요하게 생존을 좌우하는 피처임을 확인할 수 있음
문자열 카테고리 피처를 숫자형 카테고리 피처로 변환할 차례
(인코딩은 사이킷런의 LabelEncoder 클래스를 이용해 레이블 인코딩을 적용하겠음/ LabelEncoder 객체는 카테고리 값의 유형 수에 따라 0~ (카테고리 유형 수 -1) 까지의 숫자 값으로 변환)
from sklearn.preprocessing import LabelEncoder
for feature in ['Cabin', 'Sex', 'Embarked']:
le= LabelEncoder()
le= le.fir(train_df[feature])
train_df[feature]= le.transform(train_df[feature])
for feature in ['Cabin', 'Sex', 'Embarked']:
le= LabelEncoder()
le= le.fit(test_df[feature])
test_df[feature]= le.transform(test_df[feature])
4. 모델 생성 및 하이퍼파라미터 튜닝
: 모델을 만들고, 전처리된 학습 데이터의 피처 (x_train)와 정답(y_train)을 이용해 모델 학습
X_train= train_df.drop('Survived', axis=1)
y_train= train_df['Survived']
X_test= test_df
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
ML 알고리즘인 '의사결정 트리'를 이용해 타이타닉 생존자를 예측해 보자.
[ '타이타닉 생존자 예측'을 위해 의사결정 트리를 이용해야 하는 이유]
-
사이킷런은 결정 트리를 위해서 DecisionTreeClassifier 클래스를 제공.
또한, GridSearchCV를 이용해 DecisionTreeClassifier의 최적 하이퍼 파라미터를 찾고 예측 성능을 측정.
CV는 5개의 폴드 세트를 지정하고 하이퍼 파라미터는 max_depth, min_samples_split, min_samples_leaf를 변경하면서 성능을 측정.
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GirdSearchCV
from sklearn.metrics import accuracy_score
params = {
'max_depth': [2, 3, 5, 10],
'min_samples_split': [2, 3, 5],
'min_samples_leaf': [1, 5, 8]
}
dt_clf = DecisionTreeClassifier()
grid_dclf = GridSearchCV(dt_clf, param_grid=params, scoring='accuracy', cv=5)
grid_dclf.fit(X_train, y_train)
print('GridSearchCV 최적 하이퍼 파라미터:', grid_dclf.best_params_)
print('GridSearchCV 최고 정확도:', grid_dclf.best_score_)
5. 예측 (Prediction)
측정한 모델들 중 가장 좋은 성능을 내는 모델을 이용해 실제 테스트 데이터 (X_test)를 예측함
best_dclf = grid_dclf.best_estimator_
preds = best_dclf.predict(X_test)
6. 제출 (Submission)
예제 Submission 파일을 가져와서 'Survived' 칼럼을 우리가 예측한 preds 로 교체 후, submission.csv 파일로 다시 저장함
submission = pd.read_csv('../input/titanic/gender_submission.csv')
submission
submission.loc[:, 'Survived'] = preds
submission
submission.to_csv('submission.csv', index=False)
자료출처:
https://www.kaggle.com/code/dogdriip/decisiontreeclassifier
DecisionTreeClassifier 타이타닉 예제 (파이썬 머신러닝 완벽 가이드)
Explore and run machine learning code with Kaggle Notebooks | Using data from Titanic - Machine Learning from Disaster
www.kaggle.com
[개정판] 파이썬 머신러닝 완벽 가이드 강의 | 권 철민 - 인프런
권 철민 | 이론 위주의 머신러닝 강좌에서 탈피하여 머신러닝의 핵심 개념을 쉽게 이해함과 동시에 실전 머신러닝 애플리케이션 구현 능력을 갖출 수 있도록 만들어 드립니다., [사진]상세한 설
www.inflearn.com
https://dsbook.tistory.com/181
Kaggle : Titanic [ 파이썬 머신러닝 완벽 가이드 ] - 1
캐글은 세계적인 ML 기반 분석 대회이다. 그 중에서도 타이타닉 생존자 예측은 처음 입문하는 사람들이 하는 튜토리얼이다. 캐글 사이트에서 Titanic을 검색하거나, https://www.kaggle.com/c/titanic에 들
dsbook.tistory.com
https://aiclaudev.tistory.com/3
[파이썬 머신러닝 완벽가이드] Chap01-2. pandas 라이브러리 1
- 본 글은 파이썬 머신러닝 완벽 가이드 (권철민 지음)을 공부하며 내용을 추가한 정리글입니다. 개인 공부를 위해 만들었으며, 만약 문제가 발생할 시 글을 비공개로 전환함을 알립니다. [1] 데
aiclaudev.tistory.com
https://rahites.tistory.com/27
[파이썬 머신러닝 완벽 가이드] 3장. 평가
# 22.01.12 머신러닝 스터디 3장. 평가 HTML 삽입 미리보기할 수 없는 소스
rahites.tistory.com
'통계, 데이터' 카테고리의 글 목록
최범균이 운영하는 자바 및 웹 관련 컨텐츠 제공 블로그
javacan.tistory.com
file:///C:/wiset/%ED%8C%8C%EC%9D%B4%EC%84%A0%20ML%20-%202%EC%9E%A5%20%EC%82%AC%EC%9D%B4%ED%82%B7%EB%9F%B0.pdf
https://bkshin.tistory.com/category/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%B6%84%EC%84%9D
'데이터 분석' 카테고리의 글 목록
인공지능과 데이터, 그리고 책을 다루는 블로그입니다 :)
bkshin.tistory.com
간단한 통계 개념 복습-1
데이터분석을 진행하면서 단순하게 집단 간의 수치를 barplot등으로 비교해보고 아래와 같은 예시로 결론을 내렸던 경우가 많았습니다. ex) 이탈유저가 진성유저에비해 구매횟수가 높다. 하지만
taek98.tistory.com