Kaggle(캐글) - 타이타닉 생존자 예측 초보자 튜토리얼[Hellfer](5)
https://www.kaggle.com/code/shivadumnawar/titanic-a-complete-tutorial-for-beginners
Titanic : A Complete Tutorial For Beginners
Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources
www.kaggle.com
위의 튜토리얼을 보고 참고하여 진행하였습니다.
다음은 5번째인 머신러닝으로 데이터를 학습하고 파일을 제출해 보겠습니다.
머신러닝 알고리즘은 데이터를 기반으로 학습하고, 이를 통해 예측이나 결정을 내리는 알고리즘입니다.
크게 지도 학습, 비지도 학습, 강화 학습으로 나눌 수 있습니다.
1. 지도 학습 (Supervised Learning)
- 입력 데이터와 그에 대한 정답이 주어진 상태에서 학습하는 방식입니다. 주로 회귀와 분류 문제에 사용됩니다.
1-1. 회귀 (Regression)
- 선형 회귀 (Linear Regression) : 데이터를 통해 직선을 그려 예측하는 방법입니다.
- 다중회귀 (Multiple Regreesion) : 여러 독립 변수를 사용하여 예측하는 방법입니다.
1-2. 분류 (Classification)
- 로지스틱 회귀 (Logistic Regression) : 이항 분류 문제에 주로 사용되는 회귀 방법입니다.
- 서포트 벡터 머신 (Support vector Machine, SVM) : 데이터를 분류하는 최적의 경계를 찾습니다.
- K-Nearest Neighbors (KNN) : 가장 가까운 K개의 이웃을 기반으로 분류합니다.
- 의사결정 나무 (Decision Tree) : 데이터를 분할하여 의사결정 규칙을 생성합니다.
- 랜덤 포레스트 (Random Forest) : 여러 개의 결정 나무를 앙상블 하여 예측 성능을 향상합니다.
- XGBoost : 그레디언트 부스팅 알고리즘을 사용한 성능 높은 분류 알고리즘입니다.
2. 비지도 학습 (Unsupervised Learning)
- 입력 데이터만 주어진 상태에서 데이터의 구조나 패턴을 학습하는 방식입니다.
2-1. 군집화 (Clustering)
- K-평균 (K-Means) : 데이터를 K개의 클러스터로 나누는 방법입니다.
- 계층적 군집화 (Hierachical Clustering) : 데이터 간의 거리를 기반으로 계층 구조를 형성합니다.
- DBSCAN : 밀도 기반의 클러스터링 방법으로, 밀도가 높은 영역을 클러스터로 묶습니다.
2-2. 차원 축소 (Dimensionality Reduction)
- 주성분 분석 (PCA) : 데이터의 차원을 축소하여 주요한 성분을 추출합니다.
- t - SNE : 고차원 데이터를 저 차원으로 시각화하는 방법입니다.
대표적인 머신러닝 라이브러리
- Scikit - learn : 파이썬에서 가장 널리 사용되는 머신러닝 라이브러리로, 다양한 알고리즘과 도구를 제공합니다.
- Tensor Flow, PyTorch : 딥러닝 모델을 구축하고 학습시키는 데 주로 사용됩니다.
- XGBoost : 그레디언트 부스팅 알고리즘을 구현한 라이브러리로, 성능이 뛰어납니다.
필요한 라이브러리 삽입
from sklearn import ensemble, gaussian_process, linear_model, naive_bayes, neighbors, svm, tree, discriminant_analysis, model_selection
from xgboost import XGBClassifier
여러 가지 분류 머신러닝 알고리즘을 리스트로 정의합니다.
MLA = [
ensemble.AdaBoostClassifier(),
ensemble.BaggingClassifier(),
ensemble.ExtraTreesClassifier(),
ensemble.GradientBoostingClassifier(),
ensemble.RandomForestClassifier(),
gaussian_process.GaussianProcessClassifier(),
linear_model.LogisticRegressionCV(),
linear_model.PassiveAggressiveClassifier(),
linear_model.RidgeClassifierCV(),
linear_model.SGDClassifier(),
linear_model.Perceptron(),
naive_bayes.BernoulliNB(),
naive_bayes.GaussianNB(),
neighbors.KNeighborsClassifier(),
svm.SVC(probability=True),
svm.NuSVC(probability=True),
svm.LinearSVC(),
tree.DecisionTreeClassifier(),
tree.ExtraTreeClassifier(),
discriminant_analysis.LinearDiscriminantAnalysis(),
discriminant_analysis.QuadraticDiscriminantAnalysis(),
XGBClassifier()
]
교차 검증 설정 : 데이터를 섞어 여러 번 나누어 교차 검증을 수행합니다.
cv_split = model_selection.ShuffleSplit(n_splits=10, test_size=0.3, train_size=0.6, random_state=0)
결과를 저장할 데이터프레임 생성 : 결과를 저장할 데이터프레임을 초기화합니다.
MLA_columns = ['MLA Name', 'MLA Parameters', 'MLA Train Accuracy Mean', 'MLA Test Accuracy Mean', 'MLA Test Accuracy 3*STD', 'MLA Time']
MLA_compare = pd.DataFrame(columns=MLA_columns)
row_index = 0
for alg in MLA:
MLA_name = alg.__class__.__name__
MLA_compare.loc[row_index, 'MLA Name'] = MLA_name
MLA_compare.loc[row_index, 'MLA Parameters'] = str(alg.get_params())
cv_results = model_selection.cross_validate(alg, X_train, y_train, cv=cv_split, return_train_score=True)
MLA_compare.loc[row_index, 'MLA Time'] = cv_results['fit_time'].mean()
MLA_compare.loc[row_index, 'MLA Train Accuracy Mean'] = cv_results['train_score'].mean()
MLA_compare.loc[row_index, 'MLA Test Accuracy Mean'] = cv_results['test_score'].mean()
MLA_compare.loc[row_index, 'MLA Test Accuracy 3*STD'] = cv_results['test_score'].std() * 3
alg.fit(X_train, y_train)
row_index += 1
MLA_compare.sort_values(by=['MLA Test Accuracy Mean'], ascending=False, inplace=True)
MLA_compare
- GradientBoostingClassifier가 테스트 정확도 (Mean : 0.817164)와 안정성 (STD : 0.055521)이 가장 높은 것으로 보입니다.
- BaggingClassifier와 XGBClassifier도 높은 정확도를 보이지만, GradientBoostingClassifier보다 약간 낮습니다.
- GaussianProcessClassifier는 높은 정확도를 보이지만 시간 소모가 큽니다.
sns.barplot(x = 'MLA Test Accuracy Mean', y = 'MLA Name', data = MLA_compare, color = 'm')
plt.title('Machine Learing Alogorithm Accuracy Score \n')
plt.xlabel('Accuarcy Score (%)')
plt.ylabel('Algorithm')
Text(0, 0.5, 'Algorithm')

