λ”₯λŸ¬λ‹/Today I learned :

[λ”₯λŸ¬λ‹] 초음파 κ΄‘λ¬Ό 데이터 : 과적합 ν”Όν•˜κΈ°

주영 🐱 2021. 3. 24. 15:08
728x90
λ°˜μ‘ν˜•

sonar.csv

import pandas as pd
df = pd.read_csv(’../dataset/sonar.csv’, header=None)
print(df.info())

 

Range Index: 208 entries,0 to 207

Data columns (total 61 columns):

0

208

non-null

float64

1

208

non-null

float64

59

208

non-null

float64

60

208

non-null

object

Dtypes: float64(60), object(1)

memory usage: 99.2+ KB

 

Indexκ°€ 208κ°œμ΄λ―€λ‘œ 총 μƒ˜ν”Œμ˜ μˆ˜λŠ” 208개이고, 컬럼 μˆ˜κ°€ 61κ°œμ΄λ―€λ‘œ 60개의 속성과 1개의 클래슀둜 이루어져 있음
λͺ¨λ“  컬럼이 μ‹€μˆ˜ν˜•(float64)인데, 맨 λ§ˆμ§€λ§‰ 컬럼만 κ°μ²΄ν˜•μΈ κ²ƒμœΌλ‘œ 보아,
λ§ˆμ§€λ§‰μ— λ‚˜μ˜€λŠ” μ»¬λŸΌμ€ 클래슀이며 λ°μ΄ν„°ν˜• λ³€ν™˜μ΄ ν•„μš”ν•œ 것을 μ•Œ 수 있음

 

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]))

Accuracy: 1.0000

 

μ •λ§λ‘œ 100% μ •ν™•λ„μ˜ λͺ¨λΈμ΄ λ§Œλ“€μ–΄μ§„ κ²ƒμΌκΉŒ?

 

과적합(overfitting) : λͺ¨λΈμ΄ ν•™μŠ΅ 데이터셋 μ•ˆμ—μ„œλŠ” 일정 μˆ˜μ€€ μ΄μƒμ˜ 예츑 정확도λ₯Ό λ³΄μ΄μ§€λ§Œ, μƒˆλ‘œμš΄ 데이터에 μ μš©ν•˜λ©΄ 잘 λ§žμ§€ μ•ŠλŠ” 것

μ™„μ „νžˆ μƒˆλ‘œμš΄ 데이터에 μ μš©ν•˜λ©΄ 이 선을 톡해 μ •ν™•νžˆ 두 그룹으둜 λ‚˜λˆ„μ§€ λͺ»ν•˜κ²Œ λœλ‹€

 

μ΄ˆλ‘μƒ‰ 선은 κ³Όμ ν•©λœ λͺ¨λΈμ„, 검은색 선은 일반 λͺ¨λΈμ„ λ‚˜νƒ€λ‚Έλ‹€.

과적합은 측이 λ„ˆλ¬΄ λ§Žκ±°λ‚˜ λ³€μˆ˜κ°€ λ³΅μž‘ν•΄μ„œ λ°œμƒν•˜κΈ°λ„ ν•˜κ³  ν…ŒμŠ€νŠΈμ…‹κ³Ό ν•™μŠ΅μ…‹μ΄ 쀑볡될 λ•Œ 생기기도 ν•œλ‹€. 

 


과적합을 λ°©μ§€ν•˜λ €λ©΄ ?

 

1.  ν•™μŠ΅μ„ ν•˜λŠ” 데이터셋과 이λ₯Ό ν…ŒμŠ€νŠΈν•  데이터셋을 μ™„μ „νžˆ κ΅¬λΆ„ν•œ λ‹€μŒ ν•™μŠ΅κ³Ό λ™μ‹œμ— ν…ŒμŠ€νŠΈλ₯Ό λ³‘ν–‰ν•˜λ©° 진행

 

 

예λ₯Ό λ“€μ–΄, 데이터셋이 총 100개의 μƒ˜ν”Œλ‘œ 이루어져 μžˆλ‹€λ©΄ λ‹€μŒκ³Ό 같이 두 개의 μ…‹μœΌλ‘œ λ‚˜λˆ•λ‹ˆλ‹€.

70개 μƒ˜ν”Œμ€ ν•™μŠ΅μ…‹μœΌλ‘œ

