- ๋ถ๋ฅ์ ํ๊ท ๋ฌธ์ ์ ๋๋ฆฌ ์ฌ์ฉํ๋ ๋ชจ๋ธ
๐ผ ์ค๋น
from sklearn import preprocessing from sklearn.model_selection import train_test_split from sklearn import tree from sklearn import metrics import pandas as pd import numpy as np # ํ๊ธ ๊นจ์ง ๋ฐฉ์ง 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()
# UCI ML Repository ์ ๊ณตํ๋ Breast Cancer ๋ฐ์ดํฐ์
๊ฐ์ ธ์ค๊ธฐ
uci_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/\breast-cancer-wisconsin/breast-cancer-wisconsin.data'
df = pd.read_csv(uci_path, header=None)
# ์ด ์ด๋ฆ ์ง์
df.columns = ['id', 'clump', 'cell_size', 'cell_shape', 'adhesion', 'epithlial', 'bare_nuclei', 'chromatin', 'normal_nucleoli', 'mitoses', 'class']
๐ bare_nuclei๋ง object์ธ ๊ฒ์ ์๋ฌธ -> unique()๋ก ํ์ธ
df['bare_nuclei'].unique()
๐ '?' ๋๋ฌธ์์ ์ ์ ์์ -> '?' ๋ฅผ ์์ ๊ธฐ ์ํด์ ๋ค์์ ๊ณผ์ ์ ๋ฐ๋ฆ
1) '?' -> np.nan์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์๋ฅผ ํ์ธ
df['bare_nuclei'].replace('?', np.nan, inplace=True) df['bare_nuclei'].isna().sum() # 16๊ฐ์ ๋ฌผ์ํ๋ฅผ np.nan๋ณํ
2) NaN ๋ฐ์ดํฐ ์ญ์
df.dropna(subset=['bare_nuclei'], axis=0, inplace=True)
3) bare_nuclei ์ปฌ๋ผ ํ๋ณํ int
df['bare_nuclei'] = df['bare_nuclei'].astype('int')
df.info() ๊ฒฐ๊ณผ type์ด int๋ก ๋ณํ๋์์
X = df[['clump', 'cell_size', 'cell_shape', 'adhesion', 'epithlial',
'bare_nuclei', 'chromatin', 'normal_nucleoli', 'mitoses']]
y = df['class']
# X ๋
๋ฆฝ๋ณ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทํ
X = preprocessing.StandardScaler().fit(X).transform(X)
X
# train, test set ๋ถ๋ฆฌ(7:3)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=7)
print('X_train.shape : ', X_train.shape)
print('X_test.shape : ', X_test.shape)
# ๋ชจ๋ธ ๊ฐ์ฒด ์์ฑ (์ต์ ์ ์์ฑ์ ์ฐพ๊ธฐ ์ํด criterion='entropy'์ ์ฉ) * ์ ์ ํ ๋ ๋ฒจ ๊ฐ ์ฐพ๋ ๊ฒ์ด ์ค์
tree_model = tree.DecisionTreeClassifier(criterion='entropy', max_depth = 5) # 5๊ฐ๋ก๋ง ๋ชจ๋ธ ๊ตฌ์ฑ
# ๋ชจ๋ธ ํ์ต
tree_model.fit(X_train, y_train)
# ๋ชจ๋ธ ์์ธก
y_pred = tree_model.predict(X_test)
print('ํ๋ จ ์ธํธ ์ ํ๋ : {:.2f}%'.format(tree_model.score(X_train, y_train)*100))
print('ํ
์คํธ ์ธํธ ์ ํ๋ : {:.2f}%'.format(tree_model.score(X_test, y_test)*100))
tree_report = metrics.classification_report(y_test, y_pred)
print(tree_report)
from sklearn.tree import export_graphviz
export_graphviz(tree_model, out_file='tree.dot', class_names=['์
์ฑ','์์ฑ'],
feature_names=df.columns[1:10], impurity=False, filled=True)
import graphviz
with open('tree.dot') as f:
dot_graph = f.read()
display(graphviz.Source(dot_graph))
๋๋ค ํฌ๋ ์คํธ ๊ตฌ์ถ
ํ๊ท์ ๋ถ๋ฅ์ ์์ด์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ
ํ
์คํธ ๋ฐ์ดํฐ๊ฐ์ด ๋งค์ฐ ์ฐจ์์ด ๋๊ณ ํฌ์ํ ๋ฐ์ดํฐ๋ค์๋ ์ ์๋ํ์ง ์์
๊ทธ๋๋์ธํธ ๋ถ์คํ
ํ๊ทํธ๋ฆฌ
์ฌ๋ฌ๊ฐ์ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ๋ฌถ์ด ๊ฐ๋ ฅํ ๋ชจ๋ธ์ ๋ง๋ฆ
๐ผ ์ค๋น
๋ฐ์ดํฐ ๋ค์ด๋ก๋ : https://archive.ics.uci.edu/ml/datasets/heart+disease
# ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import plotly.express as px from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble import GradientBoostingClassifier from sklearn import metrics # ๋ฐ์ดํฐ ์ค๋น df = pd.read_csv('/content/heart.csv')
์นดํ ๊ณ ๋ฆฌ(๋ฒ์ฃผํ) ์ปฌ๋ผ -> Dtype category -> ์ํซ์ธ์ฝ๋ฉ
์ซ์ํ(์ฐ์ํ) ์ปฌ๋ผ -> ์ ๊ทํ
- ์ปฌ๋ผ๋ค unique()๋ก ํ์ธํด๋ณด๊ธฐ
# ๋ฒ์ฃผํ categorical_var = ['sex', 'cp', 'fbs', 'restecg', 'exng', 'slp', 'caa', 'thall'] df[categorical_var] = df[categorical_var].astype('category') df.info() # ์ซ์ํ numberic_var = [i for i in df.columns if i not in categorical_var][:-1] # categorical_var์ด ์๋ ์ปฌ๋ผ๋ค
sns.countplot(df.sex) # sex (1 = male; 0 = female)
๐ ๋จ์ฑ(1)์ ๋น์จ์ด ๋์
px.bar(df.groupby('cp').sum().reset_index()[['cp', 'output']], x='cp', y='output',color='cp')
cp : chest pain type
-- Value 1: typical angina
-- Value 2: atypical angina
-- Value 3: non-anginal pain
-- Value 4: asymptomatic
๋ฒ์ฃผํ ๋ณ์(categorical_var)์ output(y) ๊ด๊ณ ์๊ฐํ
fig, ax = plt.subplots(2,4, figsize=(10,5), dpi=200) for axis, cat_var in zip(ax.ravel(), categorical_var): sns.countplot(x=cat_var, data=df, hue='output', ax=axis) plt.tight_layout()
์์นํ(numberic_var)์ output(y)๊ด๊ณ ์๊ฐํ
fig, ax = plt.subplots(1, 5, figsize=(15,5), dpi=200) for axis, num_var in zip(ax.ravel(), numberic_var): sns.boxplot(y=num_var, data=df, x='output', ax=axis) plt.tight_layout()
์์นํ(numberic_var) ์ปฌ๋ผ ์ค ๋์ด ์ปฌ๋ผ์ ์ ๊ฑฐํ๊ณ 5%์ ์ด์์น๋ฅผ ์ ๊ฑฐ
trtbps , chol, oldpeak : ์์ 5% ์ด์์น ์ ๊ฑฐ
thalachh : ํ์ 5% ์ด์์น ์ ๊ฑฐdf = df[df['trtbps'] < df['trtbps'].quantile(0.95)] # 100% - 5% = 95%๋ง df = df[df['chol'] < df['chol'].quantile(0.95)] df = df[df['oldpeak'] < df['oldpeak'].quantile(0.95)] df = df[df['thalachh'] > df['thalachh'].quantile(0.05)]
์์นํ(numberic_var)์ output(y)๊ด๊ณ ์๊ฐํ
# subplot์ ๋๊ฐ์ ๊ฐ์ return ํ๊ธฐ ๋๋ฌธ์ ๋ณ์ ๋๊ฐ ํ์ fig, ax = plt.subplots(1, 5, figsize=(15,5), dpi=200) for axis, num_var in zip(ax.ravel(), numberic_var): sns.boxplot(y=num_var, data=df, x='output', ax=axis) plt.tight_layout()
X = df.iloc[:, :-1] # iloc[row,column]
y = df['output']
# ๋ฒ์ฃผํ -> ์ํซ์ธ์ฝ๋ฉ
temp_x = pd.get_dummies(X[categorical_var])
# ์ํซ์ธ์ฝ๋ฉ ์ปฌ๋ผ ์ถ๊ฐ
X_modified = pd.concat([X, temp_x], axis=1)
# ๊ธฐ์กด ์ปฌ๋ผ ์ญ์
X_modified.drop(categorical_var, axis=1, inplace=True)
X_modified
# ์์นํ ๋ณ์ -> ์ ๊ทํ -> ์ค์ผ์ผ๋ง
X_modified[numberic_var] = StandardScaler().fit_transform(X_modified[numberic_var])
X_modified.head()
# test, train ๋ฐ์ดํฐ ๋ถ๋ฆฌ
# 80:20 ๋น์จ๋ก ๋ถ๋ฆฌ
X_train, X_test, y_train, y_test = train_test_split(X_modified, y, test_size=0.2, random_state=7)
logreg = LogisticRegression(C=0.301).fit(X_train, y_train)
print('logreg ํ๋ จ ์ธํธ ์ ํ๋ : {:.5f}%'.format(logreg.score(X_train, y_train)*100))
print('logreg ํ
์คํธ ์ธํธ ์ ํ๋ : {:.5f}%'.format(logreg.score(X_test, y_test)*100))
logreg ํ๋ จ ์ธํธ ์ ํ๋ : 88.82979%
logreg ํ
์คํธ ์ธํธ ์ ํ๋ : 85.41667%
tree = DecisionTreeClassifier(max_depth=5, min_samples_leaf=10, min_samples_split=40).fit(X_train, y_train)
print('DecisionTree ํ๋ จ ์ธํธ ์ ํ๋ : {:.5f}%'.format(tree.score(X_train, y_train)*100))
print('DecisionTree ํ
์คํธ ์ธํธ ์ ํ๋ : {:.5f}%'.format(tree.score(X_test, y_test)*100))
DecisionTree ํ๋ จ ์ธํธ ์ ํ๋ : 81.91489%
DecisionTree ํ
์คํธ ์ธํธ ์ ํ๋ : 81.25000%
random = RandomForestClassifier(n_estimators=400, random_state=7).fit(X_train, y_train)
print('RandomForest ํ๋ จ ์ธํธ ์ ํ๋ : {:.5f}%'.format(random.score(X_train, y_train)*100))
print('RandomForest ํ
์คํธ ์ธํธ ์ ํ๋ : {:.5f}%'.format(random.score(X_test, y_test)*100))
RandomForest ํ๋ จ ์ธํธ ์ ํ๋ : 100.00000%
RandomForest ํ
์คํธ ์ธํธ ์ ํ๋ : 83.33333%
boost = GradientBoostingClassifier(max_depth=2, learning_rate=0.05).fit(X_train, y_train)
print('GradientBoosting ํ๋ จ ์ธํธ ์ ํ๋ : {:.5f}%'.format(boost.score(X_train, y_train)*100))
print('GradientBoosting ํ
์คํธ ์ธํธ ์ ํ๋ : {:.5f}%'.format(boost.score(X_test, y_test)*100))
GradientBoosting ํ๋ จ ์ธํธ ์ ํ๋ : 93.61702%
GradientBoosting ํ
์คํธ ์ธํธ ์ ํ๋ : 85.41667%
๐ ์ฌ๋ฌ ์์ธ๋ค(max_depth, n_estimators)์ ๋ฐ๊พธ๋ฉด ์ ํ๋๊ฐ ๋ฌ๋ผ์ง ์ ์์!
ํ ์คํธ ์ธํธ ์ ํ๋ ๋์ด๊ธฐ !
๐ผ ์ฐ๋ฆฌ์กฐ ๐ฅฐ 3์กฐ(1๋ฑ) ๐ฅฐ
๐ฐ ์ง๋ํ์ต ์๊ณ ๋ฆฌ์ฆ ์์ฝ ์ ๋ฆฌ
๊ฐ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ํน์ง
- ์ต๊ทผ์ ์ด์ : ์์ ๋ฐ์ดํฐ์ ์ผ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ ๋ชจ๋ธ๋ก์ ์ข๊ณ ์ค๋ช ํ๊ธฐ ์ฌ์
- ์ ํ ๋ชจ๋ธ : ์ฒซ๋ฒ์งธ๋ก ์๋ํ ์๊ณ ๋ฆฌ์ฆ, ๋์ฉ๋ ๋ฐ์ดํฐ์ ๊ฐ๋ฅ, ๊ณ ์ฐจ์ ๋ฐ์ดํฐ์ ๊ฐ๋ฅ
- ๋์ด๋ธ ๋ฒ ์ด์ฆ : ๋ถ๋ฅ๋ง ๊ฐ๋ฅ, ์ ํ ๋ชจ๋ธ๋ณด๋ค ํจ์ฌ ๋น ๋ฆ, ๋์ฉ๋ ๋ฐ์ดํฐ์ ๊ณผ ๊ณ ์ฐจ์ ๋ฐ์ดํฐ์ ๊ฐ๋ฅ, ์ ํ ๋ชจ๋ธ๋ณด๋ค ๋ ์ ํํจ
- ๊ฒฐ์ ํธ๋ฆฌ : ๋งค์ฐ ๋น ๋ฆ, ๋ฐ์ดํฐ ์ค์ผ์ผ ์กฐ์ ์ด ํ์ ์์, ์๊ฐํํ๊ธฐ ์ข๊ณ ์ค๋ช ํ๊ธฐ ์ฌ์
- ๋๋ค ํฌ๋ ์คํธ : ๊ฒฐ์ ํธ๋ฆฌ ํ๋๋ณด๋ค ๊ฑฐ์ ํญ์ ์ข์ ์ฑ๋ฅ์ ๋, ๋งค์ฐ ์์ ์ ์ด๊ณ ๊ฐ๋ ฅ, ๋ฐ์ดํฐ ์ค์ผ์ผ ์กฐ์ ํ์์์, ๊ณ ์ฐจ์ ํฌ์ ๋ฐ์ดํฐ์๋ ์๋ง์
- ๊ทธ๋๋์ธํธ ๋ถ์คํธ ๊ฒฐ์ ํธ๋ฆฌ : ๋๋ค ํฌ๋ ์คํธ๋ณด๋ค ์กฐ๊ธ ๋ ์ฑ๋ฅ์ด ์ข์, ๋๋ค ํฌ๋ ์คํธ๋ณด๋ค ํ์ต์ ๋๋ฆฌ๋ ์์ธก์ ๋น ๋ฅด๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์กฐ๊ธ ์ฌ์ฉ, ๋๋ค ํฌ๋ ์คํธ๋ณด๋ค ๋งค๊ฐ๋ณ์ ํ๋ ๋ง์ด ํ์
- SVM : ๋น์ทํ ์๋ฏธ์ ํน์ฑ์ผ๋ก ์ด๋ค์ง ์ค๊ฐ ๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ์ ๋ง์, ๋ฐ์ดํฐ ์ค์ผ์ผ ์กฐ์ ํ์, ๋งค๊ฐ๋ณ์์ ๋ฏผ๊ฐ
- ์ ๊ฒฝ๋ง : ํน๋ณํ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์์ ๋งค์ฐ ๋ณต์กํ ๋ชจ๋ธ์ ๋ง๋ค ์ ์์, ์ ํ๊ณผ ๋ฐ์ดํฐ์ค์ผ์ผ์ ๋ฏผ๊ฐ, ํฐ ๋ชจ๋ธ์ ํ์ต์ด ์ค๋๊ฑธ๋ฆผ