여러 가지 딥러닝 알고리즘을 사용해 보겠습니다.
from sklearn.preprocessing import StandardScaler
ss= StandardScaler()
X_train, X_test 데이터의 표준화하는 과정을 나타냅니다.
데이터의 평균을 0으로 분산을 1로 조정하는 작업을 하고 특정 features에 대해 편향되지 않고 학습할 수 있게 도와줍니다.
features= ['Age', 'SibSp', 'Fare']
X_train[features]= ss.fit_transform(X_train[features])
X_test[features]= ss.transform(X_test[features])
표준화된 연속형 features('Age', 'SibSp', 'Fare')와 원-핫 인코딩 명목형 features('Pcalss_2', 'Pclass_3', 'Sex male', 'Embarked_Q', 'Embarked_S')를 포함하는 데이터프레임의 일부입니다.
X_train.head()
X_test.head()
1. GradientBoostingClassifier
from sklearn.ensemble import GradientBoostingClassifier
clf = GradientBoostingClassifier()
clf.fit(X_train, y_train.ravel())
predictions = clf.predict(X_test)
print(clf.score(X_train, y_train))
0.8821548821548821
2. XGBClassifier
from xgboost import XGBClassifier
clf = XGBClassifier()
clf.fit(X_train, y_train.ravel())
predictions = clf.predict(X_test)
print(clf.score(X_train, y_train))
0.9494949494949495
3. RandomForestClassifier()
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier()
clf.fit(X_train, y_train.ravel())
predictions = clf.predict(X_test)
print(clf.score(X_train, y_train))
0.9539842873176206
4. BaggingClassifier
from sklearn.ensemble import BaggingClassifier
clf = BaggingClassifier()
clf.fit(X_train, y_train.ravel())
predictions = clf.predict(X_test)
print(clf.score(X_train, y_train))
0.9472502805836139
5. AdaBoostClassifier
from sklearn.ensemble import AdaBoostClassifier
clf = AdaBoostClassifier()
clf.fit(X_train, y_train.ravel())
predictions = clf.predict(X_test)
print(clf.score(X_train, y_train))
0.8024691358024691
6. LogisticRegression
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
clf.fit(X_train, y_train.ravel())
predictions = clf.predict(X_test)
print(clf.score(X_train, y_train))
0.792368125701459
test_df 데이터프레임의 PassengerId와 예측된 Survived 값을 결합하여 새로운 데이터프레임 Submission을 생성하고, 그 결과를 출력합니다.
submission = pd.DataFrame({'PassengerId' : test_df['PassengerId'], 'Survived' : predictions})
print(submission.head())
filename = 'titanic predictions_csv'
submission.to_csv(filename, index=False)
최종 점수 : 0.77033