30개 μƒ˜ν”Œμ€ ν…ŒμŠ€νŠΈμ…‹μœΌλ‘œ

 

신경망을 λ§Œλ“€μ–΄ 70개의 μƒ˜ν”Œλ‘œ ν•™μŠ΅μ„ μ§„ν–‰ν•œ ν›„ 이 ν•™μŠ΅μ˜ κ²°κ³Όλ₯Ό μ €μž₯=‘λͺ¨λΈ

λͺ¨λΈμ€ λ‹€λ₯Έ 셋에 μ μš©ν•  경우 ν•™μŠ΅ λ‹¨κ³„μ—μ„œ κ°μΈλ˜μ—ˆλ˜ κ·ΈλŒ€λ‘œ λ‹€μ‹œ μˆ˜ν–‰, λ”°λΌμ„œ λ‚˜λ¨Έμ§€ 30개의 μƒ˜ν”Œλ‘œ μ‹€ν—˜ν•΄μ„œ 정확도λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ ν•™μŠ΅μ΄ μ–Όλ§ˆλ‚˜ 잘 λ˜μ—ˆλŠ”μ§€λ₯Ό μ•Œ 수 있음

λ”₯λŸ¬λ‹ 같은 μ•Œκ³ λ¦¬μ¦˜μ„ μΆ©λΆ„νžˆ μ‘°μ ˆν•˜μ—¬ κ°€μž₯ λ‚˜μ€ λͺ¨λΈμ΄ λ§Œλ“€μ–΄μ§€λ©΄, 이λ₯Ό μ‹€μƒν™œμ— λŒ€μž…ν•˜μ—¬ ν™œμš©ν•˜λŠ” 것이 λ°”λ‘œ λ¨Έμ‹ λŸ¬λ‹μ˜ 개발 μˆœμ„œ

 

 

그런데 μ§€κΈˆκΉŒμ§€ μš°λ¦¬λŠ” ν…ŒμŠ€νŠΈμ…‹μ„ λ§Œλ“€μ§€ μ•Šκ³  ν•™μŠ΅ν•΄ μ™”μŠ΅λ‹ˆλ‹€. κ·ΈλŸ°λ°λ„ 맀번 μš°λ¦¬λŠ” 정확도(Accuracy)λ₯Ό 계산할 수 μžˆμ—ˆμ§€μš”. μ–΄μ§Έμ„œ κ°€λŠ₯ν–ˆμ„κΉŒμš”? μ§€κΈˆκΉŒμ§€ ν•™μŠ΅ 데이터λ₯Ό μ΄μš©ν•΄ 정확도λ₯Ό μΈ‘μ •ν•œ 것은 데이터에 λ“€μ–΄μžˆλŠ” λͺ¨λ“  μƒ˜ν”Œμ„ κ·ΈλŒ€λ‘œ ν…ŒμŠ€νŠΈμ— ν™œμš©ν•œ κ²°κ³Όμž…λ‹ˆλ‹€.

