개발노트/kaggle 데이터를 활용한 머신러닝 예제

[선형회귀] 연차에 따른 연봉은 어떻게 예측할 수 있을까?

lovvepearl 2022. 1. 6. 12:27

먼저, kaggle 데이터를 활용하기 위해서는

홈페이지에 가입한 뒤 오른쪽 상단의 프로필을 클릭한다.

스크롤을 내리다보면 아래와 같이 create New API Token 을 발행할 수 있다. 

토큰이 발행되면 코드의 username 과 key 값에 대입하여 실행한다. 

import os
os.environ['KAGGLE_USERNAME'] = 'username' 
os.environ['KAGGLE_KEY'] = 'key'

# 리눅스 명령을 사용하여 데이터셋을 다운로드
!kaggle datasets download -d rsadiq/salary

# 다운로드한 파일의 압축풀기(.csv 확장자로 생성됨)
!unzip salary.zip

# 필요한 라이브러리 import 하기
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam, SGD
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns
from sklearn.model_selection import train_test_split

# pandas를 사용하여 데이터셋의 상위 5개의 데이터를 읽어온다. 
df = pd.read_csv('Salary.csv')
df.head(5)

pandas 로 읽어온 데이터

# 데이터의 크기를 표시한다. 
print(df.shape)

# x,y값을 설정하여 좌표에 데이터를 표시한다. 
sns.pairplot(df, x_vars=['YearsExperience'], y_vars=['Salary'], height=4)

# 데이터 가공 단계
# keras는 numpy array 데이터만 취급한다. 
# tensorflow는 데이터 타입을 folating point 32bit만 사용한다.
x_data = np.array(df[['YearsExperience']], dtype=np.float32)
y_data = np.array(df['Salary'], dtype=np.float32)

print(x_data.shape)
print(y_data.shape)

# 뒤를 1로 맞추고 앞을 변형하라는 reshape를 사용하여
# 데이터셋의 크기를 동일하게 맞춰준다. 
x_data = x_data.reshape((-1, 1))
y_data = y_data.reshape((-1, 1))

print(x_data.shape)
print(y_data.shape)

# train(학습) 데이터와 validation(검증) 데이터를 8:2로 나눈다.
x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.2, random_state=2021)

print(x_train.shape, x_val.shape)
print(y_train.shape, y_val.shape)

# 학습시키기
# 결과값이 1개 임으로 dense는 1로 설정
# optimizer를 SGD로 설정하여 경사하강법 사용
# lr(learning rate)은 노가다로 설정
# validation_date 를 통해 epoch이 끝날 때마다 검증
model = Sequential([
  Dense(1)
])

model.compile(loss='mean_absolute_error', optimizer=SGD(lr=290))

model.fit(
    x_train,
    y_train,
    validation_data=(x_val, y_val), 
    epochs=100 
)

epoch이 끝날때마다 검증된 val_loss의 값이 최소값이 될 수 있도록

loss나 optimizer, learning rate 를 바꿔가며 실험한다. 

 

# 예측한 값을 pred라고 정의하고 빨간색으로 표시한다.
# 예측값과 검증값을 좌표에 표시하여 비교한다.
y_pred = model.predict(x_val)

plt.scatter(x_val, y_val)
plt.scatter(x_val, y_pred, color='r')
plt.show()

가설(빨간색)과 데이터셋(파란색)이 비슷한 양상을 띔으로 학습이 잘 되었다고 볼 수 있다.

 

연차가 4년이면 연봉은 5500만원, 연차가 7년이면 연봉은 8500만원으로 예측된다.

 

연차가 높을 수록 연봉이 높아진다는 상관관계를 통해

연차에 따른 연봉을 계산할 수 있는 기계를 모델링해 보았다.