Chapter7

중고등학생을 위한 머신러닝

Chapter 7 : Machine Learning Concepts

머신러닝을 하기 위한 준비과정을 잘 준비하였으니, 이제 본격적으로 머신러닝이 무엇인지 알아볼까요?

머신러닝은 우리에게 주어진 X(벡터)들의 집합(행렬)을 통하여 y(실제값)을 예측하기 위한 방법이에요.

그리고 머신러닝의 문제는 크게 두 개로 나뉘어요. 회귀문제(Regression)와 분류문제(Classification)로 나누어지죠. 두 개 다 처음 듣는 말이라 생소할 수 있어요. 그럼 차근차근히 알아볼까요?

회귀란?

In [1]:
import matplotlib.pyplot as plt
%matplotlib inline
x= range(1,11)
y=[]
for data in x:
    y.append(data*2)
## 같은 연산
y=[2*data for data in x]

위 데이터는 $y = 2x$에요.

In [2]:
plt.scatter(x,y)
Out[2]:
<matplotlib.collections.PathCollection at 0x7fe70b1e9210>

우리가 이러한 그래프를 보았을 때 우리는 구체적인 값을 몰라도, x가 올라가면서 y가 올라간다는 것을 알 수 있어요.

그럼 컴퓨터에게 어떻게 이러한 관계를 알려줄 수 있을까요? 이러한 추세 혹은 관계를 찾기 위해 불려지는 문제를 회귀문제(Regression Problem)라고 해요. 즉, 컴퓨터에게 이 데이터가 어느 정도로(기울기) 올라가거나 혹은 내려간다는 것을 학습시키는거죠.

분류란?

In [3]:
import pandas as pd
wine=pd.read_csv('https://ocw.mit.edu/courses/sloan-school-of-management/15-097-prediction-machine-learning-and-statistics-spring-2012/datasets/wine.csv',header=None)
Alcohol=list(wine.ix[:,0]);
Acid=list(wine.ix[:,1]);
proline=list(wine.ix[:,12])
plt.scatter(Acid,proline,c=Alcohol)
Out[3]:
<matplotlib.collections.PathCollection at 0x7fe7078d6d50>

저번 시간에 봤던 예제죠? 이 그래프는 알코올을 기준으로 색깔을 나뉘었는데, 알코올이 얼마이냐에 따라서 집단(군집)이 나뉘어지는 것을 볼 수 있어요. 사람은 그래프를 보면서 어딜 기준으로 집단을 나눌 수 있겠구나 생각하는 것처럼 기계에도 어느 기준으로 집단을 분류하라는 것이 분류문제에요.

그러면 컴퓨터는 어떻게 값을 예측하는 지 살펴볼까요?

In [4]:
from sklearn.linear_model import LinearRegression
linearmodel= LinearRegression()
X=pd.Series(x)
y=pd.Series(y)
X=X.reshape(-1,1)
linearmodel.fit(X,y)
predicted=linearmodel.predict(X)
plt.plot(X,predicted)
/home/ki/.local/lib/python2.7/site-packages/ipykernel/__main__.py:5: FutureWarning: reshape is deprecated and will raise in a subsequent release. Please use .values.reshape(...) instead
Out[4]:
[<matplotlib.lines.Line2D at 0x7fe6fcd0d250>]
In [5]:
# x의 계수는?
linearmodel.coef_
Out[5]:
array([ 2.])

$y = 2x$와 같은 쉬운 문제는 정확하게 맞출 수 있죠?

조금 더 어려운 문제라면?

In [6]:
linearmodel= LinearRegression()
X=wine.ix[:,1]
X=X.reshape(-1,1)
linearmodel.fit(X,wine.ix[:,3])
predicted=linearmodel.predict(X)
plt.scatter(wine.ix[:,1],wine.ix[:,3])
plt.plot(X,predicted,color='red')
/home/ki/.local/lib/python2.7/site-packages/ipykernel/__main__.py:3: FutureWarning: reshape is deprecated and will raise in a subsequent release. Please use .values.reshape(...) instead
  app.launch_new_instance()
Out[6]:
[<matplotlib.lines.Line2D at 0x7fe6fcd0dcd0>]

컴퓨터는 직선으로만 값을 예측하고 있는데, 실제값은 차이가 많이나죠? 이러한 차이를 오차라고 불러요. 뒤에 분류문제에 대한 예측값을 보면 이해가 더 쉬울거에요.

In [7]:
from sklearn.linear_model import LogisticRegression
logistic=LogisticRegression()
logistic.fit(wine.ix[:,[1,12]],wine.ix[:,0])
predicted=logistic.predict(wine.ix[:,[1,12]])
plt.figure(1)
plt.subplot(221)
plt.scatter(wine.ix[:,1],wine.ix[:,12],c=predicted)
plt.title("Predicted")
plt.subplot(222)
plt.scatter(Acid,proline,c=Alcohol)
plt.title("Actual")
Out[7]:
<matplotlib.text.Text at 0x7fe6fcb47c90>

코드는 점차 알게 될테니 걱정하지마세요. 위의 그림과 비교해보면 차이가 있는 것을 알 수 있어요. 즉, 예측한 값과 실제값이 차이가 발생하게 되는데, 이러한 차이를 오차(error)라고 해요. 편의상 오차를 e라고 할게요!

우리의 모델을 함수라고 생각한다면 다음과 같이 표현할 수 있죠.

$$y= f(x) + e$$

y(실제값) = f(x)(모델로 예측된 값) + e(오차)

머신러닝은 회귀,분류문제 모두 우리가 갖고있는 데이터(x)로 예측하고 싶은 변수(y)를 예측하는 방법론이에요. 그리고 예측값과 실제값의 차이를 오차라고 하죠.

In [ ]: