30. 분류

따또·2021년 7월 30일
0

Pandas DA

목록 보기
30/31
post-thumbnail

1) KNN

  • 기존 데이터 중에서 가장 속성이 비슷한 k개의 이웃을 찾음
  • 가까운 이웃들이 가지고 있는 목표 값과 같은 값으로 분류하여 예측

1-1. 데이터 전처리

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
pd.set_option('display.max_columns', 15)

rdf = df.drop(['deck', 'embark_town'], axis = 1)
rdf = rdf.dropna(subset = ['age'], how = 'any', axis = 0)
# age 열에 나이 데이터가 없는 모든 행 삭제

most_freq = rdf['embarked'].value_counts(dropna=True).idxmax()
# embarked 열의 NaN 값을 승선도시 중에서 가장 많이 출현한 값 도출

rdf['embarked'].fillna(most_freq, inplace = True)
# 가장 많이 출현한 값인 s로 NaN값을 대체

ndf = rdf[['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'embarked']]

onehot_sex = pd.get_dummies(ndf['sex'])
# sex 열 데이터인 female와 male을 더미 변수 열로 만들기

ndf = pd.concat([ndf, onehot_sex], axis = 1)

onehot_embarked = pd.get_dummies(ndf['embarked'], prefix = 'town')
# 열 이름에 접두어 'town'을 추가
# embarked 열 데이터를 더미 변수 열로 만들기

ndf = pd.concat([ndf, onehot_embarked], axis = 1)

ndf.drop(['sex', 'embarked'], axis = 1, inplace = True)
# 원래 존재했던 sex와 embarked 열을 제거

1-2. 훈련/검증 데이터 분할

X = ndf[['pclass', 'age', 'sibsp', 'parch', 'female', 'male']]
y = ndf['survived']

from sklearn import preprocessing

X = preprocessing.StandardScaler().fit(X).transform(X)

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 10)

1-3. 모델 학습 및 예측, 성능 측정

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=5)

knn.fit(X_train, y_train)
# 모델 학습

y_hat = knn.predict(X_test)
# 모델 예측

from sklearn import metrics

knn_report = metrics.classification_report(y_test, y_hat)
# 모델 성능 평가 지표 확인 가능

print(knn_report)

2) SVM

  • 벡터 공간에 위치한 훈련 데이터의 좌표와 각 데이터가 어떤 분류값을 가져야 하는지 정답을 입력 받아서 학습함

2-1. 데이터 전처리

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
pd.set_option('display.max_columns', 15)

rdf = df.drop(['deck', 'embark_town'], axis = 1)
rdf = rdf.dropna(subset = ['age'], how = 'any', axis = 0)
# age 열에 나이 데이터가 없는 모든 행 삭제

most_freq = rdf['embarked'].value_counts(dropna=True).idxmax()
# embarked 열의 NaN 값을 승선도시 중에서 가장 많이 출현한 값 도출

rdf['embarked'].fillna(most_freq, inplace = True)
# 가장 많이 출현한 값인 s로 NaN값을 대체

ndf = rdf[['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'embarked']]

onehot_sex = pd.get_dummies(ndf['sex'])
# sex 열 데이터인 female와 male을 더미 변수 열로 만들기

ndf = pd.concat([ndf, onehot_sex], axis = 1)

onehot_embarked = pd.get_dummies(ndf['embarked'], prefix = 'town')
# 열 이름에 접두어 'town'을 추가
# embarked 열 데이터를 더미 변수 열로 만들기

ndf = pd.concat([ndf, onehot_embarked], axis = 1)

ndf.drop(['sex', 'embarked'], axis = 1, inplace = True)
# 원래 존재했던 sex와 embarked 열을 제거

2-2. 훈련/검증 데이터 분할

X = ndf[['pclass', 'age', 'sibsp', 'parch', 'female', 'male', 'town_C', 'town_Q', 'town_S']]
y = ndf['survived']

from sklearn import preprocessing

X = preprocessing.StandardScaler().fit(X).transform(X)

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 10)

2-3. 모델 학습 및 예측, 성능 측정

from sklearn import svm

svm_model = svm.SVC(kernel = 'rbf')

svm_model.fit(X_train, y_train)
# 모델 학습

y_hat = svm_model.predict(X_test)
# 모델 예측

from sklearn import metrics

svm_matrix = metrics.confusion_matrix(y_test, y_hat)
# 모형 성능 평가 지표 확인 가능 (confusion matrix)

print(svm_matrix)
print('\n')

svm_report = metrics.classification_report(y_test, y_hat)
# 모델 성능 평가 지표 확인 가능

print(svm_report)

3) Decision Tree

  • 트리 구조 사용
  • 각 분기점(node)에는 분석 대상의 속성들이 위치
  • 각 분기점마다 목표 값을 가장 잘 분류할 수 있는 속성을 찾아서 배치
  • 해당 속성이 갖는 값을 이용하여 새로운 가지를 만드는 구조
  • Entropy가 일정 수준 이하로 낮아질 때까지 앞의 과정 반복

3-1. 데이터 전처리

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
pd.set_option('display.max_columns', 15)

rdf = df.drop(['deck', 'embark_town'], axis = 1)
rdf = rdf.dropna(subset = ['age'], how = 'any', axis = 0)
# age 열에 나이 데이터가 없는 모든 행 삭제

most_freq = rdf['embarked'].value_counts(dropna=True).idxmax()
# embarked 열의 NaN 값을 승선도시 중에서 가장 많이 출현한 값 도출

rdf['embarked'].fillna(most_freq, inplace = True)
# 가장 많이 출현한 값인 s로 NaN값을 대체

ndf = rdf[['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'embarked']]

onehot_sex = pd.get_dummies(ndf['sex'])
# sex 열 데이터인 female와 male을 더미 변수 열로 만들기

ndf = pd.concat([ndf, onehot_sex], axis = 1)

onehot_embarked = pd.get_dummies(ndf['embarked'], prefix = 'town')
# 열 이름에 접두어 'town'을 추가
# embarked 열 데이터를 더미 변수 열로 만들기

ndf = pd.concat([ndf, onehot_embarked], axis = 1)

ndf.drop(['sex', 'embarked'], axis = 1, inplace = True)
# 원래 존재했던 sex와 embarked 열을 제거

3-2. 훈련/검증 데이터 분할

X = ndf[['pclass', 'age', 'sibsp', 'parch', 'female', 'male']]
y = ndf['survived']

from sklearn import preprocessing

X = preprocessing.StandardScaler().fit(X).transform(X)

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 10)

3-3. 모델 학습 및 예측, 성능 측정

from sklearn import tree

tree_model = tree.DecisionTreeClassifier(criterion='entropy', max_depth = 5)

tree_model.fit(X_train, y_train)
# 모델 학습

y_hat = tree_model.predict(X_test)
# 모델 예측

from sklearn import metrics

tree_report = metrics.classification_report(y_test, y_hat)
# 모델 성능 평가 지표 확인 가능

print(tree_report)

profile
따또의 DA 벨로그

0개의 댓글