Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 순위출력
- Dense_Rank
- 상관관계
- sqld
- 정보획득량
- 불순도제거
- sql
- 그래프시각화
- difftime
- 회귀분석 알고리즘
- 단순회귀 분석
- max
- %in%
- 총과 카드만들기
- 회귀분석
- merge
- 빅데이터분석
- if문 작성법
- 팀스파르타
- 여러 데이터 검색
- loop 문
- Sum
- 그래프 생성 문법
- 막대그래프
- 데이터분석가
- 데이터분석
- count
- 빅데이터
- 히스토그램 그리기
- Intersect
Archives
- Today
- Total
ch0nny_log
[빅데이터분석] Python_58. Kaggle 실습 & 업로드 본문
1. 쉬운 타이타닉 데이터 분류 모델 만들기
#1. 데이터 로드 import seaborn as sns import pandas as pd data = sns.load_dataset('titanic') data.shape # (891, 15) data.info
#2. 데이터 살펴보기 data.isnull().sum()
# ★ 결측치 처리 # 나이는 전체 나이의 평균값으로 채웁니다. ( 평균값, 최빈값, 중앙값등으로 채움) data['age'].fillna(data['age'].mean(), inplace=True ) #data.isnull().sum() # 정박한 항구(embarked) 의 결측치를 최빈값으로 채웁니다. data['embarked'].fillna( data['embarked'].mode()[0], inplace=True) data.isnull().sum() # 중복된 데이터가 있는 컬럼은 삭제합니다. data.drop(['deck', 'embark_town', 'who', 'alive', 'alone'], axis=1, inplace=True) data.isnull().sum() data.shape # (891, 10)
data['sex'].unique() # ['male', 'female'] data['sex'] = data['sex'].map({'male' : 0, 'female' : 1} ) data['embarked'].unique() # ['S', 'C', 'Q'] data['embarked'] = data['embarked'].map({'S' : 0, 'C' : 1, 'Q' : 2 }) data['class'].unique() # ['Third', 'First', 'Second'] data['class'] = data['class'].map( {'Third' : 0, 'First' : 1, 'Second' : 2 } ) data['adult_male'].unique() # [ True, False] data['adult_male'] = data['adult_male'].map( { True : 1, False : 0 } ) data.head(5)
#4. 훈련과 테스트 분리 from sklearn.model_selection import train_test_split x = data.drop('survived', axis =1) y = data['survived'] x_train, x_test, y_train, y_test = train_test_split(x, y, test_size =0.2, random_state =1) print(x_train.shape) # (712, 9) print(x_test.shape) # (179, 9) print(y_train.shape) # (712,) print(y_test.shape) # (179,)
#5. 정규화 수행 from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() x_train_scaled = scaler.fit_transform(x_train) x_test_scaled = scaler.transform(x_test) x_train_scaled
#6. 모델 생성 from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(random_state =1)
#7. 모델 훈련 model.fit(x_train_scaled, y_train)
#8. 모델 예측 y_pred = model.predict( x_test_scaled) y_pred
#9. 모델 평가 from sklearn.metrics import accuracy_score accuracy_score( y_pred, y_test ) # 0.7932960893854749
★ 개선한 총 코드# 1. 데이터 로드 import seaborn as sns import pandas as pd data = sns.load_dataset('titanic') # data.shape # (891, 15) # data.info() # # 파생 컬럼 추가 # data.who.unique() # def female_or_child(who): # if who == 'woman' or who == 'child': # return 1 # else: # return 0 # data['female_or_child'] = data['who'].apply(female_or_child) # data.head() # 2. 데이터 살펴보기 data.isnull().sum() # age 177개 / embarked 2개 / deck 688개 / embark_town 2개 """ ★ 결측치 처리 ★ """ # age(나이)는 전체 나이의 평균값으로 채우기 (평균값, 중앙값, 최빈값 등으로 채우기) data['age'].fillna(data['age'].mean(), inplace=True) data.isnull().sum() # 결측치 채워졌는지 확인 -> age 0개 # embarked(정박한 항구)의 결측치를 최빈값으로 채우기 data['embarked'].fillna(data['embarked'].mode()[0], inplace=True) # 최빈값 : S data.isnull().sum() # 중복된 데이터가 있는 컬럼 삭제하기 - deck, embark_town, who, alive, alone(=sibsp) df = data.drop(['deck', 'embark_town', 'who', 'alive', 'alone'], axis=1, inplace=True) data.isnull().sum() data.shape # (891, 10) data.head() # 3. 문자형 데이터를 숫자로 변경하기 data['sex'].unique() # ['male', 'female'] data['sex'] = data['sex'].map( {'male' : 0, 'female' : 1} ) # male은 0, female은 1로 변경 data.head(5) data['embarked'].unique() # ['S', 'C', 'Q'] data['embarked'] = data['embarked'].map( {'S' : 0, 'C' : 1, 'Q' : 2 } ) data.head(5) data['class'].unique() # ['First', 'Second', 'Third'] data['class'] = data['class'].map( {'First' : 1, 'Second' : 2, 'Third' : 3 } ) data.head(5) data['adult_male'].unique() # [ True, False] data['adult_male'] = data['adult_male'].map( {True : 1, False : 0} ) data.head(5) # 4. 훈련과 테스트 분리 from sklearn.model_selection import train_test_split x = data.drop('survived', axis = 1) # 정답 컬럼 없애기 y = data['survived'] x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=1) # print(x_train.shape) # (712, 9) # print(x_test.shape) # (179, 9) # print(y_train.shape) # (712,) # print(y_test.shape) # (179,) # 5. 정규화 수행 - age, fare 만 정규화하면 됨 from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() x_train_scaled = scaler.fit_transform(x_train) x_test_scaled = scaler.fit_transform(x_test) # 6. 모델 생성 from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(random_state = 1) # 7. 모델 훈련 model.fit(x_train_scaled, y_train) # 테스트, 정답 # 8. 모델 예측 y_predict = model.predict(x_test_scaled) y_predict # 9. 모델 평가 from sklearn.metrics import accuracy_score accuracy_score(y_predict, y_test) # 테스트, 정답 # 정확도 0.8044692737430168 # 10. 모델 개선 # 여자 또는 아이는 1이라고 하고 나머지는 0으로 하는 파생 컬럼 추가하기
※ 성능을 개선하는 방법 2가지 ?
1. 좋은 파생 컬럼 추가
2. 가장 베스트한 하이퍼 파라미터 설정
▣ 실제 케글의 타이타닉 데이터로 케글에 응시하는 방법
#1. 타이타닉 데이터 셋을 내려받습니다.
https://www.kaggle.com/competitions/titanic/data
PassengerId : 승객번호
Survived : 생존여부( 0 : 사망, 1 : 생존 )
Pclass : 승객이 탑승한 선실 등급 (1 : 1등급, 2 : 2등급, 3 : 3등급 )
Name : 승객 이름 <-- 파생 컬럼을 생각해낼 수 있는 힌트
Sex
Age : 결측치가 다수 존재하므로 이 결측치를 잘 처리해줘야합니다.
SibSp : 동반한 형제 또는 배우자 수
Parch : 동반한 부모 또는 자녀의 수
Ticket : 승객의 티켓번호 <--- Cabin 의 결측치를 예상하는데 도움을 받을 수 있음.
Fare : 티켓 요금
Cabin : 객실 번호
Embarked : 승객이 탑승한 항구( C = Cherbourg, Q=Queentown, S=Southampton )
#1. 데이터 불러오기 import pandas as pd train_data = pd.read_csv("c:\\data_tat\\train.csv") test_data = pd.read_csv("c:\\data_tat\\test.csv") gender_submission = pd.read_csv("c:\\data_tat\\gender_submission.csv")
# 실습 #1. 데이터 불러오기 import pandas as pd train_data = pd.read_csv("c:\\data_tat\\titanic\\train.csv") test_data = pd.read_csv("c:\\data_tat\\titanic\\test.csv") gender_submission = pd.read_csv("c:\\data_tat\\titanic\\gender_submission.csv") #2. 데이터 살펴보기 train_data.shape # (891, 12) test_data.shape # (418, 11) #train_data.info() #test_data.info() #3. 결측치 채우기 train_data.isnull().sum() train_data['Age'].fillna( train_data['Age'].median(), inplace=True) # 중앙값으로 채움 train_data['Embarked'].fillna(train_data['Embarked'].mode()[0], inplace=True) # 최빈값으로 채움 # cabin 의 경우는 결측치가 너무 많아서 삭제할 겁니다. # 케글 상위권자들의 경우는 이 cabin 을 다른 컬럼의 데이터로 유추해서 채워넣었습니다. # 여자 또는 아이 파생 컬럼 추가 train_data['iswomen'] = train_data['Sex'].apply(lambda x:1 if x=='female' else 0 ) train_data['ischild'] = train_data['Age'].apply(lambda x:1 if x<=16 else 0 ) train_data['iswomenchild'] = train_data['iswomen'] | train_data['ischild'] # 가족 규모(Family size) 파생 컬럼을 추가 train_data['FamilySize'] = train_data['SibSp'] + train_data['Parch'] + 1 # 요금을 4개의 등급으로 나눠주는 파생 컬럼 추가 train_data['fare_bin'] = pd.cut(train_data['Fare'], 4, labels=[0, 1, 2, 3 ] ) # # 호칭 컬럼 추가 # train_data['Title'] = train_data.Name.str.extract('([A-Za-z]+)\\.') # train_data['Title'] = train_data['Title'].replace([ 'Master', 'Don', 'Rev', 'Dr' ,'Major', 'Lady', 'Sir', 'Col', 'Capt', 'Countess', 'Jonkheer'], 'Rare' ) # train_data['Title'] = train_data['Title'].replace('Mlle', 'Miss') # train_data['Title'] = train_data['Title'].replace('Ms', 'Miss') # train_data['Title'] = train_data['Title'].replace('Mme', 'Mrs') # 요금에 로그 변환 적용 import numpy as np train_data['LogFare'] = np.log1p(train_data['Fare']) # 나이에 로그 변환 적용 train_data['LogAge'] = np.log1p(train_data['Age']) #4. 불필요한 컬럼 삭제하기 train_data.drop(['Cabin', 'Ticket', 'Name', 'PassengerId','iswomen','ischild'], axis=1, inplace=True ) train_data.isnull().sum() print(train_data) #5. 문자형 데이터 ---> 숫자형으로 변환하기 #train_data.info() train_data = pd.get_dummies( train_data, columns=['Sex', 'Embarked'], drop_first=True) #6. 독립변수와 종속변수 지정하기 x = train_data.drop('Survived', axis=1 ) # axis=1 : 세로, axis=0: 가로 y = train_data['Survived'] x #7. 훈련 데이터와 테스트 데이터 분리하기 # (훈련 데이터를 가지고 또 훈련과 테스트를 나눈것이라서 x_var, y_var 로 이름 붙임) from sklearn.model_selection import train_test_split x_train, x_var, y_train, y_var = train_test_split( x, y, test_size=0.2, random_state=1) print( x_train.shape ) print( x_var.shape ) print( y_train.shape) print( y_var.shape ) #8. 모델 생성 from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators=100, random_state=1) model.fit(x_train, y_train) #9. 모델 예측 y_pred = model.predict(x_var) y_pred #10. 모델 평가 from sklearn.metrics import accuracy_score accuracy = accuracy_score( y_pred, y_var ) accuracy
'빅데이터 분석(with 아이티윌) > python' 카테고리의 다른 글
[빅데이터분석] Linux_4. 마리아 디비와 파이썬 연동, 리눅스 프로세서 관리명령어 (0) | 2024.09.23 |
---|---|
[빅데이터분석] Python_59. 파이썬으로 홈페이지 만들기 (0) | 2024.09.12 |
[빅데이터분석] Python_57. 파이썬과 오라클, mySQL(Maria) (8) | 2024.09.11 |
[빅데이터분석] Python_56. 판다스 머신러닝 6.(z검정 통계, 정규검정, 단측검정, 가설검정, anova분석, 비모수 검정,카이제곱 검정 ) (0) | 2024.09.10 |
[빅데이터분석] Python_55. 판다스 머신러닝5.(랜덤 포레스트 , 수치예측) (3) | 2024.09.10 |