CDS

Machine Learning [Coding Sample]

juju824 2021. 11. 16. 23:49

👾 따로따로 공부하다보면 이게 어떻게 연결이 되는건지 감이 잘 안오기도 하는데 

코딩 샘플로 쭈욱 플로우를 보다 보니 이해가 훨씬 더 쉬워서 올리는, 

 

 

우선 비즈니스 이해부터 하는게 가장 중요한데 이번에 해본 코딩은 '주식' 관련 샘플 데이터를 다운받아 Close column, 즉 주식이 종료되는 시점 주가를 예측하는 작업이다

 

 

👉 전체적으로 데이터 파일csv을 다운받고, 데이터를 불러오고, 데이터를 확인한 다음 

👉 EDA 분석을 하고

👉 matplot 호출을 통해 그림 / 그래프를 그려보고

👉 학습을 위해 학습 데이터와 평가 데이터를 나눈뒤

👉 Linear Regression 모델을 학습시켜서 평가까지 진행한다 

👉 추가로 MinMaxScaler도 이용하여 범위 조정 후 다시 모델 학습을 진행해본다 

 

 

 

📌 주식 Close 때의 값 예측하기

#stock.csv를 이용하여 종가(close column)를 예측해보자

import pandas as pd

#데이터 불러오기
df = pd.read_csv("stock.csv")

#데이터 확인하기
df.head()
df.tail()

✔️ 아, df.tail() output으로 나온 데이터를 확인해보니 column이 5개가 있구나 

Open, High, Low, Volume, Close.. 주식이 오픈했을 때 가격, 최고가, 최저가, 그리고 Close는 마지막 끝났을 때 가격이겠고 Volume은 뭔지는 잘 모르겠다 가격 range가 가장 크군 

 

 

df.shape
#output) (732, 5)

✔️ pandas Dataframe shape을 보니까 732줄로 되어 있고 column이 5개라는 거구나 

기본적으로 데이터가 어떤 shape을 갖고 있는지 확인하는 건 중요

 

 

#EDA 분석해보기, 평균, 최소최댓값, 표준편차 등
df.describe()

✔️ describe()은 우선 pd. Dataframe에만 사용가능하며 numpy에 이용하려하면 에러가 나더라

describe()을 통해 나온 데이터들을 보니까 Open, High, Low는 비슷하고 Volume은 굉장히 수가 다른거에 비해 크네 

 

 

 

#matplot 호출하기
import matplotlib.pyplot as plt

#그림판 그리기
plt.figure(figsize = (15,5))

#boxplot 그리기
plt.boxplot( df["Open"] )
plt.show()

#scatterplot 그리기
plt.scatter( df["High"], df["Low"] )
plt.show()

boxplot

✔️ boxplot에서 맨위 맨아래 검은 선 두개는 max, min이며 가운데 주황선은 mean, 네모칸은 IQR로 75% 25%

 

✔️ High랑 Low를 그려본건데 직선처럼 나오는걸 보니 두개는 비례관계인가보다

 

 

 

👉 이제 데이터가 어떻게 생겼는지 대충 확인했으니 학습을 위한 준비가 필요하다

#학습을 위해 학습데이터와 test 데이터 나누기
#train_test_split을 어디서 불러오는 거인지 찾아보기 -> sklearn.model_selection임
from sklearn.model_selection import train_test_split

#예측하려고하는 종가인 Close 빼고 Open~Volume 까지 x로 놓는다
x = df.loc[ :, "Open":"Volume"]

#Close 값이 예측하려는 값이므로 Close만 y에 넣기
y = df.loc[ :, "Close"]

✔️ 데이터를 나누기 위해서 x값과 y값에 column을 나누어서 넣어주어야 한다 

우리가 구하고자, 예측하고자 하는 타겟 column은 'Close'이므로 'Close'만 y에 넣고 나머지는 x에다가 넣는다

 

 

 

#x와 y로 나눈 뒤로 shape혹 head, tail()을 통해 잘 나눠진 것인지 확인
x.shape
#output) (732, 4)


y.head()
#output) 
0    831.659973
1    828.070007
2    824.159973
3    818.979980
4    820.450012
Name: Close, dtype: float64

✔️ x와 y가 잘 나누어졌는지 shape과 head()를 통해 확인해보았다. 잘 나누어졌다

 

 

 

#학습/평가 데이터 나누기
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, shuffle = True)

✔️ test_size=0.2로 해서 학습 데이터 80%, 평가 데이터 20%로 잡았으며 shuffle을 True로 섞어줌으로써 데이터를 한번 섞고 나서 데이터를 골고루 나누어 주었다

 

 

 

#x와 y shape 확인을 통해 잘 나뉘어졌는지 확인
x_train.shape, x_test.shape

#output) ((585, 4), (147, 4))


