텐서플로우 Linear Regression 예시 설명 Part 2(실데이터)

실데이터(Real Data)를 이용한 Linear Regression

저번 시간에는 합성 데이터를 이용한 Linear Regression 예시를 알아봤는데 오늘은 실데이터를 이용한 Linear Regression 예시를 알아보겠다.

머신러닝에 필요한 라이브러리 가져오기(import) + 데이터 출력 조건 설정

import pandas as pd #pandas는 데이터 분류/네이밍을 위한 라이브러리.
import tensorflow as tf #tensorflow는 딥러닝을 하는데 사용하는 라이브러리.
from matplotlib import pyplot as plt #matplotlib는 데이터로 그래프를 그리는데 사용되는 라이브러리.
pd.options.display.max_rows = 10 #출력 시 최대 10줄까지 가능
pd.options.display.float_format = “{:.1f}”.format #데이터를 소수점 한자리까지 가능하도록 설정

csv파일에 있는 데이터 불러오기 

training_df = pd.read_csv(filepath_or_buffer=”https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv“) #데이터 불러오기
training_df[“median_house_value”] /= 1000.0 #training_df[“median_house_value”] = training_df[“median_house_value”]/1000.0
training_df.head() #상위 5개의 행 출력

training_df의 상위 5개의 행 출력

데이터 통계 출력

training_df.describe() #데이터 통계 출력

training_df의 데이터 통계 출력

*아래의 모델 학습 부분은 여기서 더 자세히 볼 수 있습니다. 이해가 가지 않으시면 한번 읽어보세요.

데이터를 학습시킬 모델 만들기

def build_model(my_learning_rate): #학습할 모델을 만드는 function
model = tf.keras.models.Sequential() #Sequential한 빈 모델을 만듦

model.add(tf.keras.layers.Dense(units=1, input_shape=(1,))) #모델에 하나의 뉴런을 가진 hidden layer 형성
model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=my_learning_rate), loss=”mean_squared_error”, metrics=[tf.keras.metrics.RootMeanSquaredError()]) #모델의 학습방식 설정
return model #학습한 모델 가져옴




모델 학습시키는 function 만들기

def train_model(model, df, feature, label, epochs, batch_size): #모델 학습시키는 function
history = model.fit(x=df[feature], y=df[label], batch_size=batch_size, epochs=epochs) #데이터를 넣어주고 모델 학습시키기
trained_weight = model.get_weights()[0] #학습이 끝난 모델의 비중 값
trained_bias = model.get_weights()[1] #학습이 끝난 모델의 편향 값
epochs = history.epoch #학습이 끝난 모델이 전체 데이터 셋을 몇번이나 처음부터 끝까지 학습했는지, 그 횟수가 epochs

hist = pd.DataFrame(history.history)
rmse = hist[“root_mean_squared_error”] #학습이 끝난 모델이 어떤 방식으로 학습했는지(어떤 식으로 loss를 줄여나갔는지), 각각의 epoch마다 root_mean_squared_error구함
return trained_weight, trained_bias, epochs, rmse #학습을 끝난 모델의 중요한 정보들 가져옴(위에 나열한 값들)

Feature, Label 그래프 만들기 (matplotlib 사용)

def plot_the_model(trained_weight, trained_bias, feature, label): #모델 그래프 만드는 function
plt.xlabel(feature) #x축 feature(input)값으로 설정
plt.ylabel(label) #y축 label(output)값으로 설정
random_examples = training_df.sample(n=200) #랜덤한 데이터들로 200개의 행 추출
plt.scatter(random_examples[feature], random_examples[label]) #(x,y)값 그래프에 그리기

x0 = 0
y0 = trained_bias #[x0,y0] = [0,편향(bias)]
x1 = 10000
y1 = trained_bias + (trained_weight * x1) #[x1,y1] = [x1, 비중(weight)*x1(input)+편향(bias)]
plt.plot([x0, x1], [y0, y1], c=’r’) # [x0,y0]에서 [x1,y1]를 잇는 빨간 선 그래프 그리기(c는 color, r은 red 뜻)
plt.show() #전체 그래프 보여주기

plot_the_model 함수 읽으면 나오는 결과 (아래에 다시 언급)

Loss 그래프 만들기 (matplotlib 사용)

