서론
안녕하세요, 이번 글에서는 Google Colab 환경에서 Python을 활용하여 머신러닝 알고리즘을 이용해 타이타닉호의 생존자를 예측하는 과정을 상세하게 설명하려 합니다. 이 과정은 대표적인 머신러닝 프로젝트의 흐름을 그대로 따르며, 데이터 분석부터 모델의 성능 평가까지 일련의 과정을 거치게 됩니다. 우선, 탐색적 데이터 분석(EDA)를 통해 데이터를 깊이 있게 이해하고, 이를 바탕으로 전처리 과정에서 결측치와 이상치를 수정합니다. 이후, 데이터 인코딩으로 데이터를 머신러닝 알고리즘이 이해할 수 있는 형태로 변환하며, 데이터 스케일링을 통해 모든 데이터를 동일한 범위로 정규화합니다. 데이터의 준비가 완료되면, 데이터를 학습용과 테스트용으로 분리하고, 적절한 머신러닝 모델을 선택하여 학습을 진행합니다. 모델의 성능을 검증하고, 필요한 경우 하이퍼파라미터를 튜닝하여 최적의 성능을 추구합니다. 마지막으로, 모델의 성능을 다양한 지표를 통해 평가하게 됩니다. 이 모든 과정을 통해, 기계학습의 전체적인 흐름을 이해하고 실제로 코드를 작성하는 경험을 통해 머신러닝의 원리와 응용을 더욱 깊게 이해하는 기회가 될 것입니다. 이 글이 머신러닝에 대한 여러분의 이해를 돕는데 도움이 되길 바랍니다.
1. 탐색적 데이터 분석
# Google Drive 마운트
from google.colab import drive
drive.mount('/content/drive')
# 데이터 불러오기
import pandas as pd
base_path = "/content/drive/MyDrive//titanic/"
train = pd.read_csv(base_path + "train.csv")
test = pd.read_csv(base_path + "test.csv")
submission = pd.read_csv(base_path + "gender_submission.csv")
# 데이터 정보 확인
train.info()
test.info()
train.isnull().sum()
train['Embarked'].value_counts()
2. 데이터 전처리
# 결측치 처리
train["Embarked"].fillna("S", inplace=True) # 'Embarked' 컬럼의 결측치를 최빈값인 'S'로 대체
train['Age'].fillna(train['Age'].mean(), inplace=True) # 'Age' 컬럼의 결측치를 평균값으로 대체
# 불필요한 컬럼 제거
train.drop(columns=["Cabin", "PassengerId","Name","Ticket","Fare"], axis=1, inplace=True)
3. 데이터 인코딩
# 원-핫 인코딩
one_hot_encoded = pd.get_dummies(train,columns=['Sex', 'Embarked'])
4. 데이터 스케일링
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
temp = scaler.fit_transform(one_hot_encoded.loc[:, ["Age"]]) # 'Age' 컬럼 정규화
one_hot_encoded["Age"] = temp[:, 0]
5. 데이터 스플릿
X = one_hot_encoded.drop(columns="Survived") # input matrix
y = one_hot_encoded.Survived # target vector
6. 모델 선택 및 학습
from sklearn.linear_model import SGDClassifier, LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
# 모델 학습
clf = SGDClassifier()
clf2 = LogisticRegression()
clf3 = DecisionTreeClassifier()
clf4 = RandomForestClassifier()
clf.fit(X, y)
clf2.fit(X, y)
clf3.fit(X, y)
clf4.fit(X, y)
#모델 학습에 대한 피처 중요도
import matplotlib.pyplot as plt
import seaborn as sns
ftr_importances_values = clf3.feature_importances_ #clf3 모델에 대한 피처 중요도
ftr_importances = pd.Series(ftr_importances_values, index=X_train.columns )
ftr_top20 = ftr_importances.sort_values(ascending=False)[:20]
plt.figure(figsize=[8, 6])
plt.title('Feature importances Top 20')
sns.barplot(x=ftr_top20 , y = ftr_top20.index)
plt.show()
7. 모델 검증 및 하이퍼파라미터 튜닝
#하이퍼파라미터 튜닝 (Hyperparameter Tuning)
from sklearn.model_selection import GridSearchCV
parameters = {'max_depth':[2,4,6,8,10], 'min_samples_split':[2,3,4]}
grid_dclf = GridSearchCV(dclf, param_grid=parameters, scoring='accuracy', cv=5)
grid_dclf.fit(X_train, y_train)
print('GridSearchCV 최적 하이퍼 파라미터 :',grid_dclf.best_params_)
print('GridSearchCV 최고 정확도: {0:.4f}'.format(grid_dclf.best_score_))
# 학습 데이터에 대한 예측
pred = clf.predict(X)
pred2 = clf2.predict(X)
pred3 = clf3.predict(X)
pred4 = clf4.predict(X)
8. 성능 평가
#교차 검증 (Cross Validation)
from sklearn.model_selection import cross_val_score
score = cross_val_score(clf, X, y, cv=5) # 5-fold cross validation
print("Cross Validation Score: ", score.mean())
from sklearn.metrics import accuracy_score
# 학습 데이터에 대한 예측 결과의 정확도 계산
print("1. Linear Classifier, Accuracy for training : %.4f" % accuracy_score(y, pred))
print("2. Logistic Regression, Accuracy for training : %.4f" % accuracy_score(y, pred2))
print("3. Decision Tree, Accuracy for training : %.4f" % accuracy_score(y, pred3))
print("4. Random Forest, Accuracy for training : %.4f" % accuracy_score(y, pred4))
테스트 데이터에 대해서도 동일한 절차로 수행합니다.
# 결측치 처리
test["Embarked"].fillna("S", inplace=True) # 'Embarked' 컬럼의 결측치를 최빈값인 'S'로 대체
test['Age'].fillna(test['Age'].mean(), inplace=True) # 'Age' 컬럼의 결측치를 평균값으로 대체
# 불필요한 컬럼 제거
test.drop(columns=["Cabin", "PassengerId","Name","Ticket","Fare"], axis=1, inplace=True)
# 원-핫 인코딩
test_OHE = pd.get_dummies(test,columns=['Sex', 'Embarked'])
# 데이터 스케일링: 데이터 정규화
scaler = MinMaxScaler()
temp1 = scaler.fit_transform(test_OHE.loc[:, ["Age"]]) # 'Age' 컬럼 정규화
test_OHE["Age"] = temp1[:, 0]
# 테스트 데이터에 대한 예측(해당 예시에서는 clf3(DecisionTreeClassifier) 모델을 선택함)
result = clf3.predict(test_OHE)
# 제출 파일 생성
submission["Survived"] = result
submission.to_csv(base_path + "submission.csv", index=False)
결론
본 글에서는 머신러닝 프로젝트의 전체 과정을 코드와 함께 살펴보았습니다. 데이터의 탐색과 전처리, 모델의 학습과 검증, 그리고 최종적인 예측까지의 과정을 단계별로 설명하였습니다. 또한, 추가적으로 필요한 교차 검증, 하이퍼파라미터 튜닝, 피처 중요도 확인 등의 과정도 함께 살펴보았습니다. 머신러닝은 복잡한 과정을 포함하고 있지만, 이를 단계별로 체계적으로 접근하면 훨씬 이해하기 쉽고, 효과적인 모델을 만들 수 있습니다. 각 단계에서 신중한 결정을 내리고, 적절한 방법을 선택하면 데이터로부터 유의미한 인사이트를 얻을 수 있습니다. 이러한 과정을 통해, 머신러닝은 우리에게 데이터로부터 숨겨진 패턴을 찾아내고, 그를 바탕으로 미래를 예측하는 강력한 도구를 제공합니다. 앞으로도 이러한 절차를 반복하며, 더욱 향상된 모델을 개발하는 데에 힘쓰고자 합니다.
'데이터 사이언스 > Kaggle' 카테고리의 다른 글
피처가 많을 때 머신러닝 어떻게 하나요 - 3편(PCA) (4) | 2024.03.12 |
---|---|
피처가 많을 때 머신러닝 어떻게 하나요 - 2편 (3) | 2024.03.05 |
피처가 많을 때 머신러닝 어떻게 하나요 - 1편 (73) | 2024.03.04 |
붓꽃 품종 분류 문제 데이터 로드부터 해결까지 Iris clustering (79) | 2024.01.16 |
캐글 실전 자전거 공유 수요 예측 (4) | 2024.01.12 |