ν•™μŠ΅μ— μ‚¬μš©λœ μƒ˜ν”Œμ€ ν…ŒμŠ€νŠΈμ— μ“Έ 수 μ—†μœΌλ―€λ‘œ ν•™μŠ΅ λ‹¨κ³„μ—μ„œ ν…ŒμŠ€νŠΈν•  μƒ˜ν”Œμ€ μžλ™μœΌλ‘œ λΉΌκ³ , 이λ₯Ό ν…ŒμŠ€νŠΈν•œ κ²°κ³Όλ₯Ό λͺ¨μ•„ 정확도λ₯Ό κ³„μ‚°ν•˜λŠ” κ²ƒμ΄μ§€μš”. μ΄λŸ¬ν•œ 방법은 λΉ λ₯Έ μ‹œκ°„μ— λͺ¨λΈ μ„±λŠ₯을 νŒŒμ•…ν•˜κ³  μˆ˜μ •ν•  수 μžˆλ„λ‘ 도와 μ€λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ λ¨Έμ‹ λŸ¬λ‹μ˜ μ΅œμ’… λͺ©μ μ€ 과거의 데이터λ₯Ό ν† λŒ€λ‘œ μƒˆλ‘œμš΄ 데이터λ₯Ό μ˜ˆμΈ‘ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.  즉, ν…ŒμŠ€νŠΈμ…‹μ„ λ§Œλ“€μ–΄ μ •ν™•ν•œ 평가λ₯Ό λ³‘ν–‰ν•˜λŠ” 것이 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. ν•™μŠ΅μ…‹λ§Œ 가지고 ν‰κ°€ν• λ•Œ, 측을 λ”ν•˜κ±°λ‚˜ 에포크(epoch) κ°’을 λ†’μ—¬ μ‹€ν–‰ 횟수λ₯Ό 늘리면 정확도가 κ³„μ†ν•΄μ„œ 올라갈 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν•™μŠ΅ λ°μ΄ν„°μ…‹λ§ŒμœΌλ‘œ ν‰κ°€ν•œ 예츑 성곡λ₯ μ΄ ν…ŒμŠ€νŠΈμ…‹μ—μ„œλ„ κ·ΈλŒ€λ‘œ λ‚˜νƒ€λ‚˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. 즉, ν•™μŠ΅μ΄ κΉŠμ–΄μ Έμ„œ ν•™μŠ΅μ…‹ λ‚΄λΆ€μ—μ„œμ˜ 성곡λ₯ μ€ 높아져도 ν…ŒμŠ€νŠΈμ…‹μ—μ„œλŠ” νš¨κ³Όκ°€ μ—†λ‹€λ©΄ 과적합이 μΌμ–΄λ‚˜κ³  μžˆλŠ” κ²ƒμ΄μ§€μš”. 이λ₯Ό κ·Έλž˜ν”„λ‘œ ν‘œν˜„ν•˜λ©΄ 

ν•™μŠ΅μ΄ κ³„μ†λ˜λ©΄ ν•™μŠ΅μ…‹μ—μ„œμ˜ μ •ν™•λ„λŠ” 계속 μ˜¬λΌκ°€μ§€λ§Œ, ν…ŒμŠ€νŠΈμ…‹μ—μ„œλŠ” 과적합이 λ°œμƒ!

ν•™μŠ΅μ„ 진행해도 ν…ŒμŠ€νŠΈ κ²°κ³Όκ°€ 더 이상 쒋아지지 μ•ŠλŠ” μ§€μ μ—μ„œ ν•™μŠ΅μ„ λ©ˆμΆ°μ•Ό ν•©λ‹ˆλ‹€. μ΄λ•Œμ˜ ν•™μŠ΅ 정도가 κ°€μž₯ μ μ ˆν•œ κ²ƒμœΌλ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ˜ˆμ œμ— 주어진 데이터λ₯Ό ν•™μŠ΅μ…‹κ³Ό ν…ŒμŠ€νŠΈμ…‹μœΌλ‘œ λ‚˜λˆ„λŠ” 예제λ₯Ό λ§Œλ“€μ–΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. 뢈러온 X 데이터와 Y λ°μ΄ν„°μ—μ„œ 각각 정해진 λΉ„μœ¨(%)만큼 κ΅¬λΆ„ν•˜μ—¬ ν•œ 그룹은 ν•™μŠ΅μ— μ‚¬μš©ν•˜κ³  λ‹€λ₯Έ ν•œ 그룹은 ν…ŒμŠ€νŠΈμ— μ‚¬μš©ν•˜κ²Œ ν•˜λŠ” ν•¨μˆ˜κ°€ sklearn λΌμ΄λΈŒλŸ¬λ¦¬μ˜ train_test_split() ν•¨μˆ˜μž…λ‹ˆλ‹€. λ”°λΌμ„œ λ‹€μŒκ³Ό 같이 ν•™μŠ΅μ…‹κ³Ό ν…ŒμŠ€νŠΈμ…‹μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. ν•™μŠ΅μ…‹μ„ 70%, ν…ŒμŠ€νŠΈμ…‹μ„ 30%둜 μ„€μ •ν–ˆμ„ λ•Œμ˜ μ˜ˆμž…λ‹ˆλ‹€.

from sklearn.model_selection import train_test_split
  
# ν•™μŠ΅μ…‹κ³Ό ν…ŒμŠ€νŠΈμ…‹μ˜ ꡬ뢄
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=seed)

