ML&DL_sklearn๊ณต๋ถ(2). Iris Data๋ฅผ ์ด์ฉํ ํ์ต๊ณผ ํ๊ฐ
๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ.
from sklearm.dataset import load_iris
data = load_iris()
- ์ฌ๊ธฐ์ load_iris๋ ๋ฐ์ดํฐ ๋ฐ ๋ฐ์ดํฐ์ ์ค๋ช ์ ๋ด์ ๋์ ๋๋ฆฌ๋ฅผ ๋ฐํ.
- dictionary๋ฅผ ์๋์ ์ฝ๋๋ฅผ ํตํด ํ์ธํด๋ณผ ์ ์๋ค.
์ ์ฒ๋ฆฌ ๋ฐ EDA
np.unique(data.target, return_counts = True)
# uniqueํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํด์ฃผ๊ณ , return_counts๋ฅผ ์ค์ ํด์ฃผ๋ฉด ๊ฐฏ์๋ ๋ฐํํด์ค๋ค.
print(data.target_names) #['setosa' 'versicolor' 'virginica']
print(data.target_names.shape, data.target_names[data.target].shape) # (3,) (150,)
# ์ด์ด๋ฆ, ํ๊ฒ๊ฐ ์์
iris.columns = ['sl', 'sw', 'pl', 'pw']
iris['Species'] = data.target_names[data.target]
# => data.target_names๋ฅผ data.target์ ๊ฐ์ ์ฆ 150๋ฒ๋งํผ ์์ธํด์ค๋ค๋ ๊ฒ์ ์๋ฏธ. ํ๊ฒ๊ฐ์ ์์ .
iris.head()
๊ฒฐ์ธก๊ฐ ์๋์ง ํ์ธํด์ฃผ๊ธฐ.
- ๊ฒฐ์ธก๊ฐ์ด ์๋ค๋ฉด ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํจ.
- ๊ฒฐ์ธก๊ฐ ์ ๊ฑฐ: dropna
- ๊ฒฐ์ธก๊ฐ ๋์ฒด: fillna, interpolate
iris.isna().sum() # ๊ฒฐ์ธก๊ฐ ๋ช๊ฐ๋?
๊ธฐ์ดํต๊ณ ๋ถ์
- iris.describe() : ํต๊ณ์ ๋ณด ์๋ ค์ค.
- iris.info() : Dataframe์ ๊ธฐ๋ณธ์ ๋ณด ํ์ธ.
- iris.groupby('Species').size() : ์ข ๋ฅ๋ณ๋ก ๊ฐ์ ์๋ ค์ค.
- iris.Species.value_counts() : ์ข ๋ฅ๋ณ๋ก ๊ฐ์ ์๋ ค์ค.
๋ฐ์ดํฐ ์๊ฐํ
๊ธฐ์ด ํต๊ณ๋ ๋ฐ ์ด์์น ์๊ฐํ(boxplot)
def boxplot_iris(feature_names, dataset):
i = 1
plt.figure(figsize = (11, 9))
for col in feature_names:
plt.subplot(2, 2, i)
plt.axis('on')
plt.tick_params((axis = 'both', left = True, top = False,
right = False, bottom = True, labelleft = False,
labeltop = False, labelright = False, labelbottom = False)
dataset[col].plot(kind = 'box', subplots = True, sharex = False, sharey = False)
plt.title(col)
i += 1
plt.show()
boxplot_iris(iris.columns[:-1], iris)
๋ง์ฝ์ ์๋์ ์ธ ์์น๋ฅผ ๋ณด๊ณ ์ถ์ผ๋ฉด sharex์ sharey๋ฅผ True๋ก ํด์ค ๊ฒ.
fig, axes = plt.subplots(2, 2, figsize = (11, 9), sharex = True, sharey = True)
axes = axes.ravel() # np.ravel()์ 1์ฐจ์ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ค๋ค.
for i, ax in enumerate(axes):
iris.iloc[:, i].plot(kind = 'box', ax = ax)
ax.set_title(iris.columns[i])
plt.show()
๋ฐ์ดํฐ ๋ถํฌ ์๊ฐํ(histogram)
def histogram_iris(feature_names, dataset):
i = 1
plt.figure(figsize = (11, 9))
for col in feature_names:
plt.subplot(2, 2, i)
plt.axis('on')
plt.tick_params(axis = 'both', left = True, top = False,
right = False, bottom = False, labelleft = False,
labeltop = False, labelright = False, labelbottom = False)
dataset[col].plot(kind = 'hist', subplots = True, sharex = False, sharey = False)
plt.title(col)
i += 1
plt.show()
histogram_iris(iris.columns[:-1], iris)
์๊ด๊ด๊ณ ์๊ฐํ(heatmap)
correlationship matrix๋ฅผ ์์ฑํด์ค.
corr = iris.corr() cmap = sns.diverging_palette(220, 19, as_cmap = True) plt.figure(figsize=(11,9)) sns.heatmap(corr, cmap=cmap, vmax=1.0, vmin=-1.0, center=0, square=True, linewidths=.5, cbar_kws={'shrink':.5}) plt.show()
ํผ์ฒ ๊ฐ์ ์๊ด๊ด๊ณ ๋ฐ ๋ฐ์ดํฐ ๋ถํฌ ์๊ฐํ(pairplot)
sns.pairplot(iris, hue = 'Species')
plt.show()
ํ๊ฒ์ ํด๋์ค ๋น์จ(piechart)
ํ๊ฒ์ ํด๋์ค ๋น์จ์ ์๊ฐํํด์ ์ดํด๋ณธ๋ค.
def piechar_iris(feature_names, target, dataset): i = 1 plt.figure(figsize = (11, 9)) for colName in [target]: labels = []; sizes = [] df = dataset.groupby(colName).size() for key in df.keys(): labels.append(key) sizes.append(df[key]) plt.subplot(2, 2, i) plt.axis('on') plt.tick_params(axis = 'both', left = False, top = False, right = False, bottom = False, labelleft = True, labeltop = True, labelright = False, labelbottom = False) plt.pie(sizes, labels = labels, autopct = '%1.1f%%', shadow = True, startangle = 140) plt.axis('equal') i += 1 #plt.axis('equal') ์ ๋๊ทธ๋ ํ๋ฅผ ๋ง๋ค์๋ ๋ป. plt.show() piechar_iris(iris.columns[:-1], iris.Species, iris)
Hold out
```python
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris.iloc[:, :-1], iris.iloc[:, -1], test_size = 0.33, random_state = 42)
```
- : sklearn์ train_test_split ํจ์๋ก ํ๋ จ์ฉ ๋ฐ์ดํฐ์ ๊ณผ ์ฑ๋ฅํ๊ฐ์ฉ ๋ฐ์ดํฐ์ ์ ๋๋๋ค.
ํ์ต
train : ํ์ต ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ต์ํค๋ ์ฉ๋
validation : ์ด๋ค hyperparameter๊ฐ ์ข์์ง ํ๋๊ณผ ํ๊ฐ
test : Best parameter๋ก ํ์ต์ํจ ๋ชจ๋ธ์ ํ๊ฐํ๋ ์ฉ๋
๋ชจ๋ธ์์ฑ๐
\- ์๊ณ ๋ฆฌ์ฆ ์ ํ : ์ด ์์ ์์๋ **Decision Tree Classifier** ์ ์ด์ฉํ ๊ฒ์ด๋ค.
`python from sklearn.tree import DecisionTreeClassifier model = DecisionTreeClassifier(random_state = 42)`
\- ๋ชจ๋ธํ์ต
`python model.fit(X_train, y_train)`
\- score
`python model.score(X_test, y_test) # 0.98, iris ๋ฐ์ดํฐ๋ ๊ต์ฅํ ์ข์ ๋ฐ์ดํฐ๋ผ ์ด๋ป๊ฒ ํ์ต์ ์์ผ๋ ๋์ ์ ์๊ฐ ๋์จ๋ค.`
๋ชจ๋ธ ์ผ๋ฐํ ์ ๋ต & Learning curve๐
๋จธ์ ๋ฌ๋์ด๋ ๋ฐ์ดํฐ์ ์ํด์ ๋ชจ๋ธ์ ์ฑ๋ฅ์ด ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ์ถฉ๋ถํ ๋ง์์ผ ํ๋ค. ๋ฐ์ดํฐ๊ฐ ์ถฉ๋ถ์น ์์ ๊ฒฝ์ฐ, ํน์ ํ์ต๋ฐ์ดํฐ์๋ง ๋์ ์ฑ๋ฅ์ ๊ฐ์ง๋ ๊ณผ์ ํฉ์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ธ์ ์ผ๋ฐํํด์ฃผ๋ ๋
ธ๋ ฅ์ด ํ์ํ๋ค.
validation set
๐ ํ์ต๋ฐ์ดํฐ์ ์์๋ ์ผ๋ถ๋ฅผ hold outํด์ validation set์ผ๋ก ํ์ฉํด์ค๋ค.cross vaildation(๊ต์ฐจ๊ฒ์ฆ)
๐ ๋ฐ์ดํฐ์ ์ k๊ฐ๋งํผ ๋๋์ด, ์กฐ๊ฐ๋ค์ ๋์๊ฐ๋ฉด์ validation set์ผ๋ก ์ฌ์ฉํ๋ค. ๊ทธ ๋ค์, k๊ฐ์ ์ฑ๋ฅ ๊ฒฐ๊ณผ๋ฅผ ํ๊ท ๋ด์ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ถ์ ํ๋ค.KFold
from sklearn.model_selection import cross_val_score, KFold cv = KFold(n_splits = 10, shuffle = True, random_state = 42) results = cross_val_score(model, X_train, y_train, cv = cv) fin_result = results.mean() for i, r in enumerate(results): print(f"{i}๋ฒ์งธ ๊ต์ฐจ ๊ฒ์ฆ ์ ํ๋: {r}") print(f"\n๊ต์ฐจ๊ฒ์ฆ ์ต์ข ์ ํ๋: {fin_result}")
Stratified KFold
: ํ validation set์์ ๊ฝ 3๊ฐ์ง์ ์ข ๋ฅ๊ฐ ๊ณจ๊ณ ๋ฃจ ์์ด์ค ํ ์ฑ๋ฅ์ ํ๊ฐํ๋ค.from sklearn.model_selection import cross_val_score, StratifiedKFold cv = StratifiedKFold(n_splits = 10, shuffle = True, random_state = 42) results = cross_val_score(model, X_train, y_train, cv = cv) fin_result = results.mean() for i, r in enumerate(results): print(f"{i}๋ฒ์งธ ๊ต์ฐจ ๊ฒ์ฆ ์ ํ๋: {r}") print(f"\n๊ต์ฐจ๊ฒ์ฆ ์ต์ข ์ ํ๋: {fin_result}")
Learning curve
๊ต์ฐจ๊ฒ์ฆ ๊ธฐ๋ฒ์ ๋ฐ์ดํฐ์ ์์ด ์ถฉ๋ถํ์ง ์์ ๋ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ธ๋ฐ, ์ด ๋ ๋ฐ์ดํฐ์ ์์ด ์ถฉ๋ถํ๊ฐ์ ๋ํด์๋ ํ์ต๊ณก์ ์ ๊ทธ๋ฆผ์ผ๋ก์จ ํ๋จํ ์ ์๋ค.import scikitplot as skplt skplt.estimators.plot_learning_curve(model, X_train, y_train, figsize = (6,6)) plt.show() ``
๋ชจ๋ธ ์ต์ ํ ์ ๋ต๐
- ํ์ดํผํ๋ผ๋ฏธํฐ : scikit-learn์์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ธ์คํด์คํํ ๋ ํ์ดํผํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ ์ ์๋ค.
- **GridSearchCV** ๋ฅผ ์ด์ฉํ์ฌ ํ์ดํผ ํ๋ผ๋ฏธํฐ ํ์
๐ ํ์ดํผ ํ๋ผ๋ฏธํฐ ์กฐํฉ์ ๋ํ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ชจ๋ ๊ฒฉ์(grid)์ ๋์ดํ๊ณ ๋ชจ๋ ์กฐํฉ์ ์ผ์ผํ ํ์ต ๋ฐ ์ฑ๋ฅ ์ธก์ ํ๋ ๊ธฐ๋ฅ์ด๋ค.
๐ estimator๋ก๋ ์๊ณ ๋ฆฌ์ฆ ์ธ์คํด์ค๋ฅผ ์ ๋ฌํ๊ณ , param\_grid์๋๋ ํ
์คํธํ ํ์ดํผํ๋ผ๋ฏธํฐ๋ฅผ ๋ด์ **๋์
๋๋ฆฌ**๋ฅผ ์ ๋ฌํ๋ค.
from sklearn.model_selection import GridSearchCV
estimator = DecisionTreeClassifier()
params= {'max_depth':range(4, 13, 2),
'criterion':['gini', 'entropy'],
'splitter':['best', 'random'],
'min_weight_fraction_leaf':[0.0, 0.1, 0.2, 0.3],
'random_state':[7, 23, 42, 78, 142],
'min_impurity_decrease':[0., 0.05, 0.1, 0.2]}
model = GridSearchCV(estimator, params, cv=cv, verbose=1,
n_jobs = -1, refit=True) # validation set 10๊ฐ * ํ์ดํผํ๋ผ๋ฏธํฐ ์กฐํฉ์ 1600๊ฐ = 16000๋ฒ
# refit : best parmaeter ํ์ต๊ฒฐ๊ณผ๋ฅผ best_estimator_ ์์ฑ์ ๊ธฐ๋กํด๋๋ค.
model.fit(X_train, y_train)
print(f"Best Estimator: {model.best_estimator_}\n")
print(f"Best Params: {model.best_params_}\n")
print(f"Best Scorer: {model.best_score_}\n")
ํ๊ฐ ์งํ ๋ฐ ๋ชจ๋ธ ํ๊ฐ
์ ํ๋๋ง์ผ๋ก ๋ชจ๋ธ์ ํ๊ฐ/๊ฒ์ฆํ๋ ๊ฒ์ ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ๊ฐ์งํ๋ค๋ ์ ํ์๊ฐ ์๋ค.
Confusion Matrix
์ด์ง๋ถ๋ฅ : ์์ธก์ ํ ๋ ๋๊ฐ์ง๋ก ์์ธกํ๋ ๊ฒฝ์ฐ ์ด 4๊ฐ์ง์ ๊ฒฝ์ฐ๊ฐ ๋์ค๊ฒ ๋๋ค.
๋ค์ค๋ถ๋ฅ : ์์ด๋ฆฌ์ค ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ๊ฝ์ ํน์ง๋ค(feature)๋ค์ ๊ฐ์ง๊ณ ์ด ๊ฝ์ด setosa์ธ์ง, versicolor์ธ์ง, virginic์ธ์ง ์์ธกํ๊ฒ ๋๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ์งํ๋ฅผ ๋ง๋ค๋ฉด ์๋์ ๊ฐ์ด ๋๋ค.
์์ด๋ฆฌ์ค ๋ฐ์ดํฐ์ ์ confusiom matrix ์ฝ๋
from sklearn.metrics import confusion_matrix pred = model.predict(X_test) confMatrix = confusin_matrix(y_test, pred) print('Confusion Matrix :\n : ', confMatrix)
scikit-plot์ ์ด์ฉํ๋ฉด confusion matrix๋ฅผ ๋ ์ง๊ด์ ์ธ heatmap์ผ๋ก ์๊ฐํํ ์ ์๋ค.
skplt.metrics.plot_confusion_matrix(y_test, pred, figsize=(8,6))
plt.show()
Precision, Recall, Fall-out, F-score
- FP, FN, TP, TN : ์์ ์์ธก์ ๋ง์ท๋์ง ํ๋ ธ๋์ง / ๋ค๋ P๋ผ ์์ธกํ๋์ง, N์ด๋ผ ์์ธกํ๋์ง
- precision(์ ๋ฐ๋)
- ์์ธกํ ํด๋์ค ์ค์ ์ค์ ๋ก ๋ง์ ๋น์จ(๋น์ผ ์ ๋ขฐ์ฑ์๋ ์ง๋จ๊ธฐ), ์๋ฅผ ๋ค์ด ์์ฑ์ด๋ผ ์์ธกํ ๊ฒ ์ค์์ ์ค์ ์์ฑ์ธ ๊ฒ์ ๋น์จ.
- TP/TP+FP
- recall(์ฌํ์จ)(TPR)
- ์ค์ ํ๊ฒ ํด๋์ค ์ค์์ ์์ธก์ด ๋ง์ ๋น์จ, ์๋ฅผ ๋ค์ด ์ค์ ์์ฑ์ ๊ฐ์ ์ค์์ ์์ฑ์ผ๋ก ์์ธกํ ๊ฒ์ ๋น์จ(ํจ์จ์ ์ธ ๊ฐ์ผ ์ง๋จ๊ธฐ)
- TP/TP+FN
- fall-out
- ํ๊ฒ์ด ์๋ ์ค์ ํด๋์ค ์ค์์ ํ๋ฆฐ ๋น์จ.
- f-score
- ์ ๋ฐ๋์ ์ฌํ์จ์ trade-off๊ด๊ณ์ด๋ค.
- ์ ๋ฐ๋์ ์ฌํ์จ์ ๊ฐ์ค์กฐํํ๊ท .
precs = []
rcls = []
specs = []
for i in range(3):
TP = confMatrix[i, i]
FN = confMatrix[i].sum() - TP
FP = confMatrix[:,i].sum() - TP
TN = confMatrix.sum() - TP - FN - FP
precs.append(TP/(TP+FP))
rcls.append(TP/(TP+FN))
specs.append(TN/(TN+FP))
precs = np.array(precs)
rcls = np.array(rcls)
specs = np.array(specs)
fall_outs = 1 - specs
print(precs)
print(rcls)
print(specs)
print(fall_outs)
ROC curve์ AUC
- ROC curve
- ์๋ TPR(True Positive Rate)๋ฅผ y์ถ, FPR(False Positive Rate)๋ฅผ x์ถ์ผ๋ก ํ๋ ๊ทธ๋ํ์ด๋ค.
- TPR์ recall์ด๋ ๊ฐ๊ณ , FPR์ fall-out๊ณผ ๊ฐ์์ FP/FP+TN(์ค์ negative์ธ ํ๋ณธ๊ฐ์)์ ์๋ฏธํ๋ค.
- ํด๋์ค ํ๋ณ ๊ธฐ์ค๊ฐ์ ๋ณํ์ ๋ฐ๋ฅผ ์ฌํ์จ๊ณผ ์์์ฑ์จ์ ๋ณํ๋ฅผ ์๊ฐํ ํ ๊ฒ.
skplt.metrics.plot_roc(y_test, pred_proba, figsize = (8,6))
plt.show()
- AUC
- ROC curve ๋ฐ์ ๋ฉด์ ์ ๊ณ์ฐ. ๊ฑฐ๊พธ๋ก ๊ธฐ์ต์์ผ์๋ก ์ข์ ์ฑ๋ฅ์ ๋ํ๋ธ๋ค.
์ต์ข ๋ชจ๋ธ
์ต์ข ๋ชจ๋ธํ์ต
model.fit(iris.iloc[:, :-1], iris.iloc[:, -1]model.fit(iris.iloc[:, :-1], iris.iloc[:, -1]`)
๋ชจ๋ธ์ ์ฅ
๋ชจ๋ธ์ ์ฌ์ฌ์ฉ ํ๊ธฐ ์ํด์ ๋ชจ๋ธ์ ์ ์ฅํด๋์. pickle์ ์ด์ฉํ๋ฉด ๋ชจ๋ธ ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์ฅํ ์ ์๋ค.
import pickle
with open("final_model.pickle", "wb") as fp:
pickle.dump(model, fp)
๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ ๋ฐ ์์ธก
๋ชจ๋ธ์ ๋ค์ ๋ถ๋ฌ์ฌ ๋๋ load ๋ฉ์๋๋ฅผ ์ด์ฉํ๊ณ ์ ์ฅํ ๋ชจ๋ธ์ ๋ถ๋ฌ์์ ์์ธก๊ฐ์ csv๋ก ์ ์ฅํด๋ณด์.
f = open('new_model.pickle', 'rb')
model = pickle.load(f); f.close()
predicted_species = model.predict(iris.iloc[:, :-1])
iris['predicted_species'] = predicted_species #์๋ก์ด ์ด์ ๋ง๋ค์ด์ฃผ๊ธฐ.
iris.to_csv('Final.csv', index = False)
'Computer Science > ํ์ด์ฌ๋ผ์ด๋ธ๋ฌ๋ฆฌ&sklearn&keras' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ML&DL_sklearn๊ณต๋ถ(1) << Decision Tree (0) | 2020.08.13 |
---|---|
๋ฅ๋ฌ๋ >> Sequence Model๊ณผ Attention mechanism(deep learning.ai๊ฐ์) (0) | 2020.07.23 |
ํ๊ต ๊ณต๋ถ >> dlib ์ค์น ์ค๋ฅ&ํด๊ฒฐ (0) | 2020.04.11 |
DataStructure::Segmentation fault 11 error (0) | 2019.04.24 |