SKLEARN 이용해서 모델 학습과 예측
일단, 내가 깨달은 점 부터 말을 해보려고 한다.
먼저 모델 학습하는 법을 잘 모르겠다면, 머신러닝 워크플로우를 구글에 검색해서 봐보자.
주변 분들께서 workflow를 보는 것을 추천해주셨다.
그리고 나 역시 이것을 보니까 어느정도 이해가 되었다.
Workflow 순서
- 데이터 수집 : 말그대로 데이터를 수집하는 과정이다. 이미 있는 데이터를 이용할 경우 필요x
- 데이터 점검 및 탐색 : 수집한 데이터의 구조를 파악하고 데이터가 유효한지 탐색한다. 나...는 그냥 df출력해봤다. 아마 엑셀에서 직접 값을 보는게 한눈에 들어오지 않을까 싶다.
- 전처리 및 정제
- 결측치 처리 : Null, NAN과 같은 값을 처리한다.
- 해당 행을 제거 (결측치를 가진 행이 적을 경우)
- 수치형 데이터인 경우, 평균이나 중앙치로 대체
- 범주형 데이터인 경우, 최빈값으로 대체
- 간단한 예측 모델이 제시하는 값으로 대체
- 참고로 나는 1번만 해봤다. 나머진 아직 잘 모르겠다.
- 이상치 처리 : 어.. 안배운것 같다. 내가 수업에 집중을 안했나? 어떤식으로 해야할지 잘 모르겠어서 못했다.
- 데이터 스케일링 : 서로 다른 x의 수치 범위가 차이가 많이 날 경우, 상대적으로 수치의 범위가 적은 x가 더 영향이 적다고 판단되기 때문에 x들의 스케일을 일정하게 맞춰주는 작업이다. 참고로, x의 값에 number가 아닌 타입이 들어가면 실행되지 않는다.
- sklearn의 경우. 원 핫 인코딩 처리를 하여 숫자화 한다. (get_dummies이용)
- 전처리 및 정제를 했으면, 훈련 데이터와 테스트 데이터를 분류하자.
- 결측치 처리 : Null, NAN과 같은 값을 처리한다.
- 모델링 및 훈련 : 모델은 sklearn에서 가져다 쓸거니까... 훈련만 시키면된다. 해당 모델을 불러와서 학습시키자.
- 평가 : 테스트 데이터를 예측한 결과가 실제 정답과 얼마나 유사한지 측정한다.
이정도가 될 수 있겠다.
깨달은 점
- DataFrame에서 내가 예측하고자 하는 속성이 있다면, 해당 속성을 y값으로 둔다.
- 그리고 해당 속성을 제외한 나머지는 X값이 된다.
- 여기서, 불필요하다고 판단되는 속성(column)은 제거하자.
- 혹은 원 핫 인코딩을 하자.
- 모델을 학습시키고 예측하여 정확도를 도출하는 과정을 이해하자.
- 데이터 불러오기
- 데이터 전처리(이상한 값, Feature를 없애자)
- 테스트 데이터와 훈련 데이터 분리 (보통 3:7, 2:8 이라고 한다)
- 모델을 불러와서 fit함수로 모델 학습
- predict함수로 테스트 데이터를 모델에 집어넣은 결과 도출
- 그렇게 나온 결과를 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도 해주었다.
'프로그램 > SKT FLY AI' 카테고리의 다른 글
SKT FLY AI - 번외. 첫날~워크샵 (0) | 2023.07.01 |
---|---|
SKT FLY AI : 5일차 - ML (0) | 2023.06.30 |
SKT FLY AI : 2일차 - 끄적이는 글(2). 머신러닝(기계학습) (0) | 2023.06.27 |
SKT FLY AI : 2일차 - 끄적이는 글(1) - Crawling, Seaborn, folium (0) | 2023.06.27 |
SKT FLY AI : 1일차 - 끄적이는 글(2). pandas (0) | 2023.06.26 |