본문 바로가기
프로그램/SKT FLY AI

SKT FLY AI : 2일차 - 실습

by hsloth 2023. 6. 27.

SKLEARN 이용해서 모델 학습과 예측


일단, 내가 깨달은 점 부터 말을 해보려고 한다.
먼저 모델 학습하는 법을 잘 모르겠다면, 머신러닝 워크플로우를 구글에 검색해서 봐보자.
주변 분들께서 workflow를 보는 것을 추천해주셨다.
그리고 나 역시 이것을 보니까 어느정도 이해가 되었다.

Workflow 순서

  1. 데이터 수집 : 말그대로 데이터를 수집하는 과정이다. 이미 있는 데이터를 이용할 경우 필요x
  2. 데이터 점검 및 탐색 : 수집한 데이터의 구조를 파악하고 데이터가 유효한지 탐색한다. 나...는 그냥 df출력해봤다. 아마 엑셀에서 직접 값을 보는게 한눈에 들어오지 않을까 싶다.
  3. 전처리 및 정제
    • 결측치 처리 : Null, NAN과 같은 값을 처리한다.
      1. 해당 행을 제거 (결측치를 가진 행이 적을 경우)
      2. 수치형 데이터인 경우, 평균이나 중앙치로 대체
      3. 범주형 데이터인 경우, 최빈값으로 대체
      4. 간단한 예측 모델이 제시하는 값으로 대체
      • 참고로 나는 1번만 해봤다. 나머진 아직 잘 모르겠다.
    • 이상치 처리 : 어.. 안배운것 같다. 내가 수업에 집중을 안했나? 어떤식으로 해야할지 잘 모르겠어서 못했다.
    • 데이터 스케일링 : 서로 다른 x의 수치 범위가 차이가 많이 날 경우, 상대적으로 수치의 범위가 적은 x가 더 영향이 적다고 판단되기 때문에 x들의 스케일을 일정하게 맞춰주는 작업이다. 참고로, x의 값에 number가 아닌 타입이 들어가면 실행되지 않는다.
      • sklearn의 경우. 원 핫 인코딩 처리를 하여 숫자화 한다. (get_dummies이용)
    • 전처리 및 정제를 했으면, 훈련 데이터와 테스트 데이터를 분류하자.
  4. 모델링 및 훈련 : 모델은 sklearn에서 가져다 쓸거니까... 훈련만 시키면된다. 해당 모델을 불러와서 학습시키자.
  5. 평가 : 테스트 데이터를 예측한 결과가 실제 정답과 얼마나 유사한지 측정한다.

이정도가 될 수 있겠다.

깨달은 점

  1. DataFrame에서 내가 예측하고자 하는 속성이 있다면, 해당 속성을 y값으로 둔다.
  2. 그리고 해당 속성을 제외한 나머지는 X값이 된다.
    • 여기서, 불필요하다고 판단되는 속성(column)은 제거하자.
    • 혹은 원 핫 인코딩을 하자.
  3. 모델을 학습시키고 예측하여 정확도를 도출하는 과정을 이해하자.
    1. 데이터 불러오기
    2. 데이터 전처리(이상한 값, Feature를 없애자)
    3. 테스트 데이터와 훈련 데이터 분리 (보통 3:7, 2:8 이라고 한다)
    4. 모델을 불러와서 fit함수로 모델 학습
    5. predict함수로 테스트 데이터를 모델에 집어넣은 결과 도출
    6. 그렇게 나온 결과를 accuracy_score함수로 y테스트와 비교하여 정확도 도출

실습 코드


  • 이름을 근거로 성별을 판단하도록 모델을 학습시켰다.
import numpy as np
import pandas as pd
import seaborn as sns

gender = pd.read_csv('/content/names_genders.csv')
gender

###
gender = gender.drop(gender.index[6260])
gender

###
# 결측값 확인
gender.isnull().sum() # 나의 경우 없어서 처리를 안했다.

###
# 중복값 확인
gender.duplicated().sum() # 중복값도 없었다.

###
# 원 핫 인코딩
name_dummy = pd.get_dummies(gender.name)
gender.drop(['name'], axis=1, inplace=True) # inplace는 원본의 변경유무를 의미하는 듯 하다.
gender = gender.join(name_dummy)
gender

###
# Gender를 예측해야 하니, y를 Gender로 두고, x를 나머지로 두었다.
X = gender.drop(['Gender'], axis=1)
y = gender['Gender']
X.head()

###
# 테스트 데이터와 훈련 데이터 분리
from sklearn.model_selection import train_test_split

# test_size는 테스트 데이터를 몇개를 할건지 정하는 파라미터이다. 0.2면 전체 데이터 중 20퍼를 의미한다.
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                          test_size=0.2, random_state=42)

print(X_train.shape, X_test.shape)
print(y_train.shape, y_test.shape)

###
# 참고로 스케일링은 생략했다. 스케일링에 의미가 없는 데이터로 보여서.
# 실제로 스케일링하면 정확도 더 떨어진다...
y_train = y_train.values
y_test = y_test.values

###
# 모델을 불러와서 학습시킨다.
from sklearn.neighbors import KNeighborsClassifier

# n_neighbors : 예측할 데이터에서 가장 가까운 주변 이웃의 개수(모델이 검색할 이웃의 개수)
# 다수결의 원칙이 성립할 수 있도록 홀수로 지정하는게 좋음
knn = KNeighborsClassifier(n_neighbors=3) 
knn.fit(X_train, y_train)

###
# 테스트 데이터로 결과값 예측. 여기서 X_test만 넣는 이유는,
# 예측 결과인 y_pred를 실제 결과인 y_test와 비교를 하기 위해서이다.
y_pred = knn.predict(X_test)
print(y_pred)

###
# 정확도 확인
from sklearn.metrics import *

knn_acc = accuracy_score(y_test, y_pred)
print("knn_acc : ", knn_acc)

이런식으로 svm과 decision tree도 해주었다.