분류모델 실습으로 캐글(Kaggle)의 타이타닉(Titanic ) 프로젝트를 하였다.
타이타닉 프로젝트는, 타이타닉 침몰 사건의 생존자를 잘 예측하는 알고리즘을 만드는 대회이다.
그래서 데이터에 타이타닉 사건 당시 실제 생존자와 사망자의 정보가 나와있다.
생존자를 예측한다는 것은 생존자, 사망자 둘 중 하나를 예측해야 하는 것이기 때문에
분류(Classification) 문제이다.
1. 데이터 불러오기
# 파일을 구글드라이브에 넣어놔서 구글드라이브를 연결
from google.colab import drive
drive.mount('/content/drive')
# 데이터를 불러오기 위해 pandas 사용
import pandas as pd
# titanic data 불러오기
base_path = "/content/drive/MyDrive/FastCampus/KDC/data/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 데이터는 학습에 사용한다.
- test 데이터는 train 데이터로 학습이 잘 되었는지 확인하기 위해 사용한다.
- submission 데이터는 kaggle에 최종적으로 제출하기 위해 사용한다.
2. Data Preprocessing(전처리)
- 데이터를 확인해보자.
train
- 이런식으로 구성되어 있으며, train 데이터의 Survived 컬럼으로 생존 여부를 알 수 있다.
(각 Column에 대한 설명은 kaggle 사이트에서 확인할 수 있다.)
train.info()
- Age, Cabin, Embarked는 결측치(null, 비어있는 값)가 있다.
2-1. 결측치 처리
- 결측치를 처리하는 방법은 여러가지가 있다.
- 최빈값을 쓰거나, 평균값을 쓰거나, 결측치가 있는 군의 특성을 조사해서 처리하거나 등등..
- 최대한 합리적으로 처리하는게 좋을 것이다.
(본 글에서는 과정은 생략하고, 결과만 작성한다.)
# Embarked는 최빈값인 "S"로 채운다.
train.loc[train.Embarked.isnull(), "Embarked"] = "S"
# Age는 평균값으로 채운다.
train = train.fillna(train.Age.mean())
2-2. Feature Selection
- 분석에 사용하지 않을 Column을 제거하는 과정이다.
- Cabin은 좌석번호인데, 예측에 큰 의미가 없다고 판단하여 삭제한다.(결측치 문제가 함께 해결된다.)
- PassengerId는 탑승객 ID인데 생존과 무관한 정보이니 삭제한다.
- Name은 이름이다. 삭제한다.
- Ticket은 티켓번호이다. 삭제한다.
# Columns 삭제
train = train.drop(columns = ["PassengerId", "Name", "Ticket", "Cabin"])
# 수정 된 데이터를 확인한다.
train.info()
3. Feature Engineering
3-1. Categorical Feature Encoding
- Categoricla Freature는 범주형 변수로, 컴퓨터가 이해할 수 있도록 변환을 해줘야 한다.
- 범주형 변수는 명목형(Nominal), 범주형(Ordinal)으로 나눌 수 있다.
- 명목형 변수는 성별, 출신학교 등과 같이 정보의 차이는 없고 구분만 하는 변수를 의미한다.
- One-hot Encoding으로 처리한다.
- 범주형 변수는 학력, 선호도 등과 같이 수치적으로 정보의 차이가 있는 변수를 의미한다.
- Ordinal Encoding으로 처리한다.
(변수에 대한 구체적인 설명을 아래에 추가하였다.)
- Sex, Embarked는 구분만 하는 변수이기 때문에 명목형 변수이고, One-hot Encoding 방법으로 처리한다.
- pandas의 get_dummies 함수를 쓰면 편하게 바꿀 수 있다.
train_OHE = pd.get_dummies(train, columns=["Sex", "Embarked"])
train_OHE
- Sex 컬럼이 Sex_female, Sex_male로 구분된 것을 볼 수 있다.
- Embarked 컬럼도 C, Q, S로 구분되었다.
3-2. Normalization(정규화)
- 정규화를 하기 전에 데이터를 독립변수와 종속변수로 구분한다.
- 각각을 부르는 이름은 다양하지만, 정답을 맞추기 위한 데이터를 독립변수(X)로,
- 맞춰야 하는 정답은 종속변수(y)로 표현했다.
X = train_OHE.drop(columns = "Survived") # input matrix
y = train_OHE.Survived # target vector
- Age와 Fare는 각각 나이와 요금으로 단위가 다르다.
- 데이터를 그냥 입력하면 컴퓨터는 그 차이를 모르기 때문에 정규화 과정이 필요하다.
- 자세한 내용은 아래 링크를 첨부한다.
정규화(Normalization), 일반화(Generalization), 표준화(Standardization)
정규화(Normalization), 일반화(Generalization), 표준화(Standardization)는 모두 데이터 분석에서 중요한 개념이며, 데이터를 처리하고 분석하는 방법에 따라 사용되는 용어입니다. 정규화(Normalization)는 데
work-master.tistory.com
- 정규화에는 Min-Max Scaler를 사용한다.
- 각 컬럼의 최대 최소를 기준으로 비율값으로 변환하며 0 ~ 1 사이의 값을 갖는다.
- fit_transform 함수를 사용하며, fit은 학습의 의미를 갖는다.
# Normalization --> Min-Max scaling
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler() # 최대 최소를 기준으로 비율값으로 변환(0 ~ 1)
# fit + transform
# X를 다 넣고 변환해도 상관 없지만, "Age", "Fare"만 따로 해본다.
temp = scaler.fit_transform(X.loc[:, ["Age", "Fare"]) # fit_transform 안에 Series를 넣으면 에러가 난다.
X["Age"] = temp[:, 0]
X["Fare"] = temp[:, 1]
X
4. Training(학습)
- 이론에서 분류모델 4가지(Linear classifier, Logistic Regression, Decision Tree, Random Forest)를 배웠다.
- 이 4가지를 사용해본다.
from sklearn.linear_model import SGDClassifier # 1. Linear Classifier(SGD를 사용한 Linear Classifier이다. parameter 업데이트를 SGD로 한다.)
from sklearn.linear_model import LogisticRegression # 2. Logistic Regression
from sklearn.tree import DecisionTreeClassifier # 3. Decision Tree
from sklearn.ensemble import RandomForestClassifier # 4. Random Forest
# 평가 지표 # 타이타닉 문제의 평가지표는 Accuracy
from sklearn.metrics import accuracy_score
# 객체 선언
clf1 = SGDClassifier()
clf2 = LogisticRegression()
clf3 = DecisionTreeClassifier()
clf4 = RandomForestClassifier()
# 학습
clf1.fit(X, y)
clf2.fit(X, y)
clf3.fit(X, y)
clf4.fit(X, y)
- 학습 결과의 성능을 확인해본다.
pred1 = clf1.predict(X)
pred2 = clf2.predict(X)
pred3 = clf3.predict(X)
pred4 = clf4.predict(X)
print("1. Linear Classifier, Accuracy for training : %.4f" % accuracy_score(y, pred1))
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))
5. Test(Predict, 예측)
5-1. Data Preprocessing(전처리)
- test 데이터는 학습결과를 바탕으로 예측성능을 테스트하기 때문에 정답에 해당하는 Survived 컬럼이 없다.
test
- train 데이터에서 했던 Feature Engineering을 똑같이 한다.
test = test.drop(columns = ["PassengerId", "Name", "Ticket", "Cabin"])
test.info()
- train 데이터에서는 문제가 없었던 Fare에서 결측치가 발생했다.
- test 데이터의 결측치를 처리할 때 주의 할 점은 train 데이터를 기준으로 처리해야 한다는 것! 이다.
- 학습이 train 데이터 기준으로 되었기 때문이다.
# 이렇게 해야 함
test = test.fillna(train.Age.mean())
test = test.fillna(train.Fare.mean())
# Categorical feature encoding
test_OHE = pd.get_dummies(data = test, columns = ["Sex", "Embarked"])
- 정규화도 train 데이터 기준이기 때문에 fit을 안하고 transform만 하면 된다.
temp = scaler.transform(test_OHE.loc[:, ["Age", "Fare"]])
test_OHE.Age = temp[:, 0]
test_OHE.Fare = temp[:, 1]
test_OHE
5-2. Predict(예측)
- test 데이터는 정답인 y가 없기 때문에 fit은 하지 않는다.
# prediction
result1 = clf1.predict(test_OHE)
result2 = clf2.predict(test_OHE)
result3 = clf3.predict(test_OHE)
result4 = clf4.predict(test_OHE)
- 샘플로 하나만 확인해본다.
result1
- 예측이 잘 된 것 같다.
6. 결과 제출
- 이제 결과를 kaggle에 제출하면 된다.
- 이때 submission 데이터를 사용한다.
submission
- ID에 따른 생존여부가 표시되어있는데, 이건 샘플로 들어있는 것이다.
- 예측한 값으로 수정한다.
submission["Survived"] = result4
submission
- 수정을 완료했으니 scv파일로 저장해서 제출한다.
submission.to_csv(base_path + "submission1.csv", index = False) # kaggle에 제출 할 때는 index를 빼야 함
- 실습 끝!
----------------- 추가로, 변수 종류를 ChatGPT에게 물어보았다. 아래와 같이 알려준다.
변수는 크게 양적 변수(Quantitative Variable)와 질적 변수(Qualitative Variable)로 나뉩니다.
양적 변수는 숫자나 수치를 나타내는 변수로서, 연속형(Continuous) 변수와 이산형(Discrete) 변수로 나뉩니다.
연속형 변수는 측정값이 어떤 범위 안에서 어떤 숫자든지 될 수 있는 변수이고,
이산형 변수는 정수 값만 가질 수 있는 변수입니다.
질적 변수는 범주형 변수(Categorical Variable)로도 불리며, 명목형(Nominal) 변수와 순서형(Ordinal) 변수로 나뉩니다. 명목형 변수는 측정 대상을 서로 구별할 수 있는 이름, 코드 등으로 구분하는 변수입니다. 예를 들면 성별, 학교 이름 등이 있습니다.
순서형 변수는 순서나 등급을 표시할 수 있는 변수로, 예를 들면 학점, 선호도 등이 있습니다.
이외에도 범주형 변수의 일종인 이진 변수(Binary Variable)는 두 가지 값 중 하나만 가지는 변수입니다. 예를 들면, 예/아니오, 참/거짓 등이 있습니다.
'클래스 리뷰 > 22.12 K-Digital 기초역량훈련 딥러닝 강의' 카테고리의 다른 글
[패스트캠퍼스] 딥러닝 강의 - 회귀모델 실습 (0) | 2023.04.09 |
---|---|
[패스트캠퍼스] 딥러닝 강의 - 6주차 학습일지 - 파이널 프로젝트 및 후기 (0) | 2023.02.08 |
[패스트캠퍼스] 딥러닝 강의 - 5주차 학습일지 - 클러스터링 모델 정리 (0) | 2023.02.08 |
[패스트캠퍼스] 딥러닝 강의 - 4주차 학습일지 - 회귀 모델 정리 (0) | 2023.02.03 |
[패스트캠퍼스] 딥러닝 강의 - 3주차 학습일지 - 분류 모델 정리 (0) | 2023.02.01 |
댓글