โ๏ธ ๋ถ๋ฅ๋ ์ข
์๋ณ์(y, ์ ๋ต, target)๊ฐ ์ด์ง๊ณผ ๋ค์ค์ผ๋ก ๋๋์ด์ง๋๋ฐ ์ด๋ ์ฐ์์ ์ธ ๊ฐ์ด ์๋ ๋ฒ์ฃผํ(type, class...)์ผ๋ก ์ค์ง์ ๋ค ๊ฐ์๊ฑฐ. ํ๊ท๋ ์ฐ์์ ์ธ ๊ฐ.
โ๏ธ ์ด์ง๋ถ๋ฅ๋ ์/์๋์ค ์์ผ๋ก ๋์ฌ ์ ์๋๋ก ํ๋ ๊ฒ. ์
์ด์์ ํด๋์ค๋ ๋ค์ค๋ถ๋ฅ ์/์๋์ค ์์ ์ ๋ต์ด ์๋๋ผ ํน์ ์ ๋ต์ด ๋์ฌ ์ ์๋ ๊ฒ.
โ๏ธ ๋ ๋ฆฝ๋ณ์๋ x, Feature, Data๋ผ๊ณ ๋ง์ด ํจ. ํ๊ท๋ ๋ถ๋์์์ ์(์ค์)๋ฅผ ์์ธกํ๋ ๊ฒ.
โ๏ธ ์ผ๋ฐํ ์ฑ๋ฅ์ด ์ต๋๊ฐ ๋๋ ๋ชจ๋ธ์ด ์ต์ . ๋ชจ๋ธ์ด ๋ณต์กํ ์๋ก(ํ์ต์ ๋ง์ด ์ํค๋ฉด) ๊ณผ๋์ ํฉ์ํ๊ฐ ๋์ด ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ง๋ฌ์ ๋ ์ผ๋ฐํ๋์ง ๋ชปํ๋ค.
โ๏ธ k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ - ๊ฐ์ฅ ๊ฐ๊น์ด ํ๋ จ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์ต๊ทผ์ ์ด์์ผ๋ก ์ฐพ์ ์์ธก์ ์ฌ์ฉ.
โ๏ธ iris(๋ถ๊ฝ) ํ์ข
๋ถ๋ฅ
โถ๏ธ ๋
๋ฆฝ๋ณ์(x, feature, data) : ๊ฝ์, ๊ฝ๋ฐ์นจ์ ๊ธธ์ด(cm) 4๊ฐ์ง(length, width)
โถ๏ธ ์ข
์๋ณ์(y, class, target) : ๊ฝ์ ํ์ข
(setosa, virginica, versicolor)
(+ ๊ฝ์, ๊ฝ๋ฐ์นจ ๊ธธ์ด์ ๋ฐ๋ฅธ ์์ด๋ฆฌ์ค ํ์ข
๋ถ๋ฅ์ด๊ธฐ ๋๋ฌธ์ ๊ฝ์, ๊ฝ๋ฐ์นจ ๊ธธ์ด๊ฐ ๋
๋ฆฝ๋ณ์๊ฐ ๋๊ณ ํ์ข
์ด ์ข
์๋ณ์๊ฐ ๋๋ ๊ฒ)
โ๏ธ ๋ฐ์ดํฐ ์ค๋นํ๊ธฐ
# ๋ฐ์ดํฐ ์ค๋นํ๊ธฐ
from sklearn.datasets import load_iris
iris_dataset = load_iris()
๋ฐ์ดํฐ ํ์ธํ๋ฉด numpy ๋ฐฐ์ดํ์์ผ๋ก ๊ฐ์ด ์ ๋ ฅ๋์ด์๋ ๊ฒ์ ์ ์ ์๋ค.
shape์ ์ด์ฉํด์ ํ์ธํ๋ฉด ํ๋ ฌ ํ์(๋ฐ์ดํฐํ๋ ์์ผ๋ก ์๊ฐํ๋ฉด row๊ฐ 150๊ฐ์ธ๊ฑฐ๊ณ column์ด 4๊ฐ์ธ๊ฒ.)
โ๏ธ ์ฐ์ ๋ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
import matplotlib.pyplot as plt
import pandas as pd
# ๋ฐ์ดํฐํ๋ ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ถ์ -> ๋
๋ฆฝ๋ณ์(feature)์ ์ข
์๋ณ์(label)์ ์ฐ๊ด์ฑ์ ํ์ธ
iris_df = pd.DataFrame(iris_dataset['data'], columns=iris_dataset.feature_names)
# ๊ฐ ๋
๋ฆฝ๋ณ์(feature)๋ค์ ์ฐ์ ๋ ํ๋ ฌ 4x4
pd.plotting.scatter_matrix(iris_df, c=iris_dataset['target'], figsize=(15,15),
marker='o', hist_kwds={'bins':20}, s=60, alpha=.8)
plt.show()
pandas ๋ฐ์ดํฐํ๋ ์ ํ์์ผ๋ก ๋ถ๋ฌ์์ ์ฐ์ ๋ ์ฐจํธ๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด
๊ฐ ๋ณ์๋ค ๊ฐ์ ๋ถํฌํํ๋ฅผ ํ์ธํ ์ ์๋ค.
x์ถ์ด petal length์ด๊ณ y์ถ์ด petal width์ธ ์ฐ์ ๋๊ฐ ๊ฐ์ฅ ์์ด๋ฆฌ์ค ํ์ข
์ด ๋์ ๋๊ฒ ๋ถ๋ฅ๋์ด์๋ค.
import numpy as np
plt.imshow([np.unique(iris_dataset['target'])])
_ = plt.xticks(ticks=np.unique(iris_dataset['target']), labels=iris_dataset['target_names']) # underscore -> _(๊ฐ์ ์ถ๋ ฅํ๊ณ ์ถ์ง ์์ ๋ ์ฌ์ฉ, ๋ณ์์ ๋ด์ผ๋ฉด ์ถ๋ ฅ์ด ์๋๋๊น)
์ข
์๋ณ์(target)์ ๋ณ์๊ฐ์ด ์ด๋ป๊ฒ ์
๋ ฅ๋์ด์๋์ง ํ์ธ.
setosa๊ฐ 0, versicolor๊ฐ 1, virginica๋ 2.
iris_df2 = iris_df[['petal length (cm)', 'petal width (cm)']]
์์์ ๊ฐ์ฅ ์ ํฉํ๋ ์ฐ์ ๋์ ๋ณ์๋ง ๋ฝ์์ ๋ฐ์ดํฐํ๋ ์ ์๋ก ํ์ฑ.
pd.plotting.scatter_matrix(iris_df2, c=iris_dataset['target'], figsize=(15,15),
marker='o', hist_kwds={'bins':20}, s=60, alpha=.8)
plt.show()
์ฐ์ ๋๋ฅผ ๊ทธ๋ฆฌ๋ฉด 2X2 ํํ๋ก ๊ทธ๋ ค์ง
โ๏ธ ํ๋ จ๋ฐ์ดํฐ์ ํ ์คํธ๋ฐ์ดํฐ ๋ถ๋ฆฌ
# ํ๋ จ๋ฐ์ดํฐ : ํ
์คํธ ๋ฐ์ดํฐ -> 7:3 or 75:25 or 80:20 or 90:10 ๋น์จ.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], # ๋๋ฌธ์ -> 2๊ฐ ์ด์์ผ ๋, ์๋ฌธ์ -> 1๊ฐ
test_size=0.25, random_state=777) # random_state ๊ณ ์ ๋ ์๋๋ถ์ฌ
# ํ๋ จ๋ฐ์ดํฐ ํ์ธํ๊ธฐ 150 => 75% -> 112๊ฐ
X_train.shape
# ํ
์คํธ๋ฐ์ดํฐ ํ์ธํ๊ธฐ 150 => 25% -> 38๊ฐ
X_test.shape
โ๏ธ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ์ค์ -> k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1) # ์ด์์ ๊ฐ์ 1๊ฐ๋ก ์ง์
# ํ์ตํ๊ธฐ
knn.fit(X_train, y_train)
# ์์ธกํ๊ธฐ
y_pred = knn.predict(X_test)
โ๏ธ ๋ชจ๋ธ ํ๊ฐํ๊ธฐ
# ์ ํ๋ ํ์ธํ๊ธฐ
# 1) mean() ํจ์ ์ฌ์ฉํด์ ์ ํ๋ ํ์ธ
np.mean(y_pred == y_test)
๐ผ ๊ฒฐ๊ณผ
# 2) score() ํจ์๋ฅผ ์ฌ์ฉํด์ ์ ํ๋ ํ์ธ -> ํ
์คํธ ์
์ผ๋ก ์์ธกํ ํ ์ ํ๋ ์ถ๋ ฅ
knn.score(X_test, y_test)
๐ผ ๊ฒฐ๊ณผ
# 3) ํ๊ฐ ์งํ ๊ณ์ฐ
from sklearn import metrics
knn_report = metrics.classification_report(y_test, y_pred)
print(knn_report)
๐ผ ๊ฒฐ๊ณผ
โ๏ธ forge
โถ๏ธ ์ธ์์ ์ผ๋ก ๋ง๋ค์ด์ง ์ด์ง๋ถ๋ฅ ๋ฐ์ดํฐ์
# ์ค์น
pip install mglearn
# ์ด์ง ๋ถ๋ฅ ๋ฐ์ดํฐ์
ํ์ธํ๊ธฐ
import mglearn
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
# ๋ฐ์ดํฐ์
๋ค์ด๋ก๋
X , y = mglearn.datasets.make_forge()
# ๋ฐ์ดํฐ ํ์ธํ๊ธฐ
print('X.shape : ', X.shape)
print('y.shape : ', y.shape)
# ์ฐ์ ๋ ๊ทธ๋ฆฌ๊ธฐ
plt.figure(dpi=100)
plt.rc('font', family='NanumBarunGothic')
mglearn.discrete_scatter(X[:,0], X[:,1], y)
plt.legend(['ํด๋์ค 0', 'ํด๋์ค 1'], loc=4)
plt.xlabel('์ฒซ ๋ฒ์งธ ํน์ฑ')
plt.ylabel('๋ ๋ฒ์งธ ํน์ฑ')
โ๏ธ k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ
# 1-์ต๊ทผ์
import mglearn
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
plt.figure(dpi=100)
mglearn.plots.plot_knn_classification(n_neighbors=1)
๐ผ ๊ฒฐ๊ณผ
# 3-์ต๊ทผ์
plt.figure(dpi=100)
mglearn.plots.plot_knn_classification(n_neighbors=3)
๐ผ ๊ฒฐ๊ณผ
: 1์ผ ๋์ 3์ผ ๋์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๋ค. = > ์ต์ ์ !
โ๏ธ ์ด์ง ๋ถ๋ฅ ๋ฌธ์ ์ ์
# ๋ฐ์ดํฐ ์ค๋นํ๊ธฐ
X, y = mglearn.datasets.make_forge() # X : ๋ฐ์ดํฐ(feature, ๋
๋ฆฝ๋ณ์), y : ๋ ์ด๋ธ(label, ์ข
์๋ณ์)
from sklearn.model_selection import train_test_split
# ์ผ๋ฐํ ์ฑ๋ฅ์ ํ๊ฐํ ์ ์๋๋ก ๋ฐ์ดํฐ ๋ถ๋ฆฌ -> ํ๋ จ์
, ํ
์คํธ์
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=7) # 75:25
X_train.shape # 26 -> 19
X_test.shape # 26 -> 7
# k-์ต๊ทผ์ ์ด์ ๋ถ๋ฅ ๋ชจ๋ธ ์ค์ - ์์ ๊ฒฐ๊ณผ ํ ๋๋ก
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=3)
# ๋ชจ๋ธ ํ์ตํ๊ธฐ
clf.fit(X_train, y_train)
# score ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ธก ์ ํ๋ ํ์ธ
clf.score(X_test, y_test)
clf.score(X_train, y_train) # -> ๊ณผ๋์ ํฉ ์ํฉ
โ๏ธ KNeighborsClassifier ์ด์์ ์์ ๋ฐ๋ฅธ ์ฑ๋ฅํ๊ฐ
# ์ด์์ ์์ ๋ฐ๋ฅธ ์ ํ๋๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ ๋ณ์
train_scores = []
test_scores = []
n_neighbors_settings = range(1,15)
# 1 ~ 10๊น์ง n_neighbors์ ์๋ฅผ ์ฆ๊ฐ์์ผ์ ํ์ต ํ ์ ํ๋ ์ ์ฅ
for n_neighbor in n_neighbors_settings:
# ๋ชจ๋ธ ์์ฑ
clf = KNeighborsClassifier(n_neighbors=n_neighbor)
clf.fit(X_train, y_train)
# ํ๋ จ ์ธํธ ์ ํ๋ ์ ์ฅ
train_scores.append(clf.score(X_train, y_train))
# ํ
์คํธ ์ธํธ ์ ํ๋ ์ ์ฅ
test_scores.append(clf.score(X_test, y_test))
# ์์ธก ์ ํ๋ ๋น๊ต ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
plt.figure(dpi=100)
plt.plot(n_neighbors_settings, train_scores, label='ํ๋ จ ์ ํ๋')
plt.plot(n_neighbors_settings, test_scores, label='ํ
์คํธ ์ ํ๋')
plt.ylabel('์ ํ๋')
plt.xlabel('์ด์์ ์')
plt.legend()
plt.show()
# ์ต์ ์ ์ 3!
โ๏ธ ์์ค์ฝ์ ์ ๋ฐฉ์ ๋ฐ์ดํฐ์
์ ์ฌ์ฉํ ์
์ฑ ์ข
์(label 1) ์์ธกํ๊ธฐ
โถ๏ธ ๋
๋ฆฝ๋ณ์(x, feature, data) : cancer.feature_names
์น๋ฉด ๋์ด
โถ๏ธ ์ข
์๋ณ์(y, class, target) : ์
์ฑ, ์์ฑ
# ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
# ์ฐ์ ๋ ๊ทธ๋ฆฌ๊ธฐ
import pandas as pd
df = pd.DataFrame(cancer['data'], columns=cancer.feature_names)
pd.plotting.scatter_matrix(df, c=cancer['target'], figsize=(15,15),
marker='o', hist_kwds={'bins':20}, s=10, alpha=.8)
plt.show()
# ์ข
์๋ณ์์ ๊ฐ ํ์ธ
import numpy as np
plt.imshow([np.unique(cancer['target'])])
_ = plt.xticks(ticks=np.unique(cancer['target']), labels=cancer['target_names'])
๐ผ ๊ฒฐ๊ณผ(0์ด ์ ์ฑ, 1์ด ์์ฑ)
# ๋ฐ์ดํฐ ๋ถ๋ฆฌํ๊ธฐ(ํ๋ จ๋ฐ์ดํฐ, ํ
์คํธ๋ฐ์ดํฐ)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=7)
# ์ต์ ์ ์์๋ณด
# ์ด์์ ์์ ๋ฐ๋ฅธ ์ ํ๋๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ ๋ณ์
train_scores = []
test_scores = []
n_neighbors_settings = range(1,21)
# 1 ~ 10๊น์ง n_neighbors์ ์๋ฅผ ์ฆ๊ฐ์์ผ์ ํ์ต ํ ์ ํ๋ ์ ์ฅ
for n_neighbor in n_neighbors_settings:
# ๋ชจ๋ธ ์์ฑ
clf = KNeighborsClassifier(n_neighbors=n_neighbor)
clf.fit(X_train, y_train)
# ํ๋ จ ์ธํธ ์ ํ๋ ์ ์ฅ
train_scores.append(clf.score(X_train, y_train))
# ํ
์คํธ ์ธํธ ์ ํ๋ ์ ์ฅ
test_scores.append(clf.score(X_test, y_test))
# ์์ธก ์ ํ๋ ๋น๊ต ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
plt.figure(dpi=100)
plt.plot(n_neighbors_settings, train_scores, label='ํ๋ จ ์ ํ๋')
plt.plot(n_neighbors_settings, test_scores, label='ํ
์คํธ ์ ํ๋')
plt.ylabel('์ ํ๋')
plt.xlabel('์ด์์ ์')
plt.legend()
plt.show()
๐ผ ๊ฒฐ๊ณผ(์ต์ ์ ์ 7-8!)