캐글의 튜토리얼 격인 타이타닉 데이터를 의사결정트리로 분류해보자
sklearn을 이용하여 CART알고리즘으로 구현한다.
데이터 자체를 이해하고 어떤것이 중요한 데이터인지 분류하는 것보다는 sklearn을 이용하여 의사결정 트리의 CART 알고리즘 자체를 구현해 보는것이 목적이기 때문에 데이터 전처리에는 큰 비중을 두지 않고 넘어간다.
위 링크에서 데이터셋을 다운받는다.
데이터 뜯어보기
import pandas as pd
#트레이닝 데이터 가져오기
train = pd.read_csv('data/titanic/train.csv')
#테스트 데이터 가져오기
test = pd.read_csv('data/titanic/test.csv')
train.info()
--출력--
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
#info()함수는 데이터의 자료구조를 설명해준다. 데이터 값의 타입을 보여주고, 대표적인 통계값을 요약해서 출력해준다.
결측치 확인
train.isnull().sum()
--출력--
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
#insull()함수는 결측치가 있는 값을 True, 없는 값을 False로 반환한다.
실습
1. 사용할 모듈을을 불러온다
데이터 처리를 위한 pandas
트리를 구현하기위한 sklearn.tree
데이터를 시각화하기 위한 import seaborn as sns
트리를 시각화 하기위한 graphviz 모듈들을 불러온다.
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
import seaborn as sns
import graphviz
from sklearn.tree import export_graphviz
2. 트레이닝, 테스트 데이터셋 불러오기
pd.read_csv를 이용하여 데이터가 있는 csv파일을 불러온다.(경로는 사람마다 다르다)
#.head()는 상위 5개의 데이터들을 보여준다.
#트레이닝 데이터 가져오기
train = pd.read_csv('data/titanic/train.csv')
#테스트 데이터 가져오기
test = pd.read_csv('data/titanic/test.csv')
train.head()
#PassengerId = 승객 ID
#Survived = 생존
#Pclass = 1,2,3 등석
#sibsp = 함깨탄 사람 수
#parch = 함깨탄 가족 수
#Fare = 요금
#Cabin = 객실
3. 데이터 시각화
#sns.countplot(데이터, x축, 카테고리 분류)
sns.countplot(data=train, x="Pclass",hue="Survived") #Pclass에 대한 데이터 시각화
4. 학습
feature_name에 학습 데이터를 넣는다
feature_name = ['Pclass']
x = train[feature_name]
print(x)
--출력--
Pclass
0 3
1 1
2 3
3 1
4 3
.. ...
886 2
887 1
888 3
889 1
890 3
[891 rows x 1 columns]
target에 정답 데이터를 넣는다.
target = "Survived"
y = train[target]
print(y)
--출력--
0 0
1 1
2 1
3 1
4 0
..
886 0
887 1
888 0
889 1
890 0
Name: Survived, Length: 891, dtype: int64
sklearn에 구현되어 있는 트리를 가져온다.
model = DecisionTreeClassifier()
fit()을 이용하여 학습시킨다.
model.fit(x,y)
5. 시각화
tree = export_graphviz(model,feature_names=feature_name,
class_names=["Perish","Survived"])
graphviz.Source(tree)
6. 제출
Pclass만으로 학습한 모델의 정확도를 알아보기 위해 캐글에 제출해보자.
먼저 테스트 데이터를 가져와 모델에 적용해보자.
x_test=test[feature_name] #Pclass
met = model.predict(x_test)
met
--출력--
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0,
1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0,
1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0,
0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0,
0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0,
1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,
1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0,
1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1,
0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
dtype=int64)
먼저 a에 제출 데이터를 가져온다.
그리고 위에서 만들었던 met의 값을 제출데이터의 Survived에 덮어씌운다
그 후에 to_csv로 저장한다
a = pd.read_csv('data/titanic/gender_submission.csv')
a['Survived'] = met #원래 제출 데이터의 Survived을 met의 값으로 바꿈
a.to_csv("decision-tree.csv", index=False) #인덱스가 있으면 제출에서 오류가 난다
제출해보면
0.6으로 60퍼정도라는것을 대충 알수 있다.
점수를 높히기 위해서 Pclass뿐만 아니라 다른 데이터들도 학습에 이용해보자.
7-1. 데이터 전처리
sex데이터를 보면 남자와 여자가 문자열로 저장되어있다.
이 문자열을 숫자로 바꾸어서 학습에 이용한다.
train.Sex = train.Sex.replace('male',0)
train.Sex = train.Sex.replace('female',1)
test.Sex = test.Sex.replace('male',0)
test.Sex = test.Sex.replace('female',1)
남자는 0으로 여자는 1로 변환시킨다.
그리고 트레이닝 데이터를 보면 값이 바뀐것을 볼 수 있다.
위의 feature_name에 Sex를 추가하고 제출해본다.
0.77, 70퍼센트로 점수가 오른것을 볼 수 있다.
예제파일
'Emotion > 인공지능 기초' 카테고리의 다른 글
랜덤 포레스트 (0) | 2020.09.16 |
---|---|
의사결정 트리 CART (0) | 2020.09.16 |
의사결정 트리 ID3 (1) | 2020.09.15 |
KNN_캐글 (0) | 2020.09.15 |
K-NN 최근접 이웃 (K-Nearest Neighbor) 알고리즘 (0) | 2020.09.11 |