Intro
- 1988년 존스홉킨스대학교의 세즈노프스키(Sejnowski)가 돌맹이가지고 연구함
중요
- 쉽게 해결하지 못하는, 하지만 머신러닝을 하는 사람이라면 반드시 극복해야 하는 문제인
과적합(overfitting)
1. 데이터의 확인과 실행
- Index가 208개
- 컬럼 수가 61개
- 60개의 속성과 1개의 클래스
- 모든 칼럼이 실수형(float64)
- 맨 마지막 칼럼만 객체형
- 마지막 칼럼은 클래스
- 데이터형 반환이 필요하다
# 데이터 분석
import pandas as pd
df = pd.read_csv('./deeplearning/dataset/sonar.csv', header=None)
print(df.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 208 entries, 0 to 207
Data columns (total 61 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 0 208 non-null float64
1 1 208 non-null float64
2 2 208 non-null float64
3 3 208 non-null float64
4 4 208 non-null float64
5 5 208 non-null float64
6 6 208 non-null float64
7 7 208 non-null float64
8 8 208 non-null float64
9 9 208 non-null float64
10 10 208 non-null float64
11 11 208 non-null float64
12 12 208 non-null float64
13 13 208 non-null float64
14 14 208 non-null float64
15 15 208 non-null float64
16 16 208 non-null float64
17 17 208 non-null float64
18 18 208 non-null float64
19 19 208 non-null float64
20 20 208 non-null float64
21 21 208 non-null float64
22 22 208 non-null float64
23 23 208 non-null float64
24 24 208 non-null float64
25 25 208 non-null float64
26 26 208 non-null float64
27 27 208 non-null float64
28 28 208 non-null float64
29 29 208 non-null float64
30 30 208 non-null float64
31 31 208 non-null float64
32 32 208 non-null float64
33 33 208 non-null float64
34 34 208 non-null float64
35 35 208 non-null float64
36 36 208 non-null float64
37 37 208 non-null float64
38 38 208 non-null float64
39 39 208 non-null float64
40 40 208 non-null float64
41 41 208 non-null float64
42 42 208 non-null float64
43 43 208 non-null float64
44 44 208 non-null float64
45 45 208 non-null float64
46 46 208 non-null float64
47 47 208 non-null float64
48 48 208 non-null float64
49 49 208 non-null float64
50 50 208 non-null float64
51 51 208 non-null float64
52 52 208 non-null float64
53 53 208 non-null float64
54 54 208 non-null float64
55 55 208 non-null float64
56 56 208 non-null float64
57 57 208 non-null float64
58 58 208 non-null float64
59 59 208 non-null float64
60 60 208 non-null object
dtypes: float64(60), object(1)
memory usage: 99.2+ KB
None
0 1 2 3 4 ... 56 57 58 59 60
0 0.0200 0.0371 0.0428 0.0207 0.0954 ... 0.0180 0.0084 0.0090 0.0032 R
1 0.0453 0.0523 0.0843 0.0689 0.1183 ... 0.0140 0.0049 0.0052 0.0044 R
2 0.0262 0.0582 0.1099 0.1083 0.0974 ... 0.0316 0.0164 0.0095 0.0078 R
3 0.0100 0.0171 0.0623 0.0205 0.0205 ... 0.0050 0.0044 0.0040 0.0117 R
4 0.0762 0.0666 0.0481 0.0394 0.0590 ... 0.0072 0.0048 0.0107 0.0094 R
[5 rows x 61 columns]
코드
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from keras.models import Sequential
from keras.layers.core import Dense
from sklearn.preprocessing import LabelEncoder
import pandas as pd
import numpy
import tensorflow as tf
# seed 값 설정
numpy.random.seed(3)
tf.random.set_seed(3)
# 데이터 입력
df = pd.read_csv('../../dataset/sonar.csv', header=None)
'''
# 데이터 개괄 보기
print(df.info())
# 데이터의 일부분 미리 보기
print(df.head())
'''
dataset = df.values
X = dataset[:,0:60]
Y_obj = dataset[:,60]
# 문자열 변환
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)
# 모델 설정
model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 모델 컴파일
model.compile(loss='mean_squared_error',
optimizer='adam',
metrics=['accuracy'])
# 모델 실행
model.fit(X, Y, epochs=200, batch_size=5)
# 결과 출력
print("\\n Accuracy: %.4f" % (model.evaluate(X, Y)[1]))
2. 과적합 이해하기(overfitting)
- 모델이 학습 데이터셋 안에서는 일정 수준 이상의 예측 정확도를 보이지만, 새로운 데이터에 적용하면 잘 맞지 않는 것을 말한다.
빨간색
- 주어진 샘플에 정확히 맞게끔 선이 그어져 있다