[Python.NumPy] Y값 모델링 및 모델 평가 방법론

2020. 11. 30. 18:00Python과 머신러닝/NumPy 데이터 분석

0. 요약

  • Boston Housing Data를 가지고 Y값을 예측해보는 실습을 해보자.
  • Data를 웹으로부터 읽어 들이고, 벡터 곱을 하기 전 전처리를 수행하고,
  • 벡터 곱을 통해 예측 Y값을 계산한 뒤에
  • 실제 Y값과 비교하는 실습을 해보려고 한다.
  • 총코드는 다음과 같다.
import pandas as pd

# 데이터 불러오기 & Column header 추가
data_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data'  # Data URL
df_data = pd.read_csv(data_url, sep='\s+', header=None)  # csv 타입 데이터 로드
print(df_data.values.shape)  # 현재 데이터의 row x column의 개수를 알려주는 함수
df_data.columns = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM',
                   'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
# 데이터의 컬럼(HEADER)를 직접 추가해줄 수 있음

# 원하는 값을 y변수로 이동하고, numpy 데이터 타입으로 변환하기
y = df_data.pop('MEDV')
df_matrix = df_data.values  # numpy 데이터 타입으로 변환
print(df_matrix.shape)  # 데이터 확인

# Random한 weight vector 생성 및 벡터곱 연산 수행하기
weight_vector = np.random.random_sample(size=(14, 1)) # 14x1의 random vector 생성하여 weight_vector에 담기
df_matrix.dot(weight_vector)[:5]  # 첫 5행에 대해, random weight로 계산했을 때 나오는 예상 y값

# 실측치와 비교하여 모델 평가하기
y[:5]  # 실제 5행에 대한 y 값. 당연히 random으로 생성한 weight이기 때문에 택도 없음

 

1. 데이터 불러오기 및 Column Header 추가하기

# 데이터 불러오기 & Column header 추가
data_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data'  # Data URL
df_data = pd.read_csv(data_url, sep='\s+', header=None)  # csv 타입 데이터 로드
print(df_data.values.shape)  # 현재 데이터의 row x column의 개수를 알려주는 함수
df_data.columns = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM',
                   'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
# 데이터의 컬럼(HEADER)를 직접 추가해줄 수 있음
  • 지난 시간에 배웠던 것과 동일하게 원하는 URL로부터 CSV 형태의 데이터를 읽어 들일 수 있다 
  • df_data.values는 data의 전체 데이터 값을 읽어들이는 함수이고,
  • .shape해 데이터의 row x column의 크기를 알려주는 함수이다. 이 함수를 통해 내 데이터가 어떻게 생겼는지 간단하게 확인이 가능하다.
  • df_data.columns = 연산을 통해서 각 Attribute에 이름을 추가할 수 있다. Excel에서 헤더를 추가하는 동작과 동일하다.

 

2. 원하는 값을 y변수로 이동하고, numpy 데이터 타입으로 변환하기

# 원하는 값을 y변수로 이동하고, numpy 데이터 타입으로 변환하기
y = df_data.pop('MEDV')
df_matrix = df_data.values  # numpy 데이터 타입으로 변환
print(df_matrix.shape)  # 데이터 확인
  • 우리의 궁극적인 목표는 데이터의 독립변수 X들을 weight vector와 곱하여서, 원하는 y값이 나오는지를 확인하는 것이다.
  • 그렇기 때문에 df_data에서 y값은 따로 빼주고, df_data의 x값들을 weight vector와 곱해줘야 한다.
  • df_data.pop 함수는 기존 데이터에서 주어진 column을 잘라내어 반환하는 함수이다.
  • 그렇게 남은 x변수의 값들을 .values 연산을 통해 df_matrix에 numpy 형태로 옮겨 담는다.
  • 다시 한번 .shape연산을 통해 column은 한 개 줄고, row들은 동일한지 확인할 수 있다. 

 

3. Random 한 weight vector 생성 및 벡터 곱 연산 수행하기

# Random한 weight vector 생성 및 벡터곱 연산 수행하기
weight_vector = np.random.random_sample(size=(14, 1)) # 14x1의 random vector 생성하여 weight_vector에 담기
df_matrix.dot(weight_vector)[:5]  # 첫 5행에 대해, random weight로 계산했을 때 나오는 예상 y값
  • np.random.random_sample 함수를 통해 원하는 size로 random 값을 생성할 수 있다.
  • 위의 코드는 14x1 size의 random 한 값들을 생성하여 weight_vector로 정의하였다.
  • .dot 함수를 통해 벡터 곱을 수행하면, 각 instance에 random vector를 곱한 y 값의 예측치가 나온다.
  • 여기에 [:5]를 하면 상위 5개 row만 slicing 한다 (첫 5행만 눈으로 보고 확인하기 위한 코드이다).

 

4. 실측치와 비교하여 모델 평가하기

y[:5]  # 실제 5행에 대한 y 값. 당연히 random으로 생성한 weight이기 때문에 택도 없음
  • 마지막으로 아까 .pop 함수를 통해 뽑아놓았던 y값 실측치 중 상위 5개 행을 출력하여 비교한다.
  • 우리의 weight_vector는 random 하게 생성된 값들이기 때문에 터무니없고 아무런 관계없는 값 들일 것이다.
  • Machine Learning이란 기계를 학습시켜 이 weight_vector에 적합한 값들을 구하는 것이고, Test Data를 가지고 실측치와 비교하여 모델을 평가하는 과정으로 진행된다.

 

5. 마무리

  • 이번 시간에는 Data 전처리의 가장 기초 단계 실습을 했다.
  • 데이터 읽어오기 -> y값 분리하기 -> NumPy 형태로 변환하기
  • 그런 후 weight_vector를 (random 하게나마) 생성했고,
  • 벡터 곱을 통해 예상 y값들을 처음으로 계산해보았다. 
  • Machine Learning이란 실제 Y값과 유사한 예측 Y값을 잘 계산하는 weight_vector를 Train Data를 통해서 추출하는 것이다.