์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- Absolute
- AGI
- ai
- AI agents
- AI engineer
- AI researcher
- ajax
- algorithm
- Algorithms
- aliases
- Array ๊ฐ์ฒด
- ASI
- bayes' theorem
- Bit
- Blur
- BOM
- bootstrap
- canva
- challenges
- ChatGPT
- Today
- In Total
A Joyful AI Research Journey๐ณ๐
[10] 241112 DL, K-Nearest Neighbor (KNN), Decision Tree [Goorm All-In-One Pass! AI Project Master - 4th Session, Day 10] ๋ณธ๋ฌธ
[10] 241112 DL, K-Nearest Neighbor (KNN), Decision Tree [Goorm All-In-One Pass! AI Project Master - 4th Session, Day 10]
yjyuwisely 2024. 11. 12. 13:40241112 Tue 10th class
์ค๋ ๋ฐฐ์ด ๊ฒ ์ค ๊ธฐ์ตํ ๊ฒ์ ์ ๋ฆฌํ๋ค.
llm pandas ๋ง์ด ์ด๋ค.
pandas ์๋ํ
์ด๋ก , ๋
ผ๋ฌธ์ ์์์ผํ๋ค.
ํต๊ณ 3,4ํ๋ , ๊ณต๋ ๋ํ์
์นด์ด์คํธ ๋ํ์ - ๋ ผ๋ฌธ, ์ ๋ฌธ ์ฉ์ด
ํ์ดํ๋ ์บ๊ธ ์ด๋ณด์
https://www.kaggle.com/competitions/titanic
https://rowan-sail-868.notion.site/46295e260bdf4588b6841eabcde0d01c
https://ldjwj.github.io/ML_Basic_Class/part03_ml/ch02_01_01B_knn_code_pratice_2205.html
http://localhost:8888/notebooks/Documents%2FICT4th%2FML_Code%2F20241112_Lib01_Pandas.ipynb
01 ๋ฐ์ดํฐ ์ค๋น
import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np
dat = pd.read_csv("./data/titanic/train.csv")
dat
dat.info()
X = dat[ ['Pclass' , 'SibSp'] ]
y = dat['Survived']
๋ฐ์ดํฐ ์ ํ ๋ฐ ๋๋๊ธฐ
- test_size : ํ ์คํธ ๋ฐ์ดํฐ ์ ๋น์จ ์ ํ
- random_state : ๋ฐ์ดํฐ์ ๋ฝ์ ๋, ์ง์ ๋ ํจํด์ผ๋ก ์ ํ
# 90% : ํ์ต์ฉ, 10% : ํ
์คํธ์ฉ
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.1,
random_state=0)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
๊ฒฐ๊ณผ)
((801, 2), (90, 2), (801,), (90,))
์ด์ง ๋ถ๋ฅ, ์ดํญ ๋ถ๋ฅ
ํ์ดํผํ๋ผ๋ฏธํฐ
ํ๋
์ฑ๋ฅ ๊ฐ์
(pred == y_test).sum() / len(pred)
๊ฒฐ๊ณผ)
0.5666666666666667
print("ํ
์คํธ ์ธํธ์ ์ ํ๋ : {:.2f}".format(np.mean(pred == y_test)))
๊ฒฐ๊ณผ)
ํ
์คํธ ์ธํธ์ ์ ํ๋ : 0.57
๋ชจ๋ธ ์ฐ๊ธฐ ์ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
๋ ์ด๋ธ ์ธ์ฝ๋ฉ์ ๋ฌธ์์ด๋ก ๋ ๋ฒ์ฃผํ ๊ฐ์ ์ซ์ํ ์นดํ ๊ณ ๋ฆฌ ๊ฐ์ผ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ธ์ฝ๋ฉ์ ๋ฐ์ดํฐ๋ฅผ ํน์ ํ ํ์์ผ๋ก ๋ณํํ์ฌ ์ ์ฅํ๊ฑฐ๋ ์ ์กํ๋ ๊ณผ์ ์ด๋ฉฐ, ๋์ฝ๋ฉ์ ์ด๋ฅผ ์๋์ ํํ๋ก ๋ณต์ํ๋ ๊ณผ์ ์ ๋๋ค. ๋์ฝ๋ฉ์ ์ธ์ฝ๋ฉ์ ๋ฐ๋ ๊ฐ๋ ์ผ๋ก, ๋ฐ์ดํฐ์ ์ ๊ทผ์ฑ์ ๋์ด๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
dat.info()
๊ฒฐ์ธก์น ์ฒ๋ฆฌ ๋ฐ ๋ ์ด๋ธ ์ธ์ฝ๋ฉ
dat.head()
mapํจ์
- [Series].map(ํจ์ ๋๋ ๋ณ๊ฒฝ๊ฐ) : Series๋ฅผ ๋์์ผ๋ก ์ํ๋ ํจ์ ์ ์ฉ ๋๋ ๊ฐ์ ๋์ฒด
- ๊ฐ์ผ๋ก dict, Series๋ฅผ ๋์์ผ๋ก ํ๋ค.
- https://pandas.pydata.org/docs/reference/api/pandas.Series.map.html
mapping = { "male":1, 'female':2 }
dat['Sex_num'] = dat['Sex'].map(mapping)
dat.head()
# [].fillna( ) : ๊ฒฐ์ธก๊ฐ์ ์ฑ์ด๋ค.
val_mean = dat['Age'].mean()
dat['Age'] = dat['Age'].fillna( val_mean )
dat.info()
ํ์ต, ํ ์คํธ ๋ฐ์ดํฐ ์ ๋๋๊ธฐ
X = dat[ ['Pclass' , 'SibSp', 'Sex_num', 'Age'] ]
y = dat['Survived']
# 90% : ํ์ต์ฉ, 10% : ํ
์คํธ์ฉ
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.1,
random_state=0)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
๊ฒฐ๊ณผ)
((801, 4), (90, 4), (801,), (90,))
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=2)
model.fit(X_train, y_train)
### ์์ธก์ํค๊ธฐ
pred = model.predict(X_test)
print("ํ
์คํธ ์ธํธ์ ์ ํ๋ : {:.2f}".format(np.mean(pred == y_test)))
๊ฒฐ๊ณผ)
ํ
์คํธ ์ธํธ์ ์ ํ๋ : 0.76
KNN ํ๊ท(K-์ต๊ทผ์ ์ด์ ํ๊ท) ๋ชจ๋ธ์ ๊ฐ์ฅ ๊ฐ๊น์ด K๊ฐ์ ์ด์ ์ํ์ ์ด์ฉํด ์ฐ์์ ์ธ ๊ฐ์ ์์ธกํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. KNN ๋ถ๋ฅ์ ์ ์ฌํ ์๋ฆฌ๋ก ์๋ํ์ง๋ง, ์์ธกํ๊ณ ์ ํ๋ ๊ฐ์ด ์ด์ฐ์ ์ธ ๊ฒ์ด ์๋๋ผ ์ฐ์์ ์ผ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฃผ์ด์ง ์ ๋ ฅ ์ํ์ K๊ฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์์ ํ๊ท ๊ฐ์ ๊ณ์ฐํ์ฌ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ ์ ์์ต๋๋ค.
ํ์๋ก ์ ํ๋ค
3์ฐจ์๋ ๊ฐ๋ฅ
tr_acc = []
test_acc = []
k_nums = range(1, 22, 2)# 1,3,5~21
for n in k_nums:
# ๋ชจ๋ธ ์ ํ ๋ฐ ํ์ต
model = KNeighborsClassifier(n_neighbors=n)
model.fit(X_train, y_train)
# ์ ํ๋ ๊ตฌํ๊ธฐ
acc_tr = model.score(X_train, y_train)
acc_test = model.score(X_test, y_test)
# ์ ํ๋ ๊ฐ ์ ์ฅ.
tr_acc.append(acc_tr)
test_acc.append(acc_test)
print("k : ", n)
print("ํ์ต์ฉ์
์ ํ๋ {:.3f}".format(acc_tr) )
print("ํ
์คํธ์ฉ์
์ ํ๋ {:.3f}".format(acc_test) )
๊ฒฐ๊ณผ)
k : 1
ํ์ต์ฉ์
์ ํ๋ 0.878
ํ
์คํธ์ฉ์
์ ํ๋ 0.733
k : 3
ํ์ต์ฉ์
์ ํ๋ 0.850
ํ
์คํธ์ฉ์
์ ํ๋ 0.744
k : 5
ํ์ต์ฉ์
์ ํ๋ 0.846
ํ
์คํธ์ฉ์
์ ํ๋ 0.756
k : 7
ํ์ต์ฉ์
์ ํ๋ 0.821
ํ
์คํธ์ฉ์
์ ํ๋ 0.733
k : 9
ํ์ต์ฉ์
์ ํ๋ 0.821
ํ
์คํธ์ฉ์
์ ํ๋ 0.722
k : 11
ํ์ต์ฉ์
์ ํ๋ 0.831
ํ
์คํธ์ฉ์
์ ํ๋ 0.733
k : 13
ํ์ต์ฉ์
์ ํ๋ 0.811
ํ
์คํธ์ฉ์
์ ํ๋ 0.767
k : 15
ํ์ต์ฉ์
์ ํ๋ 0.803
ํ
์คํธ์ฉ์
์ ํ๋ 0.744
k : 17
ํ์ต์ฉ์
์ ํ๋ 0.805
ํ
์คํธ์ฉ์
์ ํ๋ 0.767
k : 19
ํ์ต์ฉ์
์ ํ๋ 0.785
ํ
์คํธ์ฉ์
์ ํ๋ 0.711
k : 21
ํ์ต์ฉ์
์ ํ๋ 0.787
ํ
์คํธ์ฉ์
์ ํ๋ 0.744
https://colab.research.google.com/drive/1a4i2igOdXeMqh5U1aBbuI7_istHlzeX6#scrollTo=Y4jzbDfKJiR_
https://heytech.tistory.com/362
!pip install graphviz
!pip install mglearn # Install the mglearn library
import matplotlib.pyplot as plt
import mglearn
plt.figure(figsize=(10,10))
mglearn.plots.plot_animal_tree()
- (๊ฐ) ํธ๋ฆฌ์ ์ฌ์ฉ๋๋ ์ธ ๊ฐ์ feature๊ฐ ์์.
- 'Has feathers?'(๋ ๊ฐ๊ฐ ์๋์?)
- 'Can fly?'(๋ ์ ์๋์?)
- 'Has fins?'(์ง๋๋ฌ๋ฏธ๊ฐ ์๋์?)
- (๋) ์ด ๋จธ์ ๋ฌ๋ ๋ฌธ์ ๋ ๋ค ๊ฐ์ ํด๋์ค๋ก ๊ตฌ๋ถํ๋ ๋ชจ๋ธ์ ์์ฑ
- ๋ค ๊ฐ์ ํด๋์ค - ๋งค, ํญ๊ถ, ๋๊ณ ๋, ๊ณฐ
- (๋ค) ๋
ธ๋ ์ข
๋ฅ
- ๋งจ ์์ ๋ ธ๋ - Root Node(๋ฃจํธ ๋ ธ๋)
- ๋งจ ๋ง์ง๋ง ๋ ธ๋ - Leaf Node(๋ฆฌํ ๋ ธ๋)
- target๊ฐ ํ๋๋ก๋ง ์ด๋ฃจ์ด์ง Leaf Node(๋ฆฌํ ๋ ธ๋) ์์ ๋ ธ๋ (pure node)
- ์์ ๋ ธ๋๊ฐ ์๋ ์ตํ์์ ๋ ธ๋๋ฅผ ๋ฆฌํ ๋ ธ๋(Leaf node : ์)๋ผ๊ณ ํ๊ณ , ๋ฆฌํ ๋ ธ๋๊ฐ ์๋ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ ธ๋๋ฅผ ๋ด๋ถ ๋ ธ๋(Internal node)๋ผ๊ณ ํ๋ค. ๋ฆฌํ ๋ ธ๋ ์ค์์๋ ํ๋์ ํ๊ฒ ๊ฐ๋ง์ ๊ฐ์ง๋ ๋ ธ๋๋ฅผ ์์ ๋ ธ๋(Pure node)๋ผ๊ณ ํ๋ค.
- ๋ฆฌํ ๋ ธ๋(Leaf Node)๋ ๊ฒฐ์ ํธ๋ฆฌ์์ ์ตํ์ ๋ ธ๋๋ฅผ ์๋ฏธํ๋ฉฐ, ์ค๋จ ์์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ ๋๋ค. ์์ ๋ ธ๋(Pure Node)๋ ๋ฆฌํ ๋ ธ๋ ์ค์์ ํ๋์ ํด๋์ค(ํ๊น ๊ฐ)๋ง์ ๊ฐ์ง๋ ๋ ธ๋๋ฅผ ์ง์นญํฉ๋๋ค. ์ฆ, ์์ ๋ ธ๋๋ ํด๋น ๋ ธ๋์ ํฌํจ๋ ๋ฐ์ดํฐ๋ค์ด ๋ชจ๋ ๋์ผํ ํด๋์ค๋ก ๋ถ๋ฅ๋๋ ๊ฒฝ์ฐ์ ๋๋ค.
- (๋ผ) ๋
ธ๋ ๋ถ๊ธฐ(๊ฐ ๋
ธ๋)
- ๋ฒ์ฃผํ์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถํ๋ ์ง๋ฌธ ์ ํตํด ๋๋๋ค.
- ์ฐ์ํ์ ํน์ฑ i๊ฐ a๋ณด๋ค ํฐ๊ฐ?์ ์ง๋ฌธ์ผ๋ก ๋๋๋ค.
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import seaborn as sns
cancer = load_breast_cancer()
X = cancer.data
y = cancer.target
X_train, X_test, y_train, y_test = train_test_split(X, y,
stratify=cancer.target,
test_size = 0.3,
random_state=77)
tree = DecisionTreeClassifier(max_depth=2, random_state=0)
tree.fit(X_train, y_train)
print("ํ๋ จ ์ธํธ ์ ํ๋ : {:.3f}".format(tree.score(X_train, y_train)))
print("ํ
์คํธ ์ธํธ ์ ํ๋ : {:.3f}".format(tree.score(X_test, y_test)))
๊ฒฐ๊ณผ)
ํ๋ จ ์ธํธ ์ ํ๋ : 0.972
ํ
์คํธ ์ธํธ ์ ํ๋ : 0.912
for i in range(1,7,1):
tree = DecisionTreeClassifier(max_depth=i, random_state=0)
tree.fit(X_train, y_train)
print(f"max_depth : {i}")
print("ํ๋ จ ์ธํธ ์ ํ๋ : {:.3f}".format(tree.score(X_train, y_train)))
print("ํ
์คํธ ์ธํธ ์ ํ๋ : {:.3f}".format(tree.score(X_test, y_test)))
๊ฒฐ๊ณผ)
max_depth : 1
ํ๋ จ ์ธํธ ์ ํ๋ : 0.932
ํ
์คํธ ์ธํธ ์ ํ๋ : 0.883
max_depth : 2
ํ๋ จ ์ธํธ ์ ํ๋ : 0.972
ํ
์คํธ ์ธํธ ์ ํ๋ : 0.912
max_depth : 3
ํ๋ จ ์ธํธ ์ ํ๋ : 0.982
ํ
์คํธ ์ธํธ ์ ํ๋ : 0.906
max_depth : 4
ํ๋ จ ์ธํธ ์ ํ๋ : 0.985
ํ
์คํธ ์ธํธ ์ ํ๋ : 0.906
max_depth : 5
ํ๋ จ ์ธํธ ์ ํ๋ : 0.992
ํ
์คํธ ์ธํธ ์ ํ๋ : 0.889
max_depth : 6
ํ๋ จ ์ธํธ ์ ํ๋ : 0.997
ํ
์คํธ ์ธํธ ์ ํ๋ : 0.901
from sklearn.tree import export_graphviz
import graphviz
export_graphviz(tree,
out_file="tree.dot",
class_names=['์
์ฑ', '์์ฑ'],
feature_names = cancer.feature_names,
impurity = False, # gini ๊ณ์
filled=True) # color
with open("tree.dot") as f:
dot_graph = f.read()
display(graphviz.Source(dot_graph))
๊ฒฐ๊ณผ)
import torch
# PyTorch ๋ฒ์ ํ์ธ
print(torch.__version__)
# CUDA ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ
print(torch.cuda.is_available())
# ์ฌ์ฉ ๊ฐ๋ฅํ GPU ์ฅ์น ์ ํ์ธ
print(torch.cuda.device_count())
๊ฒฐ๊ณผ)
2.5.0+cu121
True
1
https://ldjwj.github.io/DL_Basic/part04_01_dl_start/ch01_03_NNet_Titanic_pytorch_V01_2411.html
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
import pandas as pd # import pandas and assign it to the alias pd # NumPy ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํฌํธํ๊ณ np๋ก ๋ณ์นญ์ ์ง์ ํฉ๋๋ค.
# ์๋ ๊ณ ์
torch.manual_seed(42)
np.random.seed(42)
# 1. ๋ฐ์ดํฐ ์ค๋น
# ๋ฐ์ดํฐ ๋ก๋
data = pd.read_csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')
data.shape
๊ฒฐ๊ณผ)
(891, 12)
# ํ์ํ ํผ์ฒ ์ ํ
features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare']
target = 'Survived'
# ์ฑ๋ณ ์ธ์ฝ๋ฉ
data['Sex'] = data['Sex'].map({'male': 0, 'female': 1})
import pandas as pd
from sklearn.impute import SimpleImputer # Import SimpleImputer from sklearn.impute
# ๊ฒฐ์ธก๊ฐ ์ฒ๋ฆฌ
imputer = SimpleImputer(strategy='median')
X = imputer.fit_transform(data[features])
y = data[target].values
# ๊ฒฐ์ธก๊ฐ์ด ์ฒ๋ฆฌ๋์๋์ง ํ์ธ
print("๊ฒฐ์ธก๊ฐ ์ฒ๋ฆฌ ํ ๋ฐ์ดํฐ:")
print(pd.DataFrame(X, columns=features).isnull().sum())
๊ฒฐ๊ณผ)
๊ฒฐ์ธก๊ฐ ์ฒ๋ฆฌ ํ ๋ฐ์ดํฐ:
Pclass 0
Sex 0
Age 0
SibSp 0
Parch 0
Fare 0
dtype: int64
# Import StandardScaler from sklearn.preprocessing
# from sklearn.preprocessing import Standard
from sklearn.preprocessing import StandardScaler # Changed 'Standard' to 'StandardScaler'
# ์ค์ผ์ผ๋ง
scaler = StandardScaler()
X = scaler.fit_transform(X)
# ๋ฐ์ดํฐ ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# NumPy to PyTorch Tensor ๋ณํ
# X_train์ด๋ผ๋ NumPy ๋ฐฐ์ด์ PyTorch์ FloatTensor๋ก ๋ณํ.
# FloatTensor๋ 32๋นํธ ๋ถ๋ ์์์ ์ซ์๋ก ๊ตฌ์ฑ๋ ํ
์๋ฅผ ์์ฑ.
# ์ด ๋ณํ์ PyTorch ๋ชจ๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๋นํ๋ ๋จ๊ณ
X_train = torch.FloatTensor(X_train)
X_test = torch.FloatTensor(X_test)
y_train = torch.FloatTensor(y_train).unsqueeze(1)
y_test = torch.FloatTensor(y_test).unsqueeze(1)
# 2. ์ ๊ฒฝ๋ง ๋ชจ๋ธ ์ ์
model = nn.Sequential(
nn.Linear(6, 16),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(16, 8),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(8, 1),
nn.Sigmoid()
)
# 3. ๋ชจ๋ธ ํ์ต
# ์์ค ํจ์์ ์ตํฐ๋ง์ด์ ์ ์
criterion = nn.BCELoss() # ์ด์ง ๋ถ๋ฅ ์์ค ํจ์
optimizer = optim.Adam(model.parameters(), lr=0.001)
# ํ์ต ์งํ
epochs = 100
for epoch in range(epochs):
# ์์ ํ
outputs = model(X_train)
loss = criterion(outputs, y_train)
# ์ญ์ ํ
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 20๋ฒ๋ง๋ค ์์ค ์ถ๋ ฅ
if (epoch + 1) % 20 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
๊ฒฐ๊ณผ)
Epoch [20/100], Loss: 0.7141
Epoch [40/100], Loss: 0.7019
Epoch [60/100], Loss: 0.6749
Epoch [80/100], Loss: 0.6433
Epoch [100/100], Loss: 0.5905
# 4. ๋ชจ๋ธ ํ๊ฐ
model.eval() # ํ๊ฐ ๋ชจ๋
with torch.no_grad():
test_outputs = model(X_test)
predicted = (test_outputs > 0.5).float()
accuracy = (predicted == y_test).float().mean()
print(f'Test Accuracy: {accuracy.item():.4f}')
๊ฒฐ๊ณผ)
Test Accuracy: 0.7877
https://snaiws.notion.site/DL-with-logit-a857e414f2ed4dfab2c51ad738388d84