티스토리 뷰

Untitled9

회귀는 근사 : 속성에 대해서 타겟값에 근사하는 직선을 그음
분류는 구분 : 속성에 대해서 타겟값을 분류하는 직선을 그음(클래스를 구분)

sklearn 적용 기본틀

Iris 데이터 불러오기

In [2]:
import numpy as np

from sklearn.datasets import load_iris

iris = load_iris()

학습용/테스트용 데이터 분리

In [46]:
from sklearn.model_selection import train_test_split

col1 = 3
col2 = 0

X = iris.data[:,[col1, col2]]
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y)

모델선정하기

In [47]:
from sklearn.neighbors import KNeighborsClassifier

model = KNeighborsClassifier(n_neighbors=1)

학습시키기 -fit() 함수

In [48]:
model.fit(X_train, y_train)  # 디폴트 값 출력
Out[48]:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=1, p=2,
           weights='uniform')

평가(검증)하기

In [49]:
model.score(X_test, y_test)
Out[49]:
0.9473684210526315
In [50]:
pred_y=model.predict(X_test)
display(pred_y, y_test)
array([2, 2, 1, 0, 1, 1, 0, 2, 0, 0, 2, 0, 0, 1, 1, 0, 0, 0, 2, 2, 1, 1,
       2, 2, 1, 1, 2, 0, 2, 0, 1, 0, 0, 0, 2, 1, 1, 2])
array([2, 2, 1, 0, 2, 1, 0, 2, 0, 0, 2, 0, 0, 1, 1, 0, 0, 0, 2, 2, 1, 1,
       2, 1, 1, 1, 2, 0, 2, 0, 1, 0, 0, 0, 2, 1, 1, 2])
In [51]:
pred_y == y_test
Out[51]:
array([ True,  True,  True,  True, False,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True, False,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True])

그림 그리기

In [52]:
import matplotlib.pyplot as plt 
import mglearn

plt.figure(figsize=[8,6])
mglearn.plots.plot_2d_classification(model, X_train, fill=True, eps=0.5, alpha=0.4)
mglearn.discrete_scatter(X_train[:,0], X_train[:,1], y_train) # 학습용 데이터 그리기
Out[52]:
[<matplotlib.lines.Line2D at 0x1af74fb128>,
 <matplotlib.lines.Line2D at 0x1af74fb860>,
 <matplotlib.lines.Line2D at 0x1af74fbc50>]
In [53]:
import matplotlib.pyplot as plt 
import mglearn

plt.figure(figsize=[8,6])
mglearn.plots.plot_2d_classification(model, X_train, fill=True, eps=0.5, alpha=0.4)
mglearn.discrete_scatter(X_test[:,0], X_test[:,1], y_test) # 테스트 데이터 그리기
Out[53]:
[<matplotlib.lines.Line2D at 0x1aee248fd0>,
 <matplotlib.lines.Line2D at 0x1aee235d30>,
 <matplotlib.lines.Line2D at 0x1aee235a58>]

학습용 데이터와 테스터 데이터에 대해서 각각 점을 찍어 비교해보면 좋다.

옵션에 따른 학습용 데이터와 훈련 데이터

In [54]:
import numpy as np

from sklearn.datasets import load_iris

iris = load_iris()
In [55]:
from sklearn.model_selection import train_test_split

X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y)
In [56]:
from sklearn.neighbors import KNeighborsClassifier

model = KNeighborsClassifier(10)
In [57]:
model.fit(X_train, y_train) 
Out[57]:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=10, p=2,
           weights='uniform')
In [58]:
model.score(X_test, y_test)
Out[58]:
0.9473684210526315
In [59]:
pred_y=model.predict(X_test)
display(pred_y, y_test)
array([2, 0, 2, 2, 2, 2, 1, 1, 1, 2, 1, 2, 0, 1, 1, 2, 0, 2, 2, 1, 1, 0,
       0, 2, 2, 1, 0, 1, 2, 0, 0, 0, 1, 2, 0, 0, 1, 0])
array([2, 0, 1, 2, 2, 2, 1, 1, 1, 1, 1, 2, 0, 1, 1, 2, 0, 2, 2, 1, 1, 0,
       0, 2, 2, 1, 0, 1, 2, 0, 0, 0, 1, 2, 0, 0, 1, 0])
In [60]:
score_train = model.score(X_train, y_train)
score_test = model.score(X_test, y_test)

display(score_train, score_test)
0.9821428571428571
0.9473684210526315

옵션을 잘 줄수록 학습용 데이터의 점수는 올라간다. 그러나 테스트 데이터의 점수는 학습용 데이터의 점수보다 조금 낮은 값을 가지는 경향을 보이며 학습용 데이터와 마찬가지로 옵션을 잘 줄수록 점수가 점점 올라가지만, 과적합이 넘어가면 다시 떨어진다. (과적합이 아닌 요소에 대해서도 바뀔수 있다.). 여하튼 그 최대값이 되는 옵션값을 찾아야 한다.

In [62]:
X_train, X_test, y_train, y_test = train_test_split(X, y)

import matplotlib.pyplot as plt

train_scores = []  # 옵션을 바꿔가며 계속 돌려본다.
test_scores = []

for i in range(1,31):
    
    model = KNeighborsClassifier(n_neighbors=i)
    model.fit(X_train, y_train)

    score1 = model.score(X_train, y_train)
    score2 = model.score(X_test, y_test)
    
    train_scores.append(score1)
    test_scores.append(score2)
    
plt.plot(range(1,31),train_scores,'bo-',label='train scores')
plt.plot(range(1,31),test_scores,'r*-',label='test scores')
plt.ylim(0.8,1.)
plt.legend(loc='lower center')
Out[62]:
<matplotlib.legend.Legend at 0x1aee68d240>

테스트 스코어는 변동성이 크고 k값이 클수록 감소하는 경향을 보인다. 둘다 높은 점수이고, 안정된 경향을 보이는 6~7정도가 괜찮은 것 같다.

그래프를 읽는 능력, 옵션값이 얼마인지 찾는 능력 등..

In [65]:
import matplotlib.pyplot as plt

train_scores = []  # 옵션을 바꿔가며 계속 돌려본다.
test_scores = []

for i in range(1,31):
    
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    
    model = KNeighborsClassifier(n_neighbors=i)
    model.fit(X_train, y_train)

    score1 = model.score(X_train, y_train)
    score2 = model.score(X_test, y_test)
    
    train_scores.append(score1)
    test_scores.append(score2)
    
plt.plot(range(1,31),train_scores,'bo-',label='train scores')
plt.plot(range(1,31),test_scores,'r*-',label='test scores')
plt.ylim(0.8,1.)
plt.legend(loc='lower center')
Out[65]:
<matplotlib.legend.Legend at 0x1aee80bcc0>

'beginner > 파이썬 머신러닝 기초' 카테고리의 다른 글

지도학습 - 선형회귀  (1) 2019.02.27
와인 데이터 분석  (0) 2019.02.26
Numpy를 활용한 수치근사법  (0) 2019.02.25
지도학습 - k-NN분류  (0) 2019.02.25
지도학습개요  (0) 2019.02.25
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함