그리고 λͺ¨λΈμ„ μ‹€ν–‰ν•˜λŠ” λΆ€λΆ„μ—μ„œ μœ„μ—μ„œ λ§Œλ“€μ–΄μ§„ ν•™μŠ΅μ…‹μœΌλ‘œ ν•™μŠ΅μ„, ν…ŒμŠ€νŠΈμ…‹μœΌλ‘œ ν…ŒμŠ€νŠΈλ₯Ό ν•˜κ²Œ ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 μ‹€ν–‰ν•©λ‹ˆλ‹€.

model.fit(X_train, Y_train, epochs=130, batch_size=5)
  
# ν…ŒμŠ€νŠΈμ…‹μ— λͺ¨λΈ 적용
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, Y_test)[1]))

 

β€‹ν•™μŠ΅μ΄ λλ‚œ ν›„ ν…ŒμŠ€νŠΈν•΄ λ³Έ κ²°κ³Όκ°€ 만쑱슀러울 λ•Œ 이λ₯Ό λͺ¨λΈλ‘œ μ €μž₯ν•˜μ—¬ μƒˆλ‘œμš΄ 데이터에 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•žμ„œ ν•™μŠ΅ν•œ κ²°κ³Όλ₯Ό λͺ¨λΈλ‘œ μ €μž₯ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 μ‹€ν–‰ν•©λ‹ˆλ‹€.

from keras.models import load_model
model.save(‘my_model.h5’)

뢈러였기:

model = load_model(‘my_model.h5’)

 

전체 μ½”λ“œ

from keras.models import Sequential, load_model
from keras.layers.core import Dense
from sklearn.preprocessing import LabelEncoder
 
import pandas as pd
import numpy
import tensorflow as tf
  
# seed κ°’ μ„€μ •
seed = 0
numpy.random.seed(seed)
tf.random.set_seed(3)
 
df = pd.read_csv('../dataset/sonar.csv', header=None)
 
dataset = df.values
X = dataset[:,0:60]
Y_obj = dataset[:,60]
 
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)
  
# ν•™μŠ΅μ…‹κ³Ό ν…ŒμŠ€νŠΈμ…‹μ„ λ‚˜λˆ”
from sklearn.model_selection import train_test_split
 
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=seed)
 
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_train, Y_train, epochs=130, batch_size=5)
model.save('my_model.h5')   # λͺ¨λΈμ„ 컴퓨터에 μ €μž₯
 
del model  # ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ λ©”λͺ¨λ¦¬ λ‚΄μ˜ λͺ¨λΈμ„ μ‚­μ œ
model = load_model('my_model.h5') # λͺ¨λΈμ„ μƒˆλ‘œ 뢈러옴
 
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, Y_test)[1]))  # 뢈러온 λͺ¨λΈλ‘œ ν…ŒμŠ€νŠΈ μ‹€ν–‰

Test Accuracy: 0.8095


kκ²Ή ꡐ차 검증

 

 λ”₯λŸ¬λ‹ ν˜Ήμ€ λ¨Έμ‹ λŸ¬λ‹ μž‘μ—…μ„ ν•  λ•Œ 늘 μ–΄λ €μš΄ 문제 쀑 ν•˜λ‚˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μΆ©λΆ„νžˆ ν…ŒμŠ€νŠΈν•˜μ˜€μ–΄λ„ 데이터가 μΆ©λΆ„μΉ˜ μ•ŠμœΌλ©΄ 쒋은 κ²°κ³Όλ₯Ό λ‚΄κΈ°κ°€ μ–΄λ ΅λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ•žμ„œ 가지고 μžˆλŠ” λ°μ΄ν„°μ˜ μ•½ 70%λ₯Ό ν•™μŠ΅μ…‹μœΌλ‘œ 써야 ν–ˆμœΌλ―€λ‘œ ν…ŒμŠ€νŠΈμ…‹μ€ 겨우 전체 λ°μ΄ν„°μ˜ 30%에 κ·Έμ³€μŠ΅λ‹ˆλ‹€. 이 정도 ν…ŒμŠ€νŠΈλ§ŒμœΌλ‘œλŠ” μ‹€μ œλ‘œ μ–Όλ§ˆλ‚˜ 잘 μž‘λ™ν•˜λŠ”μ§€ ν™•μ‹ ν•˜κΈ°λŠ” 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ 단점을 λ³΄μ™„ν•˜κ³ μž λ§Œλ“  방법이 λ°”λ‘œ kκ²Ή ꡐ차 검증(k-fold cross validation)μž…λ‹ˆλ‹€.

