ch0nny_log

[빅데이터분석] Python_58. Kaggle 실습 & 업로드 본문

빅데이터 분석(with 아이티윌)/python

[빅데이터분석] Python_58. Kaggle 실습 & 업로드

chonny 2024. 9. 11. 15:44
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