-
사이킷런 ( Scikit-learn ) - 7Python Machine Learning/Scikit-learn 2020. 7. 22. 19:44
지금까지 해온 사이킷런에 대한 것을 복습하고자 타이타닉 탑승자 데이터를 기반으로 생존자 예측을 사이킷런으로 수행해 보겠습니다. 이것 또한 주피터노트북을 이용하여 수행하겠습니다. 그리고 아직 하진 않았지만 시각화 캐지인 맷플롯립과 시본을 이용해 간단한 차트와 그래프도 함께 시각화 해보겠습니다.
기본적으로 타이타닉 탑승자 데이터는 이와 같습니다.
* Passengerid : 탑승자 데이터 일련번호
* survived : 생존 여부, 0 = 사망, 1 = 생존
* Pclass : 티켓의 선실 등급, 1 = 일등석, 2 = 이등석, 3 = 삼등석
* sex : 탑승자 성별
* name : 탑승자 이름
* Age : 탑승자 나이
* sibsp : 같이 탑승한 형제자매 또는 배우자 인원수
* parch : 같이 탑승한 부모님 또는 어린이 인원수
* ticket : 티켓 번호
* fare : 요금
* cabin : 선실 번호
* embarked : 중간 정착 항구 C = Cherbourg, Q = Queenstown, S = Southampton로딩된 타이타닉 데이터 로딩된 데이터 칼럼 타입 --> 데이터프레임의 인덱스의 범위를 나타내므로 전체 로우 수 891개와 12개의 칼럼으로 구성.
--> object는 string 타입과 유사
--> age, cabin, embarked는 각각 177개, 608개, 2개의 Null값 존재.
--> but 사이킷런 머신러닝에서는 Null값을 허용하지 않음
--> DataFrame의 fillna( )함수를 사용해 null값을 평균 또는 고정 값으로 변경.( 나이는 평균, 나머지는 'N'으로 변경 )
--> 다시 확인해본 결과 null값이 존재하지 않음.
--> 남아있는 문자열 칼럼은 sex, cabin, Embarked이며 특히 cabin같은 경우는 속성이 자세하게 정리되지 않은 느낌.
--> cabin속성의 경우 앞문자만를 추출하여 정리.
성별에 따른 생존자 수
--> groupby( )를 통해 성별과 생존자중 생존자수를 나타냈으며 0은 사망, 1은 생존.
--> 남자 577명 중 109명이 생존( 18.8%생존 ),여자 314명이 탑승했으며 그 중 233명이 생존( 74.2%생존 )
--> seaborn( 데이터분석을 위한 시각화로 사용되는 패키지 )을 통해서 확인가능.
==> 생존자 수로 알 수 있는 부분은 타이타닉 사고시 여성이 남성보다 우선적으로 구조되었다는것을 알 수 있음.
성별과 객실 등급에 따른 생존자 수
==> 남성, 여성 모두 등급이 높을수록 생존확률이 높다는 것을 알 수 있음.
나이에 따른 생존 확률
==> 전체적으로 남성보다 여성의 생존확률이 높으며 여성의 경우 child는 다른 연령대에 비해 생존확률이 낮으며 senior는 생존 확률이 매우 높다는 것을 알 수 있음. 결국 생존확률에는 성별, 나이, Pclass는 중요한 피처임을 확인할 수 있음.
데이터 전처리
--> 사이킷런의 LabelEncoder 클래스를 이용해 레이블 인코딩을 적용하여 문자열 카테고리 피처를 숫자형 카테고리 피러초 변환. ( 카테고리 값의 유형 수에 따라 0~ ( 카테고리 유형 수 -1 )까지의 숫자 값으로 변환.
--> 여러 칼럼을 한 번에 변환하기위해서 encode_features( ) 함수를 새로 생성.
--> sex, cabin, Embarked의 문자열이 숫자형으로 변환된 것을 알 수 있음.
ML알고리즘.
--> null처리, 포매팅, 인코딩을 수행하고 데이터의 전처리를 전체적으로 호출하는 함수인 transform_features( )을 생성.
--> 원본 데이터세트를 다시 로딩하고 Survived속성을 드롭한 뒤 transform_features( )를 적용해 데이터를 가공.
--> train_test_split( )를 이용해 별도의 테스트 데이터 세트를 추출하고 크기를 전체의 20%로 설정.
--> ML 알고리즘인 결정 트리, 랜덤 포레스트, 로지스틱 회귀를 이용해 생존자를 예측.
--> 각각의 클래스를 생성하고 train_test_split( )으로 분리한 학습, 테스트 데이터를 기반으로 학습( fit ),
예측( predict )을 수행하고 예측 성능 평가는 정확도( accuracy )로 하기위해 accuracy_score( ) API 사용.
--> 로지스틱 회귀가 가장 높은 정확도를 나타냄.
교차검증
KFold
--> 폴드 세트를 5개인 KFold객체를 생성, 폴드 수만큼 예측결과 저장을 위한 리스트 객체 생성.
--> 타이타닉 데이터에서 교차 검증별로 학습과 검증 데이터를 가르키는 index 생성
--> 학습, 예측, 정확도 계산
==> 5개 폴드에서의 평균 정확도 계산 ( 약78.2%의 평균 정확도 )
cross_val_score( )
GridSearchCV
--> max_depth, min_samples_split, min_samples_leaf를 변경하면서 성능을 측정.
--> 최적 하이퍼 파라미터와 그 때의 예측을 출력하고 최적 하이퍼 파라미터로 학습된 Estimator를 이용해 위의
train_test_split( )으로 분리된 테스트 데이터 세트에 예측을 수행해 예측 정확도 측정.
==> max_depth=3, min_samples_leaf = 1, min_samples_split = 2일 때 예측 정확도가 약87.15%로 증가.
'Python Machine Learning > Scikit-learn' 카테고리의 다른 글
사이킷런 ( Scikit-learn ) - 6 (0) 2020.07.22 사이킷런 ( Scikit-learn ) - 5 (0) 2020.07.22 사이킷런 ( Scikit-learn ) - 4 (0) 2020.07.21 사이킷런 ( Scikit-learn ) - 3 (0) 2020.07.21 사이킷런 ( Scikit-learn ) - 2 (0) 2020.07.21