kκ²Ή ꡐ차 κ²€μ¦μ΄λž€ 데이터셋을 μ—¬λŸ¬ 개둜 λ‚˜λˆ„μ–΄ ν•˜λ‚˜μ”© ν…ŒμŠ€νŠΈμ…‹μœΌλ‘œ μ‚¬μš©ν•˜κ³  λ‚˜λ¨Έμ§€λ₯Ό λͺ¨λ‘ ν•©ν•΄μ„œ ν•™μŠ΅μ…‹μœΌλ‘œ μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 가지고 μžˆλŠ” λ°μ΄ν„°μ˜ 100%λ₯Ό ν…ŒμŠ€νŠΈμ…‹μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 5κ²Ή ꡐ차 검증(5-fold cross validation):

 

sklearn의 StratifiedKFold() : 데이터λ₯Ό μ›ν•˜λŠ” 숫자만큼 μͺΌκ°œ 각각 ν•™μŠ΅μ…‹κ³Ό ν…ŒμŠ€νŠΈμ…‹μœΌλ‘œ μ‚¬μš©λ˜κ²Œ λ§Œλ“œλŠ” ν•¨μˆ˜

from sklearn.model_selection import StratifiedKFold
n_fold = 10
skf = StratifiedKFold(n_splits=n_fold, shuffle=True, random_state=seed)

 

10개의 파일둜 μͺΌκ°œ ν…ŒμŠ€νŠΈν•˜λŠ” 10κ²Ή ꡐ차 검증.

 n_fold의 값을 10으둜 μ„€μ •ν•œ λ’€ StratifiedKFold() ν•¨μˆ˜μ— 적용.

κ·Έ λ‹€μŒ λͺ¨λΈμ„ λ§Œλ“€κ³  μ‹€ν–‰ν•˜λŠ” 뢀뢄을 for κ΅¬λ¬ΈμœΌλ‘œ λ¬Άμ–΄ n_fold만큼 반볡

for train, test in skf.split(X, Y):
    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[train], Y[train], epochs=100, batch_size=5)

 

정확도(Accuracy)λ₯Ό 맀번 μ €μž₯ν•˜μ—¬ ν•œ λ²ˆμ— 보여쀄 수 있게 accuracy λ°°μ—΄μ„ λ§Œλ“­λ‹ˆλ‹€

 

accuracy = []
 
for train, test in skf.split(X, Y):
    (μ€‘λž΅)
    k_accuracy = "%.4f" % (model.evaluate(X[test], Y[test])[1])
    accuracy.append(k_accuracy)
 
print("\n %.f fold accuracy:" % n_fold, accuracy)

 

전체 μ½”λ“œ

from keras.models import Sequential
from keras.layers.core import Dense
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
 
import numpy
import pandas as pd
import tensorflow as tf
  
# seed κ°’ μ„€μ •
seed = 0
numpy.random.seed(seed)
tf.set_random_seed(seed)
 
df = pd.read_csv('../dataset/sonar.csv', header=None)
 
dataset = df.values
X = dataset[:,0:60]
Y_obj = dataset[:,60]
 
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)
  
# 10개의 파일둜 μͺΌκ°¬
n_fold = 10
skf = StratifiedKFold(n_splits=n_fold, shuffle=True, random_state=seed)
  
# 빈 accuracy λ°°μ—΄
accuracy = []
  
# λͺ¨λΈμ˜ μ„€μ •, 컴파일, μ‹€ν–‰
for train, test in skf.split(X, Y):
    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[train], Y[train], epochs=100, batch_size=5)
    k_accuracy = "%.4f" % (model.evaluate(X[test], Y[test])[1])
    accuracy.append(k_accuracy)
  
# κ²°κ³Ό 좜λ ₯
print("\n %.f fold accuracy:" % n_fold, accuracy)

 

μ‹€ν–‰ κ²°κ³Ό

10 fold accuracy: ['0.8182', '0.7143', '0.8095', '0.8095', '0.7619', '0.8095', '0.8571', '0.9500', '0.7500', '0.8000']

10번의 ν…ŒμŠ€νŠΈκ°’ 좜λ ₯됨

λ°˜μ‘ν˜•