def plot_the_loss_curve(epochs, rmse): #Loss 그래프 만드는 function
plt.figure() #그래프 그릴 영역 확보
plt.xlabel(“Epoch”) #x축 epoch값으로 설정
plt.ylabel(“Root Mean Squared Error”) #y축 rmse값으로 설정

plt.plot(epochs, rmse, label=”Loss”) #Loss 그래프 그리기
plt.legend() #범례 형성
plt.ylim([rmse.min()*0.97, rmse.max()]) #y축 영역 정하기(y최소 값: rmse.min()*0.97, y최대 값: rmse.max())
plt.show() #전체 그래프 보여주기

plot_the_loss_curve 함수 읽으면 나오는 결과 (아래에 다시 언급)

방 수를 feature로 잡고 모델 학습시키기 + Feature, Label 그래프 그리기 + Loss 그래프 그리기 + 학습시킨 모델로 예측해보기(모델 정확도 확인)

learning_rate = 0.01
epochs = 30
batch_size = 30

my_feature = “total_rooms” #feature을 “total rooms”로 잡고
my_label=”median_house_value” #label을 “median house value”로 잡음

my_model = None #모델 초기화
my_model = build_model(learning_rate) #모델 만들기
weight, bias, epochs, rmse = train_model(my_model, training_df,my_feature, my_label,epochs, batch_size) #모델 학습시키기
plot_the_model(weight, bias, my_feature, my_label) #feature, label 그래프 그리기
plot_the_loss_curve(epochs, rmse) #loss값 그래프 그리기

30 epochs 학습
그림 1. Feature, Label 그래프(왼쪽), Loss 값 그래프(오른쪽)



학습시킨 모델로 데이터 예측해보기, 학습시킨 모델의 정확도 확인

def predict_house_values(n, feature, label):
batch = training_df[feature][10000:10000 + n] #10000에서 10000+n번째 데이터의 feature 값을 batch로 가지고 온다.
predicted_values = my_model.predict_on_batch(x=batch) #위의 batch를 우리가 만든 모델에 넣었을 때 어떤 label값을 도출하는지 데이터로 도출.

print(“feature label predicted”)
print(” value value value”)
print(” in thousand$ in thousand$”)
print(“————————————–“)

for i in range(n):
print (“%5.0f %6.0f %15.0f” % (training_df[feature][10000 + i], #10000에서 10000+n번째 데이터의 feature값 뽑기.
training_df[label][10000 + i], #10000에서 10000+n번째 데이터의 label값 뽑기(원래 데이터, 실데이터).
predicted_values[i][0] )) #10000에서 10000+n번째 데이터의 label값 뽑기(우리가 학습시킨 모델에 위의 batch, feature값을 넣었을 때)
predict_house_values(10, my_feature, my_label) #위의 함수 실행

표 1. 실데이터(feature, label값)과 우리가 학습시킨 모델의 label 값 출력

분석

그림 1과 표 1를 보면 우리가 학습시킨 모델의 정확도가 높지 않고 모델 학습에 실패했다는 것을 알 수 있다.
(그림 1 오른쪽을 보면 저 빨간 선이 데이터의 행동양식을 잘 표현하지 않고 또 왼쪽의 loss 값 그래프를 보면 loss 값이 0에 수렴하지 않고 학습을 마친 후에도 높다는 것을 볼 수 있다. 표 1의 label 값(두번째 열)과 predicted value in thousands(세번째 열)도 크게 차이난다는 것을 확인할 수 있다.)
이걸로 1.) 우리가 뽑은 10개의 데이터(batch)가 모델 학습에 적합하지 않거나(우리가 뽑은 10개의 데이터가 모든 데이터를 대변하는 데이터가 아닐 수 있다), 2.)우리가 feature값으로 정한 total rooms가 label인 median house value값에 크게 영향을 미치지 않을 수 있다는 걸 조심스럽게 추측해볼 수 있다.
이런 추측을 기반으로 모델 학습을 이어가보자.

집에서 사는 사람 수를 feature로 잡고 모델 학습시키기 + Feature, Label 그래프 그리기 + Loss 그래프 그리기 + 학습시킨 모델로 예측해보기(모델 정확도 확인)

my_feature = “population” #feature을 방 수에서 집에서 사는 사람 수로 바꾸었다.
learning_rate = 0.05
epochs = 18
batch_size = 3

