๐ก ๋จผ์ ์ฌ๋ฆฐ Chapter 1.์๊ฐ -1๊ณผ ์ด์ด์ง๋ ๋ท ๋ถ๋ถ ๋ด์ฉ
๐ https://velog.io/@ksj5738/Chapter-1.-%EC%86%8C%EA%B0%9C-1
๊ฐ๋จํ ๋จธ์ ๋ฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ด๊ฐ๋ฉด์ ์ฒซ ๋ฒ์งธ ๋ชจ๋ธ์ ๋ง๋ค์ด๋ณธ๋ค
์๋ง์ถ์ด ์๋ฌผํ์๊ฐ ๋ค์์ ๋ฐ๊ฒฌํ ๋ถ๊ฝ์ ํ์ข ์ ์๊ณ ์ถ๋ค๊ณ ๊ฐ์
( ์๋ง์ถ์ด ์๋ฌผํ์๊ฐ ์ผ์์์ ์ฑ์งํ ๋ถ๊ฝ์ ์ธ ์ข ๋ฅ๋ฟ์ด๋ผ๊ณ ๊ฐ์ )
- ๋ถ๊ฝ์ ๊ฝ์( petal )๊ณผ ๊ฝ๋ฐ์นจ( sepal )์ ํญ๊ณผ ๊ธธ์ด๋ฅผ ์ผํฐ๋ฏธํฐ ๋จ์๋ก ์ธก์ ํ์๋ค.
- ์ ๋ฌธ ์๋ฌผํ์๊ฐ
setosa
,versicolor
,virginica
์ข ์ผ๋ก ๋ถ๋ฅํ ๋ถ๊ฝ์ ์ธก์ ๋ฐ์ดํฐ๋ ๊ฐ์ง๊ณ ์๋ค.- ์ด๋ค ํ์ข ์ธ์ง ๊ตฌ๋ถํด๋์ ์ธก์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ์๋ก ์ฑ์งํ ๋ถ๊ฝ์ ํ์ข ์ ์์ธกํ๋ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๋ง๋ ๋ค.
๋ถ๊ฝ์ ํ์ข ์ ์ ํํ๊ฒ ๋ถ๋ฅํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ด ๋ฌธ์ ๋ ์ง๋ ํ์ต์ ์ํ๋ค.
์ด ๊ฒฝ์ฐ ๋ช ๊ฐ์ง ์ ํ์ฌํญ( ๋ถ๊ฝ์ ํ์ข ) ์ค ํ๋๋ฅผ ์ ํํ๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ถ๋ฅ (Classification) ๋ฌธ์ ์ ํด๋น๋๋ค.
์ถ๋ ฅ๋ ์ ์๋ ๊ฐ (๋ถ๊ฝ์ ์ข ๋ฅ )๋ค์ ํด๋์ค( class )๋ผ๊ณ ํ๋ค.
๋ฐ์ดํฐ์ ์ ์๋ ๋ถ๊ฝ ๋ฐ์ดํฐ๋ ๋ชจ๋ ์ธ ํด๋์ค ์ค ํ๋์ ์ํ๋ค.
๋ฐ์ดํฐ ํฌ์ธํธ ํ๋( ๋ถ๊ฝ ํ๋ )์ ๋ํ ๊ธฐ๋ ์ถ๋ ฅ์ ๊ฝ์ ํ์ข ์ด ๋๋๋ฐ ์ด๋ฐ ํน์ ๋ฐ์ดํฐ ํฌ์ธํธ์ ๋ํ ์ถ๋ ฅ์ ๋ ์ด๋ธ( label )์ด๋ผ๊ณ ํ๋ค.
scikit-learn
์ dataset ๋ชจ๋์ ํฌํจ๋์ด ์๋คfrom sklearn.datasets import load_iris
iris_dataset = load_iris()
# iris ๊ฐ์ฒด๋ ํ์ด์ฌ ๋์
๋๋ฆฌ์ ์ ์ฌํ Bunch ํด๋์ค์ ๊ฐ์ฒด๋ก ํค์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ
print('iris_dataset์ ํค: \n', iris_dataset.keys())
# DESCR ํค์๋ ๋ฐ์ดํฐ์
์ ๋ํ ๊ฐ๋ตํ ์ค๋ช
์ด ๋ค์ด์๋ค.
print(iris_dataset['DESCR'][:193] + '\n...')
~~>
iris_dataset์ ํค:
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])
.. _iris_dataset:
Iris plants dataset
--------------------
**Data Set Characteristics:**
:Number of Instances: 150 (50 in each of three classes)
:Number of Attributes: 4 numeric, pre
...
# target_names์ ๊ฐ์ ๋ถ๊ฝ ํ์ข
์ ์ด๋ฆ์ ๋ฌธ์์ด ๋ฐฐ์ด๋ก ๊ฐ์ง๊ณ ์์
print('ํ๊น์ ์ด๋ฆ: ', iris_dataset['target_names'])
# feature_names์ ๊ฐ์ ๊ฐ ํน์ฑ์ ์ค๋ช
ํ๋ ๋ฌธ์์ด ๋ฆฌ์คํธ
print('ํน์ฑ์ ์ด๋ฆ: \n', iris_dataset['feature_names'])
# data๋ ๊ฝ์์ ๊ธธ์ด์ ํญ, ๊ฝ๋ฐ์นจ์ ๊ธธ์ด์ ํญ์ ์์น ๊ฐ์ผ๋ก ๊ฐ์ง๊ณ ์๋ Numpy ๋ฐฐ์ด
print('data์ ํ์
:', type(iris_dataset['data']))
# data ๋ฐฐ์ด์ ํ์ ๊ฐ๊ฐ์ ๊ฝ์ด ๋๋ฉฐ ์ด์ ๊ฐ ๊ฝ์์ ๊ตฌํ ๋ค ๊ฐ์ ์ธก์ ์น
print('data์ ํฌ๊ธฐ:', iris_dataset['data'].shape)
~~>
ํ๊น์ ์ด๋ฆ: ['setosa' 'versicolor' 'virginica']
ํน์ฑ์ ์ด๋ฆ:
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
data์ ํ์
: <class 'numpy.ndarray'>
data์ ํฌ๊ธฐ: (150, 4)
๐ก ์ด ๋ฐฐ์ด์ 150๊ฐ์ ๋ถ๊ฝ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋จธ์ ๋ฌ๋์์ ๊ฐ ์์ดํ
์ ์ํ์ด๋ผ ํ๊ณ ํน์ฑ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค
print('data์ ์ฒ์ ๋ค์ฏ ํ: \n', iris_dataset['data'][:5])
~~>
data์ ์ฒ์ ๋ค์ฏ ํ:
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]]
๐ ์ด ๋ฐ์ดํฐ๋ก๋ถํฐ ๋ถ๊ฝ์ ๊ฝ์ ํญ์ ๋ชจ๋ 0.2cm์ด๊ณ , ์ฒซ ๋ฒ์งธ ๊ฝ์ด ๊ฐ์ฅ ๊ธด 5.1cm์ ๊ฝ ๋ฐ์นจ์ ๊ฐ์ก์์ ์ ์ ์๋ค.
# target ๋ฐฐ์ด๋ ์ํ ๋ถ๊ฝ์ ํ์ข
์ ๋ด์ Numpy ๋ฐฐ์ด
print('target์ ํ์
:', type(iris_dataset['target']))
# target์ ๊ฐ ์์๊ฐ ๋ถ๊ฝ ํ๋์ ํด๋นํ๋ 1์ฐจ์ ๋ฐฐ์ด
print('target์ ํฌ๊ธฐ:', iris_dataset['target'].shape)
# ๋ถ๊ฝ์ ์ข
๋ฅ๋ 0์์ 2๊น์ง์ ์ ์๋ก ๊ธฐ๋ก
print('ํ๊น:\n', iris_dataset['target'])
~~>
target์ ํ์
: <class 'numpy.ndarray'>
target์ ํฌ๊ธฐ: (150,)
ํ๊น:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
scikit-learn
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ train_test_split ํจ์๋ฅผ ์ฌ์ฉ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'], random_state=0)
print('x_train ํฌ๊ธฐ:', x_train.shape)
print('y_train ํฌ๊ธฐ:', y_train.shape)
~~>
x_train ํฌ๊ธฐ: (112, 4)
y_train ํฌ๊ธฐ: (112,)
print('x_test ํฌ๊ธฐ:', x_test.shape)
print('y_test ํฌ๊ธฐ:', y_test.shape)
~~>
x_test ํฌ๊ธฐ: (38, 4)
y_test ํฌ๊ธฐ: (38,)
๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๋ง๋ค๊ธฐ ์ ์ ๋จธ์ ๋ฌ๋์ด ์์ด๋ ํ ์ ์๋ ๋ฌธ์ ๋ ์๋์ง, ํน์ ํ์ํ ์ ๋ณด๊ฐ ๋๋ฝ๋์ง๋ ์์๋์ง ๋ฐ์ดํฐ๋ฅผ ์กฐ์ฌํด๋ณด๋ ๊ฒ์ด ์ข๋ค.
- ๋น์ ์์ ์ธ ๊ฐ์ด๋ ํน์ดํ ๊ฐ์ ์ฐพ์ ์๋ ์๊ณ
- ๋ฐ์ดํฐ ์ค ์ผ๋ถ๋ ์ผํฐ๋ฏธํฐ๊ฐ ์๋๊ณ ์ธ์น๋ก ๋์ด์์ ์ ์๋ค
- ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ด ์๊ฑฐ๋ ์ด์ํ ๊ฐ์ด ๋ค์ด๊ฐ ์์ ์๋ ์๋ค.
์ฐ์ ๋(scatter plot) ์๊ฐํ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์กฐ์ฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
ํ์ง๋ง ๊ทธ๋ํ๋ก๋ 3๊ฐ ์ด์์ ํน์ฑ์ ํํํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ฐ์ ๋ ํ๋ ฌ์ ์ฌ์ฉํ ์๋ ์๋ค.
import pandas as pd
# x_train ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐํ๋ ์์ ๋ง๋ ๋ค.
# ์ด์ ์ด๋ฆ์ iris_dataset.feature_names์ ์๋ ๋ฌธ์์ด์ ์ฌ์ฉ
iris_dataframe = pd.DataFrame(x_train, columns=iris_dataset.feature_names)
# ๋ฐ์ดํฐํ๋ ์์ ์ฌ์ฉํด y_train์ ๋ฐ๋ผ ์์ผ๋ก ๊ตฌ๋ถ๋ ์ฐ์ ๋ ํ๋ ฌ์ ๋ง๋ ๋ค.
pd.plotting.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15), marker='o',
hist_kwds={'bins':20}, s=60, alpha=.8, cmap=mglearn.cm3)
~~>
ํ๋
๊ฐ ์๋๋ผ ํ๋ จ ๋ฐ์ดํฐ์์ ์๋ก์ด ๋ฐ์ดํฐ ํฌ์ธํธ์ ๊ฐ์ฅ ๊ฐ๊น์ด K๊ฐ
์ ์ด์์ ์ฐพ๋๋ค๋ ๋ป์ด๋ค.from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(x_train, y_train)
fit ๋ฉ์๋๋ knn ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋์ knn ๊ฐ์ฒด๊ฐ ๋ฌธ์์ด ํํ๋ก ์ถ๋ ฅ๋จ
๊ฑฐ์ ๋ชจ๋ ๋งค๊ฐ๋ณ์๊ฐ ๊ธฐ๋ณธ๊ฐ์ด๊ณ n_neighbors-1์ ์์๋ก ์ง์ ํ ๊ฐ
์์์ ๋ถ๊ฝ์ ์ค์
- ๊ฝ๋ฐ์นจ์ ๊ธธ์ด๊ฐ 5cm, ํญ์ด 2.9cm
- ๊ฝ์์ ๊ธธ์ด๊ฐ 1cm, ํญ์ด 0.2cm
import numpy as np
# ์ธก์ ๊ฐ์ Numpy ๋ฐฐ์ด, ์ํ์ ์(1)์ ํน์ฑ์ ์(4)๋ฅผ ๊ณฑํ ํฌ๊ธฐ์ธ ๋ฐฐ์ด๋ก ์์ฑ
x_new = np.array([[5, 2.9, 1, 0.2]])
print('x_new.shape:', x_new.shape)
~~>
x_new.shape: (1, 4)
# predict ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๋ถ๊ฝ ํ์ข
์ ์์ธก
prediction = knn.predict(x_new)
print('์์ธก:', prediction)
print('์์ธกํ ํ๊น์ ์ด๋ฆ:', iris_dataset['target_names'][prediction])
~~>
์์ธก: [0]
์์ธกํ ํ๊น์ ์ด๋ฆ: ['setosa']
โจโจ ๋ชจ๋ธ์ setosa
ํ์ข
์ผ๋ก ์์ธก์ ํ์ง๋ง ๋ชจ๋ธ์ด ์ ํํ ํ๋จ์ ํ ๊ฒ์ธ์ง ์์ง ์ ์ ์๋ค.
y_pred = knn.predict(x_test)
print('ํ
์คํธ ์ธํธ์ ๋ํ ์์ธก๊ฐ: \n', y_pred)
print('ํ
์คํธ ์ธํธ์ ์ ํ๋: {:.2f}'.format(np.mean(y_pred == y_test)))
# knn ๊ฐ์ฒด์ score ๋ฉ์๋๋ฅผ ํตํ ์ ํ๋ ๊ณ์ฐ
print('ํ
์คํธ ์ธํธ์ ์ ํ๋: {:.2f}'.format(knn.score(x_test, y_test)))
~~>
ํ
์คํธ ์ธํธ์ ๋ํ ์์ธก๊ฐ:
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
2]
ํ
์คํธ ์ธํธ์ ์ ํ๋: 0.97
ํ
์คํธ ์ธํธ์ ์ ํ๋: 0.97