데이터 전처리
기계학습 라이브러리 scikit-learn 을 사용하면 Loss 함수를 최솟값으로 만드는 β0, β1을 쉽게 구할 수 있습니다.
주어진 데이터를 sklearn에서 불러 올 선형 모델에 적용하기 위해서는 전 처리가 필요합니다.
이번 실습에서는 sklearn에서 제공하는 LinearRegression을 사용하기 위한 데이터 전 처리를 수행해보겠습니다.
sklearn의 LinearRegression 입력 값 형태
LinearRegression 모델의 입력값으로는 Pandas의 DataFrame의 feature (X) 데이터와 Series 형태의 label (Y) 데이터를 입력 받을 수 있습니다.
X, Y의 샘플의 개수는 같아야 합니다.
지시사항
X 데이터를 column 명이 X인 DataFrame으로 변환하고 train_X에 저장합니다.
리스트 Y를 Series 형식으로 변환하여 train_Y에 저장합니다.
import matplotlib as mpl
mpl.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
import elice_utils
eu = elice_utils.EliceUtils()
X = [8.70153760, 3.90825773, 1.89362433, 3.28730045, 7.39333004, 2.98984649, 2.25757240, 9.84450732, 9.94589513, 5.48321616]
Y = [5.64413093, 3.75876583, 3.87233310, 4.40990425, 6.43845020, 4.02827829, 2.26105955, 7.15768995, 6.29097441, 5.19692852]
"""
1. X의 형태를 변환하여 train_X에 저장합니다.
"""
train_X = pd.DataFrame(X, columns=['X'])
"""
2. Y의 형태를 변환하여 train_Y에 저장합니다.
"""
train_Y = pd.Series(Y)
# 변환된 데이터를 출력합니다.
print('전 처리한 X 데이터: \n {}'.format(train_X))
print('전 처리한 X 데이터 shape: {}\n'.format(train_X.shape))
print('전 처리한 Y 데이터: \n {}'.format(train_Y))
print('전 처리한 Y 데이터 shape: {}'.format(train_Y.shape))
학습하기
[실습1]에서 전 처리한 데이터를 LinearRegression 모델에 입력하여 학습을 수행해봅시다.
LinearRegression (sklearn)
LinearRegression을 사용하기 위해서는 우선 해당 모델 객체를 불러와 초기화해야 합니다. 아래 코드는 lrmodel에 모델 객체를 초기화 하는 것을 보여줍니다.
lrmodel = LinearRegression()
모델 초기화를 수행했다면 전 처리된 데이터를 사용하여 학습을 수행할 수 있습니다. 아래코드와 같이 fit 함수에 학습에 필요한 데이터를 입력하여 학습을 수행합니다.
lrmodel.fit(train_X, train_Y)
LinearRegression의 β0, β1
값을 구하기 위해서는 아래 코드를 사용하여 구할 수 있습니다.
beta_0 = lrmodel.intercept_
beta_1 = lrmodel.coef_[0]
지시사항
sklearn의 LinearRegression() 모델을 lrmodel에 초기화 합니다.
fit을 사용하여 train_X, train_Y 데이터를 학습합니다.
import matplotlib as mpl
mpl.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
import elice_utils
eu = elice_utils.EliceUtils()
X = [8.70153760, 3.90825773, 1.89362433, 3.28730045, 7.39333004, 2.98984649, 2.25757240, 9.84450732, 9.94589513, 5.48321616]
Y = [5.64413093, 3.75876583, 3.87233310, 4.40990425, 6.43845020, 4.02827829, 2.26105955, 7.15768995, 6.29097441, 5.19692852]
train_X = pd.DataFrame(X, columns=['X'])
train_Y = pd.Series(Y)
"""
1. 모델을 초기화 합니다.
"""
lrmodel = LinearRegression()
"""
2. train_X, train_Y 데이터를 학습합니다.
"""
lrmodel.fit(train_X, train_Y)
# 학습한 결과를 시각화하는 코드입니다.
plt.scatter(X, Y)
plt.plot([0, 10], [lrmodel.intercept_, 10 * lrmodel.coef_[0] + lrmodel.intercept_], c='r')
plt.xlim(0, 10)
plt.ylim(0, 10)
plt.title('Training Result')
plt.savefig("test.png")
eu.send_image("test.png")
예측하기
LinearRegression (sklearn)
LinearRegression을 사용하여 예측을 해야한다면 아래와 같이 predict 함수를 사용합니다.
pred_X = lrmodel.predict(X)
predict 함수는 DataFrame 또는 numpy array인 X 데이터에 대한 예측값을 리스트로 출력합니다.
지시사항
lrmodel을 학습하고 train_X의 예측값을 구하여 pred_X에 저장합니다.
import matplotlib as mpl
mpl.use("Agg")
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
import elice_utils
eu = elice_utils.EliceUtils()
X = [8.70153760, 3.90825773, 1.89362433, 3.28730045, 7.39333004, 2.98984649, 2.25757240, 9.84450732, 9.94589513, 5.48321616]
Y = [5.64413093, 3.75876583, 3.87233310, 4.40990425, 6.43845020, 4.02827829, 2.26105955, 7.15768995, 6.29097441, 5.19692852]
train_X = pd.DataFrame(X, columns=['X'])
train_Y = pd.Series(Y)
# 모델을 트레이닝합니다.
lrmodel = LinearRegression()
lrmodel.fit(train_X, train_Y)
"""
1. train_X에 대해서 예측합니다.
"""
pred_X = lrmodel.predict(train_X)
print('train_X에 대한 예측값 : \n{}\n'.format(pred_X))
print('실제값 : \n{}'.format(train_Y))
train_X 대신 X, Y, train_Y를 넣으면 ValueError
ValueError: Expected 2D array, got 1D array instead: