2022. 3. 6. 19:01ㆍData Science

처음 풀어본 Kaggle 연습 문제인데, 역시 아직 많이 부족해 다른 자료를 많이 찾아보았고, 거의 클론 코딩에 가까울 정도로 모델을 생성하였다. (사실 클론 코딩이라고 봐야한다 진짜 공부가 많이 필요하단 생각이 든다...)
import hyperopt
from catboost import Pool, CatBoostClassifier, cv
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
train_df = pd.read_csv("/kaggle/input/titanic/train.csv")
test_df = pd.read_csv("/kaggle/input/titanic/test.csv")
train_df.head()

학습 데이터를 쓰다보면 가끔 데이터가 없는 즉 None 또는 NaN 데이터가 있기 때문에 이를 처리해줘야 한다. 그래서 먼저 있는지 없는지 찾아보자면 다음과 같이 .isnull() 메소드를 이용하고 거기에 .sum()까지 하면 각 컬럼별로 몇 개의 None 데이터가 있는지 합계로 보여준다.
train_df.isnull().sum()

결과를 보면 Age, Cabin, Embarked에 해당 수만큼 None 데이터가 있다는걸 알 수 있다.
train_df.fillna(-999,inplace=True)
test_df.fillna(-999,inplace=True)
None 데이터를 처리해주기 위해 .fillna()를 이용하여 데이터를 채워준다.
train_df.isnull().sum()

이렇게 해주면 None 데이터를 처리하여 합계가 0된 것을 볼 수 있다.
x = train_df.drop('Survived',axis=1)
y = train_df.Survived
이제 해당 데이터를 학습하기 위해 Supervised 된 데이터의 라벨(class)과 학습을 위한 데이터로 나누어준다.
학습하기 이전에 나누어진 데이터의 형태를 먼저 보면
x.dtypes

데이터의 형태 중 Age와 Fare가 float64로 되어 있는 것을 볼 수 있다. CatBoost는 카테고리한 데이터를 다루기에 특화된 머신러닝 알고리즘이기 때문에 float과 같은 실수는 사용하지 않는게 좋다.
cate_features_index = np.where(x.dtypes != float)[0]
cate_features_index

그래서 float 형태를 int형 인덱스로 반환하는 인덱스 numpy 배열을 하나 만들어 준다.
xtrain,xtest,ytrain,ytest = train_test_split(x,y,train_size=.85,random_state=1234)
데이터 셋을 학습 셋과 검증(Validation)용 테스트 셋으로 나누어주고
model = CatBoostClassifier(eval_metric='Accuracy',use_best_model=True,random_seed=42)
CatBoost 분류 모델을 생성하고
model.fit(xtrain,ytrain,cat_features=cate_features_index,eval_set=(xtest,ytest))
학습을 시켜준다.
학습이 완료되면
pred = model.predict(test_df)
pred = pred.astype(np.int32)
submission = pd.DataFrame({'PassengerId':test_df['PassengerId'],'Survived':pred})
submission.to_csv('catboost.csv',index=False)
추론하여 제출할 Kaggle 형식 데이터로 변환해준다.

다음엔 좀 더 데이터 분석을 섞어서 2번째 도전을 해봐야 겠다.
참조한 코드 URL: https://www.kaggle.com/manrunning/catboost-for-titanic-top-7/notebook