y_train.shape, y_test.shape
#output) ((585,), (147,))

✔️ 학습 데이터와 평가 데이터가 잘 나누어졌는지 확인해보니 585줄, 147줄로 약 8:2로 잘 나누어진듯하다 

이제 LinearRegression 모델 학습을 시킬거다

 

 

 

#LinearRegression 모델 학습 위해 호출해오기
from sklearn.linear_model import LinearRegression

model = LinearRegression()

#학습하기
model.fit( x_train, y_train )

✔️ model.fit을 통해 학습을 시켰으면 이제 평가를 해서 잘 학습이 되었는지 확인해본다

 

 

 

#평가하기 (학습데이터)
model.score( x_train, y_train )

#output) 0.9989816461489236


#평가하기 (평가데이터)
model.score( x_test, y_test )

#output) 0.9989168683991834

✔️ train data와 test data모두 0.998...로 거의 1에 가깝다 

output으로 1에 가깝게 나오면 실제값이 완전 동일하게 예측한 것이기 때문에 train data외 test data까지 1이면 완벽한 모델이라고 판정

 

 

 

#model에 대한 coef라서 model이 지금 위에서 train data를 이용하여 했기 때문에 이미 학습된 train data로 coefficient구해보기

model.coef_

#output) array([-5.82384018e-01,  7.48675131e-01,  8.32368148e-01, -4.06641439e-08])
Open High Low Volume
-5.82384018e-01 7.48675131e-01 8.32368148e-01 -4.06641439e-08

✔️ 위와 같이 coef가 나온다는 말인데 해석을 해보면,

시작가 -5 ... Close 값을 내리는 영향을 준다 
최고가에 0.7, 최저가에 0.8을 곱했으니 양수이기 때문에 Close 값을 감소시키는게 아니라 + 영향을 준다는 뜻이다

 

 

 

 

👉 df.describe()으로 다시 확인해보자

df.describe()

✔️ 확인해보면 Open,High,Low 숫자의 range가 비슷하고 Volume은 크기가 커서 Open,High,Low와 비교가 어려움 

 

 

 

👉 그럼 MinMaxScaler를 이용하여 0~1로 숫자 range를 다 맞춰주고 진행해보자 

#MinMaxScaler 호출하기
from sklearn.preprocessing import MinMaxScaler

scaled_x = MinMaxScaler().fit_transform(x)
pd.DataFrame(scaled_x).describe()

✔️ 수가 이제 column에 상관없이 0-1사이로 조정되었다. scaling이 잘 되었군

 

 

👉 다시 LinearRegression 모델을 학습시키고 평가해본다

#학습/평가 데이터로 나누기.. test_size=0.2이므로 80% 20%로
#순서대로 A_분리1, A_분리2, B_분리1, B_분리2
x_train, x_test, y_train, y_test = train_test_split(scaled_x, y, test_size=0.2, shuffle=True)

x_train.shape, x_test.shape
#output) ((585, 4), (147, 4))

#model링 방법 정하기
model = LinearRegression()

#학습시키기
model.fit( x_train, y_train )

#평가하기 (학습 데이터)
model.score( x_train, y_train )
#output) 0.9989226950149593

#평가하기 (평가 데이터)
model.score( x_test, y_test )
#output) 0.9991343827080426

✔️ train, test data 둘다 score output이 굉장히 좋다 거의 1에 가깝다 

거의 실제값에 동일하게 예측한 것이므로 완벽한 모델이라고 판정

 

 

 

model.coef_
#output) array([-192.79578298,  244.76987773,  291.22644364,    1.23184372])
Open High Low Volume
-192.79578298 244.76987773 291.22644364 1.23184372

✔️  나온 coefficient값을 해석해보면

4번째 값 거래량은 1.23..으로 작기 때문에 크게 영향을 미치지 않는구나 -> 무시해도 됨 
1번째 값 Open은 음수이기 때문에 종가 Close 값에 음의 영향을 미침 
2번째 3번째 값 High와 Low는 양수이기 때문에 종가 Close 값에 양의 영향을 미침

 

👉 시각화를 해보면 더 와닿는다

시각화를 하면 더 안다 Volume은 정말 무시해도 될만한 계수이구나.. 

 

 

👾  여기까지 찬찬히 플로우를 살펴보면서 진행해보았다

실제로 전체적인 모습을 보면서 코딩해보니 이해가 훨 잘 되었단

늘은 이만 자야지! 👾

'CDS' 카테고리의 다른 글

Machine Learning [Linear Regression]  (0) 2021.11.16
Machine Learning [Scaling]  (0) 2021.11.15
Machine Learning [K-NN]  (0) 2021.11.15
Machine Learning [Scikit-Learn]  (0) 2021.11.15
Machine Learning Overview  (0) 2021.11.15