운동하는 공대생
[교육봉사] 분류 모델 기초 실습(1&2) 본문
1. Data
https://www.kaggle.com/competitions/titanic/data
Titanic - Machine Learning from Disaster | Kaggle
www.kaggle.com
2. 수업 내용
머신러닝의 실습 과정에서 필요한 과정을 설명을 하겠습니다. 먼저 실습하는 과정에서는 제가 자주 사용하는 방식을 순서대로 설명을 하겠습니다.
Data Preprocessing
- 데이터 분석
import pandas as pd
df=pd.read_csv('train.csv')
df['Survived'].value_counts()
df
데이터 전처리 과정에서는 먼저 데이터에 대한 분석을 진행을 해야 한다. 훈련을 위한 데이터와 예측을 하려는 데이터에 대하여 데이터의 분포(target 데이터에서 값들이 얼마나 있는지)를 파악하기 위해서 value_counts() 라이브러리를 활용하여서 예측하려는 데이터에서 특정 클래스가 얼마나 존재하는지를 파악하였습니다.
import matplotlib.pyplot as plt
import seaborn as sns
# 클래스별 생존 여부 분포를 시각화
sns.set(style="whitegrid")
plt.figure(figsize=(8, 6))
# 'Pclass' 열을 기준으로 생존 여부를 나누어 카운트 플롯 그리기
sns.countplot(data=df, x='Pclass', hue='Survived', palette='Set1')
# 그래프에 제목과 레이블 추가
plt.title('Survival Distribution by Pclass')
plt.xlabel('Pclass')
plt.ylabel('Count')
# 범례 추가
plt.legend(title='Survived', loc='upper right', labels=['No', 'Yes'])
# 그래프 표시
plt.show()
다음으로는 그래프를 그리는 라이브러리를 활용하여서 예측하려는 데이터와 특정 데이터와의 관련성을 알아보았습니다. 그래프를 그려 직접 시각화를 한다면 데이터의 분포와 그리고 특정 칼럼에 대한 데이터와의 관계성을 쉽게 파악하는 게 가능합니다.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 데이터 불러오기
df = pd.read_csv('train.csv')
# 상관 계수 계산
correlation = df.corr()
# 상관 행렬 시각화
plt.figure(figsize=(10, 8))
sns.heatmap(correlation, annot=True, cmap='coolwarm', fmt=".5f", linewidths=.5)
plt.title('Correlation Heatmap')
plt.show()
그래프를 그리는 방식 이외에도 'heat map' 방식을 통해서 데이터의 상관관계를 파악을 하는것도 가능합니다. 여기서 상관관계란 말 그대로 예측하려는 데이터와의 상관관계 즉 데이터가 상승함에 따라서 특정 데이터가 동시에 상승하는지 하강하는지를 파악하는 게 가능하고, 만약 변화를 알았다면 어느 정도로 변화하는지 까지도 알아보는 게 가능합니다.
- 정규화
from sklearn.preprocessing import MinMaxScaler
# min-max 정규화 객체 생성
scaler = MinMaxScaler()
# min-max 정규화 적용
scaler.fit(df[['Fare']])
df_scaled = scaler.transform(df[['Fare']])
df['Fare']=df_scaled
머신러닝에서 데이터를 정규화 하는 이유는 데이터들의 극간을 줄이기 위해서 자주 사용합니다. 예를 들어 특정 데이터가 1000이라는 수치를 가지고 있고 1이라는 수치를 가지고 있을 때 이 둘의 차이를 판단을 함에 있어서 차이가 너무 많이 나는 문제가 있습니다. 그래서 이런 데이터들의 오류를 줄이기 위해서 정규화 방식을 주로 사용합니다. 그래서 보통 데이터를 [0,1] 혹은 [-1,1] 사이의 값으로 변환하여 주로 사용합니다.
- Label Encoding
new_sex_data=[]
for sex in train_data['Sex']:
if sex =='male':
new_sex_data.append(0)
else:
new_sex_data.append(1)
train_data['Sex']=new_sex_data
Label Encoding 방식이랑 머신러닝의 모델을 훈련을 하려면 범주형 데이터를 처리를 해주어야 합니다. 그런데 이 데이터에서는 범주형 데이터 이지만 그 값을 훈련을 하는 데이터에 포함하지 않는 건 모델 예측의 정확도를 낮추는 문제가 발생을 할 수 있습니다. 그래서 필요하다고 판단되는 데이터는 범주형 데이터를 수치형으로 변환하는 작업을 진행하였습니다. 이 데이터에서는 성별 데이터를 여자는 0 남자는 1 이렇게 수치적으로 변환을 하였습니다.
- 결측치 처리
for i in train_data.columns:
cabin_nan_count = train_data[i].isnull().sum()
print(f'{i} 컬럼의 NaN 개수: {cabin_nan_count}')
train_data['Age']=train_data['Age'].fillna(train_data['Age'].mean())
데이터에서 또한 훈련을 어렵게 만드는 문제는 결측치에 대한 문제입니다. 결측치란 데이터가 중간에 빠져있는 현상을 말합니다. 그래서 여기서 먼저 수치형 데이터 중에서 결측치가 있는지 판단을 하였고 결측치가 존제하는 나이 데이터에 전체의 평균값을 결측치에 대입하는 방식으로 결측치를 처리를 하였습니다.
Feature Engineering
result=[]
for i in train_data['Name']:
result.append(i.split(',')[1].split('.')[0].strip())
new_data=[]
for data in result:
if data =='Mr':
new_data.append(0)
elif data=='Miss':
new_data.append(1)
elif data=='Mrs':
new_data.append(2)
else:
new_data.append(3)
train_data['Name']=new_data
Model Selection
from xgboost import XGBClassifier
model=XGBClassifier()
model.fit(train_data,target)
모델을 일반적으로 머신러닝에서 높은 정확도를 보이는 XGBoost 모델을 사용하였습니다. 하지만 다음 시간에 모델에 대한 설명이나 과정을 자세하게 설명을 할 예정입니다.
Prediction
test_df=pd.read_csv('test.csv') #예측을 하려는 데이터에서도 이전에 했던 전처리 과정을 모두 해주어야 합니다.
result=[]
for i in test_df['Name']:
result.append(i.split(',')[1].split('.')[0].strip())
new_data=[]
for data in result:
if data =='Mr':
new_data.append(0)
elif data=='Miss':
new_data.append(1)
elif data=='Mrs':
new_data.append(2)
else:
new_data.append(3)
test_df['Name']=new_data
new_sex_data=[]
for sex in test_df['Sex']:
if sex =='male':
new_sex_data.append(0)
else:
new_sex_data.append(1)
test_df['Sex']=new_sex_data
test_df=test_df.drop('Ticket',axis=1)
test_df=test_df.drop('Cabin',axis=1)
test_df=test_df.drop('Embarked',axis=1)
test_df['Age']=test_df['Age'].fillna(test_df['Age'].mean())
preds=model.predict(test_df) # 이전에 선언했던 모델의 예측을 진행
result=pd.read_csv('gender_submission.csv')
result['Survived']=preds
result.to_csv('result.csv',index=False) # 예측했던 데이터를 형식에 맞게 저장
예측을 진행하는 데이터에서도 이전에 훈련하는 데이터에서 사용했던 전처리 방식을 모두 적용합니다. 그 이후에는 모델을 활용하여 예측을 진행합니다.