지난 시간에 이어서 데이터로 머신러닝을 만들어 보자
머신러닝도 지난시간에 언급했듯 여러가지 방법이 존재하는데 이번 시간엔 LinearRegression을 모델을 세워 예측해보겠다.
조금 수학적인 얘기로 LinearRegression 모델은 직선방정식으로 결과값을 예측하는 방법으로
y=ax+b
위에 식에서 a는 기울기 또는 계수 b는 y절편이 되는데 이 두개의 값으로 그래프에 선을 그릴수 있으며 그래프 상에 점으로 나타나는 분포와 거의 일치 할때까지 컴퓨터가 a,b값을 찾는것이 이 LinearRegression이라고 한다.
이제 한번 절차대로 해보자
우선 데이터를 불러오자
#데이터를 폴더에서 불러온다.
df=pd.read_csv('../data/Data.csv')
df
머신러닝에 쓸 함수들을 호출 해주자
# Data Preprocessing Template
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
nan값을 확인하고 있으면 그 행을 제거해준다.
df.isna()
df=df.dropna()
지도 학습을 하기 위해선 데이터를 입력 값 X와 결과 값 y로 분리해야 한다.
입력값은 입력할값을 결과는 결과를 도출할 데이터로 선정한다.
따라서 X는 Country,Age,Salary 컬럼의 데이터만 y는 Purchased 컬럼만 쓴다.
X = df.loc[ : , 'Country':'Salary' ]
y = df['Purchased']
X
y
분리된 데이터에서 카테고리컬 데이터를 확인한다.
# 컨트리 컬럼은, 3개의 문자열로 되어있는 카테고리컬 데이터이다.
# 따라서, 어떤 데이터로 되어있는지 확인하되,
# 정렬해서 확인한다.
sorted(X['Country'].unique())
>>> ['France', 'Germany', 'Spain']
y는 카테고리컬 데이터지만 결과 데이터이기 때문에 확인하지 않는다. (3개 이상일경우는 확인필수)
카테고리컬 데이터가 3개이상이고 문자열일땐 One-Hot Encoding 으로 숫자로 바꿔 준다.
# 원핫 인코딩으로 바꾸고 싶은 컬럼의 인덱스를 써준다.
#[0]이라고 써준다.
#만약에 원핫인코딩으로 바꾸고 싶은 컬럼이 여러개이면,
#리스트안에 인덱스만 써주면 된다. 예) [1,4,5]
#컬럼 인코딩 함수를 호출
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
from sklearn.compose import ColumnTransformer
#함수 이름 변경 저장
ct=ColumnTransformer([('encoder',OneHotEncoder(),[2])],remainder = 'passthrough')
#X데이터를 숫자 변환하고 저장
X = ct.fit_transform(X)
#remainder passthrough 원핫인코딩이 아닌 컬럼들은 냅둬라!
#원핫인코딩 한 컬럼은 맨앞으로 빠진다.
X
>>> array([[1.0e+00, 0.0e+00, 0.0e+00, 4.4e+01, 7.2e+04],
[0.0e+00, 0.0e+00, 1.0e+00, 2.7e+01, 4.8e+04],
[0.0e+00, 1.0e+00, 0.0e+00, 3.0e+01, 5.4e+04],
[0.0e+00, 0.0e+00, 1.0e+00, 3.8e+01, 6.1e+04],
[1.0e+00, 0.0e+00, 0.0e+00, 3.5e+01, 5.8e+04],
[1.0e+00, 0.0e+00, 0.0e+00, 4.8e+01, 7.9e+04],
[0.0e+00, 1.0e+00, 0.0e+00, 5.0e+01, 8.3e+04],
[1.0e+00, 0.0e+00, 0.0e+00, 3.7e+01, 6.7e+04]])
y데이터는 카테고리컬 데이터가 2개이므로 레이블 인코딩으로 변환한다.
#일단 알파벳(글자)순서로 정렬
sorted(y.unique())
>>> ['No', 'Yes']
#레이블 인코딩 함수를 encoder_y로 저장
encoder_y = LabelEncoder()
#인코딩 후 y데이터로 저장
y=encoder_y.fit_transform(y)
y
>>>> array([0, 1, 0, 0, 1, 1, 0, 1])
이제 피처 스케일링을 진행해야 한다. X데이터가 모두 같은 범위에 수치가 아니기 때문이다.
#피처 스케일 함수 호출
from sklearn.preprocessing import MinMaxScaler
Normalizing (정규화)
#X 용 피쳐 스케일링
#m_scaler로 저장
m_scaler_x =MinMaxScaler()
#정규화하고 다시 X데이터에 저장
X = m_scaler_x.fit_transform(X)
X
>>> array([[1. , 0. , 0. , 0.73913043, 0.68571429],
[0. , 0. , 1. , 0. , 0. ],
[0. , 1. , 0. , 0.13043478, 0.17142857],
[0. , 0. , 1. , 0.47826087, 0.37142857],
[1. , 0. , 0. , 0.34782609, 0.28571429],
[1. , 0. , 0. , 0.91304348, 0.88571429],
[0. , 1. , 0. , 1. , 1. ],
[1. , 0. , 0. , 0.43478261, 0.54285714]])
y데이터는 0과 1사이이기 때문에 인코딩은 따로 안해줘도 된다.(0,1이 아닐경우는 표준화나 정규화 해준다)
마지막으로 각각의 데이터를 train용과 test용으로 각각을 다시 나눈다.
# 나누기용 함수 호출
from sklearn.model_selection import train_test_split
#나눠서 4개의 데이터에 각각 저장(순서 매우 중요)
X_train, X_test, y_train, y_test=train_test_split(X,y,test_size=0.2,random_state= 3)
이제 데이터 전처리 작업은 끝났고 바로 다음에 데이터를 인공지능을 돌린다.
'머신러닝' 카테고리의 다른 글
머신러닝(11) K-NN으로 데이터를 예측해보자 (0) | 2022.12.02 |
---|---|
머신러닝(7) Linear Regression으로 데이터 예측하기 (0) | 2022.12.01 |
머신러닝(4) train,test 모델로 데이터 나누기 (0) | 2022.12.01 |
머신러닝(3) Feature Scaling 피처 스케일링 (0) | 2022.12.01 |
머신러닝(2) Supervised 러닝 Data Preprocessing과 카테고리컬 데이터 (0) | 2022.12.01 |