๐ผ ์ง๋ํ์ต
๋ถ๋ฅ : ์ด์ง๋ถ๋ฅ, ๋ค์ค๋ถ๋ฅ -> y, class, ๋ถ๋ฅ, Type
์ด์ง๋ถ๋ฅ : ์ง๋ฌธ์ ๋ต์ด ์/์๋์ค๋ก๋ง ์์ฑํด๋์ค/์์ฑํด๋์ค
๋ค์ค๋ถ๋ฅ : ์ ์ด์์ ํด๋์ค๋ก ๋ถ๋ฅ
์ ๋ต์ง - y, class, label, ์ข ์๋ณ์, Target
์ํ์ง - x, ๋ ๋ฆฝ๋ณ์, feature, Dataํ๊ท : ์ฐ์์ ์ธ ์ซ์ -> ์ฃผ์, ์ง๊ฐ, ๊ด๊ฐ์ ...
- ์ธ๊ฐ ์ค ํ๋ ์์ธก : ๋ค์ค๋ถ๋ฅ
- ๋ฌธ์ ์ ์ :
๋ถ๊ฝ์ ํ์ข ์ ๋ถ๋ฅ -> 3๊ฐ ํ์ข ์ค ํ๋ ์์ธกํ๋ ๋ค์ค ๋ถ๋ฅ ๋ฌธ์ ๋ก ์ ์- ๋ฌธ์ ์ง -> ๋ฐ์ดํฐ, ํน์ฑ(feature), ๋ ๋ฆฝ๋ณ์(x) : ๊ฝ์, ๊ฝ๋ฐ์นจ์ ๊ธธ์ด(cm) 4๊ฐ์ง
- ์ ๋ต -> ํด๋์ค(class), ๋ ์ด๋ธ(label), ํ๊น(target), ์ข ์๋ณ์(y) : ๋ถ๊ฝ์ ํ์ข (setosa, versicolor, vriginica)
- sepal๊ณผ petal(๊ทธ๋ฅ๋ด๊ฐ๋ชจ๋ฅด๊ฒ ใ ใ ์...^^)
# ๋ฐ์ดํฐ ์ค๋นํ๊ธฐ
from sklearn.datasets import load_iris
iris_dataset = load_iris()
# ๋ฐ์ดํฐ ํ์ธํ๊ธฐ
iris_dataset['target'] # ์ ๋ต, label
iris_dataset['data'].shape # -> (150,4) 4๊ฐ์ feature
# ๊ทธ๋ฆฌ๊ธฐ
import matplotlib.pyplot as plt
import pandas as pd
# ๋ฐ์ดํฐํ๋ ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ถ์ -> feature์ label์ ์ฐ๊ด์ฑ์ ํ์ธ
# NumPy ๋ฐฐ์ด์ pandas์ DataFrame์ผ๋ก ๋ณ๊ฒฝ
iris_df = pd.DataFrame(iris_dataset['data'], columns=iris_dataset.feature_names)
# y_train์ ๋ฐ๋ผ ์์ผ๋ก ๊ตฌ๋ถ๋ ์ฐ์ ๋ ํ๋ ฌ์ ๋ง๋ฆ
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()
import numpy as np
plt.imshow([np.unique(iris_dataset['target'])])
_ = plt.xticks(ticks=np.unique(iris_dataset['target']), # ๋ฆฌํดํ์
์ ํธ์ถํ๋ ํจ์์ ๊ฐ์ ์ฐ๊ณ ์ถ์ง ์์๋ฐ ๋ณ์๋ฅผ ์จ์ผํ ๋ '_'์ฌ์ฉlabels=iris_dataset['target_names'])
iris_df2 = iris_df[['petal length (cm)', 'petal width (cm)']]
# ๊ฐ feature๋ค์ ์ฐ์ ๋ ํ๋ ฌ 4 X 4
pd.plotting.scatter_matrix(iris_df2, c=iris_dataset['target'], figsize=(10,10), marker='o', hist_kwds={'bins': 20}, s = 60, alpha=.8)
plt.show()
# ํ๋ จ๋ฐ์ดํฐ์ ํ
์คํธ๋ฐ์ดํฐ ๋ถ๋ฆฌ
# ํ๋ จ๋ฐ์ดํฐ, ํ
์คํธ ๋ฐ์ดํฐ -> 70:30 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'], test_size=0.25, random_state=777)
# ํ๋ จ๋ฐ์ดํฐ ํ์ธํ๊ธฐ 150 -> 75% -> 112
X_train.shape
# ํ๋ จ๋ฐ์ดํฐ ํ์ธํ๊ธฐ 150 -> 25% -> 38
X_test.shape
# ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ์ค์ -> k-NN
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)
์ผ๋ฐํ : ๋ชจ๋ธ์ด ์ฒ์ ๋ณด๋ ๋ฐ์ดํฐ์ ๋ํด ์ ํํ๊ฒ ์์ธกํ ์ ์์
์ผ๋ฐํ ์ฑ๋ฅ์ด ์ต๋๊ฐ ๋๋ ๋ชจ๋ธ์ด ์ต์
๊ณผ๋์ ํฉ : ๋ชจ๋ธ์ด ํ๋ จ ์ธํธ์ ๊ฐ ์ํ์ ๋๋ฌด ๊ฐ๊น๊ฒ ๋ง์ถฐ์ ธ์ ์๋ก์ด ๋ฐ์ดํฐ์ ์ผ๋ฐํ ๋๊ธฐ ์ด๋ ค์ธ ๋ ๋ํ๋จ
๊ณผ์์ ํฉ : ๋๋ฌด ๊ฐ๋จํ ๋ชจ๋ธ์ด ์ ํ๋จ
๐ผ ์ค๋น
# ํ๊ธ ๊นจ์ง ๋ฐฉ์ง import matplotlib as mpl import matplotlib.pyplot as plt %config InlineBackend.figure_format = 'retina' !apt -qq -y install fonts-nanum import matplotlib.font_manager as fm fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf' font = fm.FontProperties(fname=fontpath, size=9) plt.rc('font', family='NanumBarunGothic') mpl.font_manager._rebuild() 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) # -> (26,2)
print('y.shape : ', y.shape) # -> (26,)
plt.figure(dpi=100)
plt.rc('font', family='NanumBarunGothic')
# ์ฐ์ ๋ ๊ทธ๋ฆฌ๊ธฐ
mglearn.discrete_scatter(X[:,0], X[:,1], y) # ์ฒซ๋ฒ์งธ feature, ๋๋ฒ์งธ feature ์ค๊ฐ์ง์ ์ด scatter์ฐจํธ๋ก ์ฐํ
plt.legend(['ํด๋์ค 0', 'ํด๋์ค 1'], loc=4)
plt.xlabel("์ฒซ๋ฒ์งธ ํน์ฑ")
plt.ylabel("๋๋ฒ์งธ ํน์ฑ")
plt.show()
-> ๋๊ฐ์ ํน์ฑ ์ค ๋๋ฒ์งธ ํน์ฑ์ ์ ํํ๋๊ฒ ์ข์
X, y = mglearn.datasets.make_wave(n_samples=40)
# ๋ฐ์ดํฐ ํ์ธ
print('X.shape : ', X.shape) # -> (40, 1)
print('y.shape : ', y.shape) # -> (40,)
# ์ฐ์ ๋ X, y
plt.figure(dpi = 100)
plt.rc('font', family='NanumBarunGothic')
plt.rcParams['axes.unicode_minus'] = False
plt.plot(X, y, 'o')
plt.ylim(-3, 3)
plt.xlabel("ํน์ฑ")
plt.ylabel("ํ๊น")
plt.show()
-> feature๊ฐ์ด ์ปค์ง๋ฉด y๊ฐ๋ ์ปค์ง
https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
# ๋ฐ์ดํฐ ํ์ธํ๊ธฐ
cancer['target'] # 0: ์
์ฑ, 1: ์์ฑ
cancer['data'].shape # -> (569, 30) 569๊ฑด์ ๋ฐ์ดํฐ ์์ 30๊ฐ์ feature์ผ๋ก ์ด๋ฃจ์ด์ง dataset
๐ ์ด์ง๋ถ๋ฅ ํ ๋ ๋ด๊ฐ ์ฐพ์ ๋ฐ์ดํฐ์ ์ 1๋ก ์ค์ ํ๋๊ฒ ์ ๋ฆฌ
from sklearn.datasets import load_boston
boston = load_boston()
# ๋ฐ์ดํฐ ํ์ธํ๊ธฐ
boston.data.shape # -> (506,13)
boston_feature_names
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')
'CRIM' : ์ง์ญ๋ณ ๋ฒ์ฃ ๋ฐ์๋ฅ
'ZN' : 25000 ํ๋ฐฉํผํธ๋ฅผ ์ด๊ณผํ๋ ๊ฑฐ์ฃผ ์ง์ญ์ ๋น์จ
'INDUS' : ๋น์์
์ง์ญ ๋์ด ๋น์จ
'CHAS' : ์ฐฐ์ค๊ฐ์ ๋ํ ๋๋ฏธ ๋ณ์ (๊ฐ๊น์ฐ๋ฉด 1, ์๋๋ฉด 0)
'NOX' : ์ผ์ฐํ์ง์ ๋๋
'RM' : ๊ฑฐ์ฃผํ ์ ์๋ ๋ฐฉ์ ๊ฐ์
'AGE' : 1940๋
์ด์ ์ ๊ฑด์ถ๋ ์์ ์ฃผํ์ ๋น์จ
'DIS' : 5๊ฐ ์ฃผ์ ๊ณ ์ฉ์ผํฐ๊น์ง์ ๊ฐ์ค ๊ฑฐ๋ฆฌ
'RAD' : ๊ณ ์๋๋ก ์ ๊ทผ ์ฉ์ด๋
'TAX' : 10000๋ฌ๋ฌ๋น ์ฌ์ฐ์ธ์จ
'PTRATIO' : ์ง์ญ์ ๊ต์ฌ์ ํ์ ์ ๋น์จ
'B' : ์ง์ญ์ ํ์ธ ๊ฑฐ์ฃผ ๋น์จ
'LSTAT' : ํ์ ๊ณ์ธต์ ๋น์จ
๐ผ ์ค๋น
pip install mglearn import matplotlib as mpl import matplotlib.pyplot as plt %config InlineBackend.figure_format = 'retina' !apt -qq -y install fonts-nanum import matplotlib.font_manager as fm fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf' font = fm.FontProperties(fname=fontpath, size=9) plt.rc('font', family='NanumBarunGothic') mpl.font_manager._rebuild()
import mglearn
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
plt.figure(dpi=100)
# n_neighbors : ์ฃผ๋ณ ๋ช๊ฐ์ neighbor ํ์ํ ๊ฑด์ง
mglearn.plots.plot_knn_classification(n_neighbors=1)
# ๋ฐ์ดํฐ ์ค๋น
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(default)
# ๋ฐ์ดํฐ ํ์ธ
X_train.shape # 26 ์ค 19
X_test.shape # 26 ์ค 7
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=3)
# ๋ชจ๋ธ ํ์ต
clf.fit(X_train, y_train)
# scoreํจ์ ์ฌ์ฉํ์ฌ ์์ธก ์ ํ๋ ํ์ธ
clf.score(X_train, y_train) # ์ ํ๋ 0.9473684210526315
clf.score(X_test, y_test) # ์ ํ๋ 0.8571428571428571 ํ๋ จ ๋ฐ์ดํฐ์
๊ณผ ์ฐจ์ด๋ง์ด๋๋ overfitting ์ํฉ -> ์ต์ ์ ๋ชจ๋ธ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
# ์ด์์ ์์ ๋ฐ๋ฅธ ์ ํ๋๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ ๋ณ์
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()
# ๋ฐ์ดํฐ์ค๋น
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
# ๋ฐ์ดํฐ๋ถ๋ฆฌ
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)
# 569 -> 75% -> 426 ํ์ต
X_train.shape
# 569 -> 25% -> 143 ํ์ต
X_test.shape
# ์ด์์ ์์ ๋ฐ๋ฅธ ์ ํ๋๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ ๋ณ์
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()