티스토리 뷰
회귀는 근사 : 속성에 대해서 타겟값에 근사하는 직선을 그음
분류는 구분 : 속성에 대해서 타겟값을 분류하는 직선을 그음(클래스를 구분)
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]:
평가(검증)하기¶
In [49]:
model.score(X_test, y_test)
Out[49]:
In [50]:
pred_y=model.predict(X_test)
display(pred_y, y_test)
In [51]:
pred_y == y_test
Out[51]:
그림 그리기¶
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]:
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]:
학습용 데이터와 테스터 데이터에 대해서 각각 점을 찍어 비교해보면 좋다.
옵션에 따른 학습용 데이터와 훈련 데이터¶
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]:
In [58]:
model.score(X_test, y_test)
Out[58]:
In [59]:
pred_y=model.predict(X_test)
display(pred_y, y_test)
In [60]:
score_train = model.score(X_train, y_train)
score_test = model.score(X_test, y_test)
display(score_train, score_test)
옵션을 잘 줄수록 학습용 데이터의 점수는 올라간다. 그러나 테스트 데이터의 점수는 학습용 데이터의 점수보다 조금 낮은 값을 가지는 경향을 보이며 학습용 데이터와 마찬가지로 옵션을 잘 줄수록 점수가 점점 올라가지만, 과적합이 넘어가면 다시 떨어진다. (과적합이 아닌 요소에 대해서도 바뀔수 있다.). 여하튼 그 최대값이 되는 옵션값을 찾아야 한다.
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]:
테스트 스코어는 변동성이 크고 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]:
'beginner > 파이썬 머신러닝 기초' 카테고리의 다른 글
지도학습 - 선형회귀 (1) | 2019.02.27 |
---|---|
와인 데이터 분석 (0) | 2019.02.26 |
Numpy를 활용한 수치근사법 (0) | 2019.02.25 |
지도학습 - k-NN분류 (0) | 2019.02.25 |
지도학습개요 (0) | 2019.02.25 |