my_model = build_model(learning_rate) #모델 만들기
weight, bias, epochs, rmse = train_model(my_model, training_df, my_feature, my_label, epochs, batch_size) #모델 학습시키기
plot_the_model(weight, bias, my_feature, my_label) #feature, label 그래프 그리기
plot_the_loss_curve(epochs, rmse) #Loss 그래프 그리기
predict_house_values(10, my_feature, my_label) #함수 실행

그림 2. Feature, Label 그래프(왼쪽, 여기서 feature은 population!), Loss 값 그래프(오른쪽)
표 2. 실데이터(feature, label값)과 우리가 학습시킨 모델의 label 값 출력(여기서 feature은 population!))

분석

그림 2과 표 2를 보면 우리가 학습시킨 모델의 정확도가 높지 않고 또 모델 학습에 실패했다는 것을 알 수 있다.
(그림 2 오른쪽을 보면 저 빨간 선이 데이터의 행동양식을 잘 표현하지 않고 또 왼쪽의 loss 값 그래프를 보면 loss 값이 0에 수렴하지 않고 학습을 마친 후에도 높다는 것을 볼 수 있다. 표 2의 label 값(두번째 열)과 predicted value in thousands(세번째 열)도 크게 차이난다는 것을 확인할 수 있다.)
이걸로 우리가 feature값으로 정한 population이 label인 median house value값에 크게 영향을 미치지 않을 수 있다는 걸 또 추측해볼 수 있다. 

한명당 쓰는 방 수(방 수/집에서 사는 사람 수)를 feature로 잡고 모델 학습시키기 + Loss 그래프 그리기 + 학습시킨 모델로 예측해보기(모델 정확도 확인) <Feature을 합성해서 만들어보자!, Synthetic Feature>

training_df[“rooms_per_person”] = training_df[“total_rooms”] / training_df[“population”]
my_feature = “rooms_per_person” #feature을 방 수/집에서 사는 사람 수로 바꿈.
learning_rate = 0.06
epochs = 24
batch_size = 30

my_model = build_model(learning_rate) #모델 만들기
weight, bias, epochs, mae = train_model(my_model, training_df, my_feature, my_label, epochs, batch_size) #모델 학습시키기
plot_the_loss_curve(epochs, mae) #Loss 그래프 그리기
predict_house_values(15, my_feature, my_label) #함수 실행

그림 3(왼쪽). Loss 값 그래프, 표 3(오른쪽). 실데이터(feature, label값)과 우리가 학습시킨 모델의 label 값 출력(여기서 feature은 total rooms/population!))

분석

그림 3과 표 3를 보면 우리가 학습시킨 모델의 정확도가 높지 않고 또 다시 한번! 모델 학습에 실패했다는 것을 알 수 있다.
(그림 3 loss 값 그래프를 보면 loss 값이 0에 수렴하지 않고 학습을 마친 후에도 높다는 것을 볼 수 있다. 표 3의 label 값(두번째 열)과 predicted value in thousands(세번째 열)도 크게 차이난다는 것을 확인할 수 있다.)
이걸로 우리가 feature값으로 정한 room per person(total rooms/population)도 label인 median house value값에 크게 영향을 미치지 않을 수 있다는 걸 또 다시 한번 추측해볼 수 있다. 
이렇게 세번이나 모델 학습에 실패했다. label과 관련있는 feature값을 알아야 그대로 모델을 학습시켜서 모델의 정확도를 높일텐데,, 흠,, 어떻게 해야할까?




이건 어떨까? Correlation Matrix를 만들어보자! (=Label과 관련있는 Feature을 찾아보자!)

training_df.corr() #우리가 가지고 있는 데이터로 correlation matrix를 만들어보자.

표 4. Training_df의 correlation matrix

분석

표 4를 보면 label인 median house value에서 median income의 값이 0.7로 가장 높은 것을 알 수 있다.
따라서 median income(집에서 사는 사람의 수입)을 feature로 하고 모델을 학습시키면 정확한 모델을 만들 수 있을 거 같다!
(median income을 feature로 하고 모델 학습시키는 부분은 이 글에서 생략하겠다. 시간나면 한번 스스로 만들어보셔요~)
*나중에 더 공부할텐데 median income을 feature로 하고 모델을 학습시키는 부분은 공정성과 윤리적인 부분에서 문제가 생길 수 있다고 합니다. 이 부분은 나중에 더 자세히 다룰게요!

*오늘 공부한 부분은 이 링크에서 전부 다 보실 수 있습니다. (모두에게 공개된 자료에요 ^_^)

Leave a Comment