출처) 숙명여자대학교 소프트웨어학부 김주균 교수님 '운영체제' 수업 & [OS? Oh Yes!] , 220303

 

1. 운영체제

- 컴퓨터의 여러 응용 프로그램을 설치되게 해주고, 여러가지 장치를 효율적으로 작동하도록 하며, 사용자가 컴퓨터를 손쉽게 이용할 수       있도록 해주는 프로그램의 집단

- 하드웨어의 여러 부분을 건드리는 경우가 많기 때문에 하드웨어에 의존적인 경우가 많고, 따라서 이전에는 하드웨어 회사마다 자신만의 OS를 갖고 있었음

- 크게 사용자 인터페이스(User Interface)와 자원 관리(Resource Management)를 위한 프로그램의 집합으로 설명할 수 있음

 

2. 운영체제 변천사

    2-1. 수동식 계산기

    - 기원전 3000년 경 중국에서 발명된 주판이 발판이 됨

    - 존 네피어 봉, 파스칼의 톱니바퀴 계산기, 라이프니츠의 계산기 등

    - 이 당시에 운영체제는 존재하지 않았음

 

    2-2. 자동식 계산기

    - 배비지의 증기기관으로 작동되는 해석장치를 시작으로 홀러리스의 천공기 등이 있으며

    - 에이컨의 MARK Ⅰ은 23자리 숫자의 가감을 매초 3회, 곱셈은 3초에 1회씩 계산이 가능했음

    - 이 때에도 운영체제는 없었으며 소수의 기술자에 의해 수동으로 조작되었음

 

    2-2-1. 1세대 운영체제 (1940-1950)

    - 진공관 컴퓨터 시기

    - ABC(45개의 진공관) → ENIAC(최초의 컴퓨터) → EDSAC(폰 노이만 2진 부호 체계) → UNIVAC-Ⅰ → IBM 701 → IBM 305(자기 디스크 장치 채택) 등 

    - IBM 701에 와서 비로소 운영체제의 효시라 할 수 있는 기능 장착됨 → "일괄처리 시스템"

일괄처리 시스템 (Single-stream Batch Processing Systems)
- 다수 개의 프로그램을 읽어 저장해놓되, 한 번에 한 개씩의 프로그램을 실행시키는 방식
- 다음 작업을 처리할 때의 시간 절약

Batch
- 초창기: 작업이 차례대로 한 개씩 처리된다는 뜻. 한 개의 작업이 시작되면 그 작업이 끝날 때까지 다른 작업은 기다려야 함
- 이후: 일괄처리를 하되 다중 프로그래밍을 하는 Batch로 발전함
- 작업이 끝날 때까지 사용자의 중간 개입이 허용되지 않음

 

    2-2-2. 2세대 운영체제 (1960년대 전반기)

    - 트랜지스터 컴퓨터 + 자기코어 기억장치(주기억장치로 사용), 자기 디스크 팩(보조기억장치로 사용)

    - UNIVAC-Ⅱ → IBM 1400시리즈(크기 축소, 속도 증가)

    - 어셈블리언어, FORTRAN, COBOL 등 등장

    - 운영체제는 컴퓨터에 장착된 다양한 주변기기들을 효율적으로 관리하는 데 관심

    - Multiprogramming System & MultiProcessing System

    - Timesharing System & Interactive System

    - Realtime System

폰 노이만의 "내장 프로그램" 개념
- 어떠한 작업도 실행되기 위해서는 주기억장치에 있어야 한다.
다중 프로그램 시스템 (Multiprogramming System)
- 다수 개의 작업을 CPU에 넣어놓는 방식

다중 처리 시스템 (Multiprocessing System)
- 여러 개의 처리장치(CPU)를 장착하여 동시에 여러 작업을 병렬로 실행하는 방식
- CPU가 2개 이상

다중 처리 시스템은 여러 작업이 동시에 진행된다고 하였지만, 실행이 될 때 주기억장치에 있어야하기 때문에
다중 처리를 위해서는 다중 프로그래밍이 필요하다.
시분할 시스템 (Timesharing System)
CPU가 처리할 수 있는 시간을 작업 수에 맞춰 분할하여 각자에게 일정량만큼씩 분배하여 번갈아가며 처리하는 방식
시분할 시스템을 위해서는 다중 프로그래밍이 필요하다.

대화식 시스템 (Interactive System)
시분할 시스템으로 사용자에게 바로바로 응답할 수 있게 되었다.
→ 모니터, 키보드, 마우스 등을 이용해 시스템과 사용자가 대화하듯이 일을 처리해가는 방식

 

다중 프로그램 시스템으로 인해 시분할 시스템이 가능하게 되었고, 시분할 시스템을 위해 대화식 시스템이 필요하다.

 

2.2.3. 3세대 운영체제 (1960년대 후반기 - 1970년대)

- 집적회로(IC)의 개발 -> CPU에 적용

- 범용 컴퓨터 시스템 -> 컴퓨터 다양한 용도로 사용됨

- IBM 360계열: batch 시스템 기본적으로 탑재

- DEC: interactive 시스템 탑재

- 다중모드 시분할 시스템(Multi-inmode)

    - 일괄처리(batch), 시분할(time-sharing), 실시간 작업(real-time) 모두 지원

    - 기본적으로 시분할, 필요한 경우 batch, 실시간 등 지원함

- TCP/IP 표준과 함께 근거리 통신망(LAN) 등장

- UNIX 운영체제 출현

    - UNIX 이전에는 각 하드웨어마다 운영체제 존재, 소스코드 비공개

    - 소스코드 공개로 자연스럽게 널리 퍼져서 다양한 버전이 탄생함

 

2.2.4. 4세대 운영체제 (1970년대 후반기 - 현재)

- 고밀도 집적회로 

- 마이크로프로세서

    - 최소의 비용으로 최대의 효과

    - 분산 및 병렬 처리 시스템 등장

    - 데이터베이스, 인공지능, 운영체제의 표준안에 관한 연구도 활발히 진행

    - 모든 pc에 적용됨

 

3. OS 기능

- UNIX 구성 요소

    - 사용자 인터페이스(쉘)

        - 장치 관리

        - 파일 관리

        - 메모리 관리

        - 처리기 관리

 

- 쉘 (사용자 인터페이스)

    - GUI가 현재보다 발달하기 전:

        - command창에서 명령어 입력

        - command interpreter가 명령어 번역 후 명령어 실행파일 실행

        - 끝나면 다음 명령어 입력 대기

        - command interpreter == 사용자 인터페이스(쉘)

 

        - 모든 os에 command interpreter가 존재함. unix에서는 쉘이라는 이름으로 존재하는것

        - unix에서 /bin 디렉터리에 있는 실행파일들이 command 실행파일들임

 

        - 시스템에서 쓸 수 있는 모든 command들만으로 만들어진 프로그램: command procedure

        - 프로그램 설치할 때 기본 환경 확인, 설치, path 설정, 설정완료 등 모든 과정이 command로 이루어짐

        - 이 설치 프로그램: command precedure

        - 쉘이 command procedure까지 합쳐서 의미하는 경우도 있음

 

4. OS의 위치

- 운영체제는 크게 커널과 유틸리티 프로그램으로 나눔

 

- 커널

    - 운영체제의 기능들 중 빈번하게 사용되는 부분

    - 부팅될 때 주기억장치에 적재되어 종료될 때까지 상주

    - 유틸리티를 따로 둔 이유는 주기억장치의 용량 부족

    - 사용자 인터페이스의 대부분이 유틸리티에 속함

    - IO.SYS, MSDOS.SYS, COMMAND.SYS 등이 커널에 속함

    - 커널 중에서도 더 빠른 실행이나 높은 수준의 보호가 요구되는 프로그램들은 펌웨어 형태인 ROM이나 PLA로 만들어 놓음

 

- 듀얼모드

    - 유저모드 + 커널모드

    - 일반 사용자가 운영체제나 시스템 등을 임의로 수정하는 것을 막기 위해 그러한 일들은 운영체제가 담당하도록 커널 모드에서 실행

    - 사용자 프로그램이나 응용 프로그램은 유저모드에서 실행

    - 프로그램이 실행될 때 유저모드와 커널모드가 번갈아가면서 실행됨

    - ex)

total = 0

for i in range(1, 50):
    total += i
print(total)

    이건 소스코드이긴 하지만,

    컴파일이 될 때 print문은 모니터, 프린터 등 다른 HW를 건드려야하기 때문에 system call로 바뀐다.

    그리고 실행시키면 유저모드에서 실행되다가, system call을 만나면 커널모드로 바뀐다.

    I/O 담당 운영체제가 실행되어 print 대상 device를 확인하고, device가 실행중인지 확인 후 입출력을 실행한다.

    입출력이기 때문에 time sharing system 방식으로 cpu가 작동한다.

    end를 만나면 프로그램이 끝나며 다시 유저모드로 돌아간다.

    이처럼 간단한 프로그램에서도 유저모드와 커널모드가 번갈아가며 작동한다. 

'Software > OS' 카테고리의 다른 글

[OS] 4장. CPU 스케줄링  (0) 2022.04.18
[OS] 3장. 프로세스와 스레드  (0) 2022.04.11
[OS] 2장. OS 상식과 인터럽트  (0) 2022.04.10

출처 https://www.boostcourse.org/ds214/lecture/102086?isDesc=false 

 

프로젝트로 배우는 데이터사이언스

부스트코스 무료 강의

www.boostcourse.org

 

1. 당뇨병 데이터셋

https://www.kaggle.com/uciml/pima-indians-diabetes-database

https://www.scikit-learn.org/stable/modules/generated/sklearn.datasets.load_diabetes.html#sklearn.datasets.load_diabetes

* pregnancies : 임신횟수
* glucose : 2시간 동안의 경구 포도당 내성 검사에서 혈장 포도당 농도
* bloodPressure : 이완기 혈압 (mm Hg)
* skinThickness : 삼두근 피부 주름 두께 (mm), 체지방을 추정하는데 사용되는 값
* insulin : 2시간 혈청 인슐린 (mu U / ml)
* BMI : 체질량 지수 (체중kg / 키 (m)^2)
* diabetesPedigreeFunction : 당뇨병 혈통 기능
* age : 나이
* outcome : 당뇨병인지 아닌지, 768개 중에 268개의 결과 클래스 변수 (0 / 1)는 1이고 나머지는 0이다. 

 

2. 라이브러리 import

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

%matplotlib inline

 

3. 데이터셋 로드

df = pd.read_csv("diabetes.csv")  #주피터노트북에서 실행 -> 경로 간단
df.shape

9개의 feature가 존재하고, 768개의 데이터가 있다.

 

df.head()

결측치가 없고 다 숫자로 되어있기 때문에 이 데이터셋은 전처리를 하지 않아도 괜찮다.

 

4. 학습, 예측 데이터셋 나누기

# 8:2 비율로 구하기 위해 전체 데이터 행에서 80% 위치에 해당되는 값을 구해서 split_count 변수에 담기

split_count = int(df.shape[0] * 0.8) 
split_count

# train, test로 슬라이싱을 통해 데이터 나눔

train = df[:split_count].copy()
train.shape

test = df[split_count:].copy()
test.shape

데이터셋 자체로 학습을 하고, 예측 후 정확도까지 알아보기 위해서 위에서부터 80%는 학습데이터, 나머지 20%는 예측데이터로 분리했다.

80% 지점이 614번째 데이터이기 때문에

학습데이터는 614개,

예측데이터는 154개이다.

 

5. 학습, 예측에 사용할 컬럼

# feature_names 라는 변수에 학습과 예측에 사용할 컬럼명을 가져옴
# 여러개를 가져왔기 때문에 list 형태로 가져옴

feature_names = train.columns[:-1].tolist()
feature_names

# label_name 에 예측할 컬럼의 이름 담음

label_name = train.columns[-1]
label_name

feature는 이렇게 9개가 있는데, 우리가 예측할 것은 마지막 컬럼인 outcome (당뇨병인지 아닌지) 이기 때문에 뒤에서 두번째 컬럼인 Age까지를 feature_names에 저장하고, 마지막 outcome을 label_name에 저장했다.

 

6. 학습, 예측 데이터셋 만들기

# 학습 세트 만들기 
# 행렬

X_train = train[feature_names]
print(X_train.shape)
X_train.head()

앞에서 나눈 80%의 학습데이터셋 train에 feature_names 컬럼을 적용하여 학습데이터셋 X_train 을 만들었다.

 

# 정답 값
# 벡터

y_train = train[label_name]
print(y_train.shape)
y_train.head()

마찬가지로 앞에서 나눈 80%의 학습데이터셋에 label_name 컬럼을 적용하여 학습할 때 정답을 맞추는 데이터셋 y_train을 만들었다.

 

# 예측에 사용할 데이터셋

X_test = test[feature_names]
print(X_test.shape)
X_test.head()

 

다음은 앞에서 나눈 20%의 예측데이터셋에 feature_names를 적용하여 학습한 알고리즘에 적용할 예측데이터셋 X_test를 만들었다.

# 예측의 정답값
# 실전에는 없지만, 실전 적용 전 정답을 알고있기 때문에 내가 만든 모델의 성능을 측정해봐야 함

y_test = test[label_name]
print(y_test.shape)
y_test.head()

마지막으로, 예측 모델의 성능을 측정하기 위한 예측 정답 데이터셋을 만들었다.

20% 예측 데이터셋에 label_name을 적용한 데이터셋으로, 실전 예측 문제에는 없지만 이 예제에서는 알고있는 값이기 때문에 모델의 성능을 측정할 때 사용할 것이다.

 

7. 머신러닝 알고리즘 가져오기

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier()
model

decision tree classifier 알고리즘을 사용할 것이기 때문에 이 알고리즘을 model 변수에 저장해준다.

 

8. 학습 (훈련)

model.fit(X_train, y_train)

아주 간단하다.

머신러닝 알고리즘.fit(훈련데이터, 정답데이터) 형식이다.

 

9. 예측

y_predict = model.predict(X_test)
y_predict[:5]

학습이 기출문제와 정답으로 공부를 하는 과정이었다면, 예측은 실전 문제를 푸는 과정이라고 볼 수 있다.

위에서 5개 데이터의 예측 결과를 보자면 이와 같다. 1은 당뇨병, 0은 당뇨병이 아니라는 것이다.

 

10. 트리 알고리즘 분석

from sklearn.tree import plot_tree

#plot_tree(model, 
#         feature_names = feature_names)  
# 글자로 나옴

# 시각화

plt.figure(figsize = (20, 20))

tree = plot_tree(model, 
                 feature_names = feature_names,
                filled = True,
                fontsize = 10)

 

# 피처의 중요도 표시 

model.feature_importances_

각 피처의 중요도를 알려준다.

 

# 피처의 중요도 시각화

sns.barplot(x = model.feature_importances_, y = feature_names)

seaborn을 활용해서 각 피처의 중요도를 시각화했다.

 

11. 정확도(Accuracy) 측정하기

# 실제값 - 예측값 -> 같은 값은 0으로 나옴
# 여기서 절대값을 씌운 값 = 1 인 값이 다르게 예측한 값임

diff_count = abs(y_test - y_predict).sum()
diff_count

# decision tree 예측할 때마다 다르게 예측할 수 있기 때문에 이 값은 다르게 나올 수 있음
# 항상 같게 하려면 model = DecisionTreeClassifier(random_state = 42)처럼 random_state 지정

우리는 예측 데이터셋의 정답도 알고있기 때문에 모델의 정확도를 측정할 수 있다.

outcome 값은 0 또는 1이기 때문에 실제값에서 예측값을 뺀 값의 절대값이 1인 값이 틀린 것이라고 볼 수 있다.

실제값에서 예측값을 뺀 값들의 합을 (틀린 예측의 수) diff_count 변수에 저장했다.

 

# 예측의 정확도 구하기 -> 100점 만점에 몇 점인지

(len(y_test) - diff_count) / len(y_test) * 100

예측데이터셋에서 틀린 예측의 수를 뺀 비율로 정확도를 구했더니 약 69%가 나왔다.

decision tree는 예측할 때마다 가지의 수 등의 원인으로 다르게 예측할 수 있다.

이를 고정하려면 알고리즘을 불러올 때 속성에서 random_state 값을 지정해주어야 한다.

 

# 위처럼 직접 구할 수도 있지만, 미리 구현된 알고리즘을 가져와 사용한다

from sklearn.metrics import accuracy_score

accuracy_score(y_test, y_predict) * 100

 

이건 사이킷런에 미리 구현된 알고리즘으로 정확도를 계산한 것이다. 위와 같은 값이다.

 

# model 의 score로 점수 계산 (정답값 y_test 알고있을 때)

model.score(X_test, y_test)

이건 model 의 score로 점수를 계산한 것이다. 정답값을 알고있을 때 사용하며, 위에서의 정확도와 같다.

출처 https://www.boostcourse.org/ds214/joinLectures/28155

 

프로젝트로 배우는 데이터사이언스

부스트코스 무료 강의

www.boostcourse.org

 

1. Scikit Learn

- 대표적인 파이썬 머신러닝 라이브러리

- classification, regression, clustering, dimensionality reduction, model selection, preprocessing 등 알고리즘

 

- supervised machine learning

clf = RandomForestClassifier()  # 머신러닝 모델 (트리모델)

clf.fit(X_train, y_train)  # 학습, x는 학습 데이터, y는 정답

 

y_pred = clf.predict(X_test)  # 예측

clf.score(X_test, y_test)  # 확인, 현실 문제에서는 y_test 알 수 없을 것, 하지만 임의로 데이터를 나누어 학습시켰다면 알 수 있음

 

- unsupervised transfomations

pca = PCA()  # 비지도학습 중 차원축소기법

pca.fit(X_train)

X_new = pca.transform(X_test)

 

- estimator.fit(X, [y])

estimator: 지정해줄 수 있는 알고리즘 모델

fit -> 학습 (비지도학습은 y 없음)

 

* estimator.predict -> classification, regression, clustering

* estimator.transform -> preprocessing, dimensionality reduction, feature seelction, feature exteaction

 

2. 데이터 검증

 

데이터에 알맞는 모델과 파라미터를 찾기 위해 훈련 데이터로 테스트를 진행한다.

 

1. 데이터를 training data와 test data로 구분한다.

2. cross-validation을 통해 여러 fold로 나눈다.

3. 나눠준 폴더의 개수만큼 훈련을 진행한다.

4. 예를 들어 5개의 폴더로 나누면 fold1부터 5까지 하나씩 test data로 놓고 나머지로 training 후 test data로 성능을 확인한다.

5. 각각의 fold에 있는 점수의 평균을 내서 가장 좋은 점수를 내는 모델과 파라미터를 찾는다.

 

clf = SVC(파라미터)

clf.fit(X_train, y_train)

 

3. grid searches

이러한 과정을 거쳐 알맞은 모델과 파라미터를 구한다.

 

4. 기본 예제

from sklearn imoprt tree
X = [[0, 0], [1, 1]]
y = [0, 1]

clf = tree.DecisionTreeClassifier()
clf.fit(X, y)

clf.predict([[2., 2.]])

clf.predict_proba([[2., 2.]])

 

결정 트리 분류 모델에 x = [0, 0] 일  때 y = 0이고, x = [1, 1] 일 때 y = 1인 훈련 데이터를 학습시켰다.

그리고 x = [2., 2.]일 때 y값을 예측했더니 1이 나왔다.

 

estimator.predict_proba 는 예측값을 비율로 출력하는 함수이다.

 

5. iris dataset 예제

from sklearn.datasets import load_iris
from sklearn import tree
import matplotlib.pyplot as plt

X, y = load_iris(return_X_y = True)
X, y              # decisiontree 알고리즘이 숫자만 읽을 수 있기 때문에 카테고리 데이터 -> 숫자화

사이킷런 라이브러리에 내장되어 있는 아이리스 데이터셋을 불러왔다.

원래는 문자로 된 범주형 데이터지만, decision tree 알고리즘이 숫자만 읽을 수 있기 때문에 숫자로 변환한 것이다.

 

clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, y)

plt.figure(figsize = (20, 10))
t = tree.plot_tree(clf.fit(X, y), filled= True)

 

decision tree classifier 를 이용하여 데이터를 학습시킨 트리 모델이다.

이를 통해 중요한 변수가 무엇인지 등을 알 수 있다.

 

더 그래프를 보기좋게 그리기 위해서 graphviz 라이브러리를 활용할 수 있다. 하지만 설치가 조금 까다롭기 때문에 나중에 다시 해보려고 한다.

출처) 코뮤니티 모각코 "JAVA를 자바" 과정

 

1. 예외처리가 필요할 때

오류에 부딪힐 때 오류를 없애는 것이 가장 좋지만, 모두 없앨 수 없다면 그것을 제대로 처리하는 것도 중요하다.

오류를 무시할 때도 있고, 적절한 조치를 취해야 할 때도 있다.

 

그 때 사용할 수 있는 것이 "try, catch, throw" 등이다.

 

2. try, catch, finally

 

1) try~catch

 

int[] value = new int[3];

value[3] = 10;

 

위 코드를 실행하면 ArrayIndexOutOfBoundsException 오류가 발생한다.

 

오류 발생 시 "오류 발생" 이라는 문장이 출력되도록 코드를 짜면 아래와 같다.

 

int[] value = new int[3];

 

try {

    value[3] = 10;

} catch (ArrayIndexOutOfBoundsException e) {

    System.out.println("오류 발생");

}

 

위 코드를 실행하면 오류 발생 이라는 문장이 출력된다.

이처럼 예외 처리는 try~catch 문으로 할 수 있다.

 

try {
	실행문
} catch(예외1) {
	예외1 발생 시 실행문
} catch(예외2) {
	예외2 발생 시 실행문
}

 

catch (ArrayIndexOutOfBoundsException e) {

    System.out.println("오류 발생");

}

 

이처럼 괄호 안에는 예외처리 할 오류의 형식과 오류를 칭할 이름(e)을 적는다.

 

2) finally

 

예외가 발생했을 때에도 무조건 실행하고 싶은 코드가 있을 경우 사용하는 것이 finally이다.

예를 들어, 나눗셈에서 0으로 숫자를 나누면 ArithmeticException 오류이다.

 

int num;try {    num = 4 / 0;} cath(ArithmeticException e) {    System.out.println("오류 발생");    num = -1;} finally {    System.out.println("무조건 실행");}

 

System.out.println(num);

 

위 코드는 ArithmeticException 오류가 발생했을 때 오류 발생 문장을 출력하고 num 변수에 -1을 저장한다.또한, 오류와 관계없이 무조건 실행이 출력된다.

 

실행결과는 위와 같다.

'Software > JAVA' 카테고리의 다른 글

[JAVA] Day2. 조건문, 반복문, 배열  (0) 2022.12.27
[JAVA] Day1. 자바 기초  (0) 2022.12.27
[JAVA] 객체지향  (0) 2021.07.22
[JAVA] 배열  (0) 2021.07.20
[JAVA] 스캐너로 입력받기  (0) 2021.07.15

출처) 코뮤니티 모각코 "JAVA를 자바" 과정

 

1. 객체지향 프로그래밍 (OOP) 구성요소

- 클래스, 객체, 메소드

 

1) 클래스

객체의 설계도 (틀) 

클래스를 이용해 비슷한 구성의 객체 찍어냄

 

    - 필드 : 클래스에 포함된 변수

    - 메소드 : 클래스 안에 있는 함수

    - 생성자 : 인스턴스가 처음 만들어질 때 실행될 초기화 메소드

 

* 클래스를 이용해 객체를 만드는 과정을 클래스의 인스턴스화라고 한다. 

   즉, A라는 클래스에서 만들어진 객체 = A클래스의 인스턴스

   객체 == 인스턴스

 

2) 메소드

클래스에 선언된 함수

 

public 리턴 자료형 메소드명 (입력1, 입력2 ...) {

    ...

    return 리턴값;

}

 

* public -> 메소드가 선언된 클래스 외부에서도 호출될 수 있는 메소드

 

3) 필드

클래스 안에서 선언된 변수

인스턴스로 변수에 데이터를 저장하고 저장된 데이터를 불러올 수 있음

 

2. 생성자

 

클래스가 인스턴스화 될 때 (객체가 만들어질 때) 반드시 호출되는 클래스의 구성요소

 

클래스와 동일한 이름으로 선언함

 

class Calculator {
    Calculator() {
        System.out.println("생성자 실행");
    }
}

public class Helloworld {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        System.out.println("calculator 생성 완료");
    }
}

 

이 예시는 Calculator 클래스에서 생성자가 호출될 때 "생성자 실행" 문구를 출력하도록 만들었다.

 

실행해보면 생성자 실행이 먼저 출력되고, calculator 생성 완료가 출력된다.

 

생성자는 보통 필드의 값을 초기화하기 위해 사용된다.

 

Calculator 클래스에 x, y라는 변수를 생성했다면 초기값을 설정해주어야 한다.

이렇게 초기값을 설정해 주는 것을 보통 생성자를 통해 한다.

 

class Calculator {
    int x;
    int y;
    Calculator(int a, int b) {
        this.x = a; // x에 a 대입
        this.y = b;
    }
}

 

이 예시의 경우 x, y 변수를 선언하고 생성자에서 int 자료형 데이터 2개를 받아 각각 x와 y에 저장한다.

메소드에서 입력 변수를 받는 방식과 비슷하다.

 

class Calculator {
    int x;
    int y;
    Calculator (int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class HelloWorld {
    public static void main(String[] args) {
        Calculator calculator = new Calculator(3, 5);
        System.out.println(calculator.x);
        System.out.println(calculator.y);
    }
}

 

Calculator 클래스에서 Calculator 생성자를 만들고, calculator 객체를 만들면서 생성자를 이용해 x = 3, y = 5로 초기화 한 것이다.

이를 실행하면 

3

5

이렇게 출력된다.

 

3. this 키워드

 

this는 인스턴스 (객체)를 가리키는 의미이다.

 

Calculato(int x, int y) {

    this.x = x;

    this.y = y;

 

위의 예제에서 this.x 는 인스턴스 내 필드를 가리키고, x는 입력받은 변수를 가리킨다.

'Software > JAVA' 카테고리의 다른 글

[JAVA] Day1. 자바 기초  (0) 2022.12.27
[JAVA] 예외처리  (0) 2021.07.22
[JAVA] 배열  (0) 2021.07.20
[JAVA] 스캐너로 입력받기  (0) 2021.07.15
[JAVA] 객체, 생성자, 계산기 예제  (0) 2021.01.11

출처) 코뮤니티 모각코 "JAVA를 자바" 과정

 

1. 배열

 

같은 자료형의 변수들을 묶어서 저장한 것이다.

 

1) 선언

 

자료형, 배열 이름 선언

 

* int [] name;

* int name [];

 

두 가지의 방법 중 선택하여 선언할 수 있다.

 

2) 생성

 

자료형, 길이 정해줌

 

int[ ] value;

value = new int[5];

 

* 선언&생성 동시에 -> int[ ] value = new int[5];

 

3) 초기화

 

선언과 동시에 초기화하면 크기 따로 명시하지 않아도 됨 + new 코드 생략 가능

 

int[] name = new int[] {1, 2, 3, 4, 5};

int[] name = {1, 2, 3, 4, 5};                 // new int[] 생략

 

String[] weeks = {"월", "화", "수", "목", "금"};

 

2. 인덱스

 

배열에 접근하는 인덱스는 0부터 시작

 

name[0] == 1

weeks[3] == "목"

 

3. for문으로 배열 저장 & 출력

 

int leng = 50;

int[] value = new int[leng];

 

for (int i = 0; i < leng; i++) {

    value[i] = i * 5;

}

 

for (int i = 0; i < leng; i++) {

    System.out.printf("%d\n", value[i]);

}

 

 

'Software > JAVA' 카테고리의 다른 글

[JAVA] 예외처리  (0) 2021.07.22
[JAVA] 객체지향  (0) 2021.07.22
[JAVA] 스캐너로 입력받기  (0) 2021.07.15
[JAVA] 객체, 생성자, 계산기 예제  (0) 2021.01.11
[JAVA] 3의 배수의 합 구하기  (0) 2021.01.11

[출처] 모각코 'JAVA를 자바'

 

1. 스캐너 (Scanner)

 

자바에서 사용자에게 값을 입력받을 때에는 주로 '스캐너'를 사용한다.

 

스캐너를 이용하기 위해서 클래스 가장 상단에 

import java.util.Scanner;

코드를 추가해야 한다.

 

2. 스캐너 객체

 

스캐너를 이용하기 위해서는 스캐너 객체를 만들어야 한다.

스캐너 클래스의 기능을 쓸 수 있는 모듈을 복사한다는 뜻이다.

 

Scanner sc = new Scanner(System.in);

이 코드는 스캐너 클래스의 기능을 사용할 수 있는 sc 라는 이름의 객체(모듈)을 만든다는 의미이다.

 

한 번 스캐너 객체를 만들면 이 객체의 메소드를 이용해 사용자가 원하는 데이터를 읽을 수 있다.

 

String age = sc.next();
System.out.println("나이를 입력하세요: " + age);

이 코드는 스캐너 sc가 스캔한 문자열을 age라는 변수에 저장하고 이를 출력한 코드이다.

 

스캐너는 한 번 만들면 여러번 스캔할 수 있다.

 

3. 스캐너 닫기

 

스캐너를 만든 후 마지막에 닫지 않으면 경고가 뜬다.

 

sc.close();

따라서 항상 마지막에 이 코드를 적어 스캐너를 닫아야 한다.

 

4. 스캐너의 메소드 next

 

스캐너는 next 외에도 다양한 메소드를 제공한다.

 

next가 들어간 메소드를 검색해보면 next + 자료형으로 구성되어있는걸 알 수 있다.

 

nextInt()는 int 데이터를 입력받고, nextFloat()는 float 데이터를 입력받는다.

next는 공백이 생기기 전까지 입력받은 문자열을 읽고 (한 단어),

nextLine은 줄바꿈 전까지 쓴 문자열을 모두 읽는다.

'Software > JAVA' 카테고리의 다른 글

[JAVA] 객체지향  (0) 2021.07.22
[JAVA] 배열  (0) 2021.07.20
[JAVA] 객체, 생성자, 계산기 예제  (0) 2021.01.11
[JAVA] 3의 배수의 합 구하기  (0) 2021.01.11
[JAVA] 클래스와 객체  (0) 2021.01.10

수업 출처) 숙명여자대학교 소프트웨어학부 박동철 교수님 '데이터사이언스개론' 수업

 

1. Dealing with Text

- 데이터가 항상 feature vector 형태로 제공되지는 않는다.

- 우리는 도구에 맞도록 데이터 표현을 설계하거나, 데이터에 맞는 새로운 도구를 만들어야 한다.

- 보통은 도구에 맞도록 데이터를 가공한다.

 

2. Why text is important

- 텍스트는 어디에나 존재한다.

- 많은 애플리케이션들은 여전히 텍스트 데이터를 만들거나 기록한다.

- 의료 기록, 제품 조회, 수리 기록, 소비자 불만 사항 기록 등

- 인터넷은 '뉴미디어'의 본고장이지만, 그것은 대부분 오래된 미디어와 같은 형태이다.

- 멀티미디어 데이터는 많은 양의 교통량을 설명할 수 있다.

- 그것은 여전히 사람들이 인터넷으로 서로 텍스트로 대화하면서 발생하는 대량의 텍스트를 포함하고 있다. 

- 기업에서는 고객의 피드백을 이해하기 위해 텍스트를 이해해야 한다. 

- 많은 경우 고객의 의견을 듣고 싶을 때 제품 리뷰, 피드백 문서, 고객 의견, 이메일 등 그들이 작성한 것을 읽어야 한다.

 

3. Why text is difficult

- 텍스트는 대부분 'unstructured' 데이터이다. 컴퓨터가 이해하기에 조직적이지 않다.

- 미리 정의된 데이터 모델도 없고, 사전에 정의된 방식으로 조직되어 있지도 않다.

- 때에 따라 단어 순서가 중요하기도, 그렇지 않기도 하다.

- 사람들이 문장을 적을 때 문법적이지 않게, 스펠링을 틀리게, 예측할 수 없도록 축약해서, 구두점을 랜덤으로 찍는 등 체계적으로 적지 않기 때문이다.

- 유의어, 동음이의어, 축약어 등도 문제가 된다. 축약어는 domain에 따라 전혀 다른 의미가 되기도 한다.

- 전체 문맥을 고려하지 않고 어떤 특정한 단어나 구를 평가하기는 어렵다.

- 이러한 이유로 텍스트 데이터는 데이터 마이닝 이전에 전처리되어야 한다.

 

4. Text Representation

- 목표: 비교적 단어의 순서가 자유로운 문서(documents) 집합을 우리에게 친숙한 feature vector 형식으로 바꾸는 것이다.

- 각 문장이 하나의 개체 (instance)가 된다.

- 하지만, 전처리 이전에 features가 어떤 것일지 알 수 없다.

- 전체 documents의 집합을 corpus라고 한다.

 

5. Bag of Words

- 모든 문서들을 각 개별 단어들의 집합으로 다루는 것이다.

- 문법, 단어 순서, 문장 구조, 구두법을 무시한다.

- 문서의 모든 단어들을 잠재적으로 중요한 키워드로 간주한다.

- 만약 모든 단어가 feature가 될 경우, 각 문서는 1 또는 0으로 대표될 것이다.

    - 1 : feature 단어가 문장에 존재할 경우

    - 0 : feature 단어가 문장에 없을 경우

- 직설적이고, 저렴하게 만들 수 있다.

- 또한, 많은 경우에서 잘 수행된다.

 

6. Term Frequency (TF) 🌟

- 단순한 1, 0 대신 문장 속의 단어 개수 (빈도 frequency)를 이용하는 것이다.

- 단어의 사용 횟수를 구분한다.

- 텍스트 전처리

    - 각 케이스는 정상화(normalized)되어야 한다.

        - 모든 단어는 소문자가 되어야 한다. (형태를 동일하게 만들기 위해)

    - 단어의 어근만 남아야 한다. (stemming)

        - 단어의 복수형, 동사 시제 등 접미사를 제거한다.

        - ex) directors -> director, announces / announcing / announed -> announc !

    - 접속사, 전치사, 관사 등 stop word를 제거한다.

        - stop word는 자연어 데이터 처리 전후에 걸러지는 단어들이다.

        - ex) the, a, and, of, on, etc.

 

ex)

- 예제 문서에 대한 TF 값들이다. 

- normalization, stemming을 한 후 빈도수에 따라 정렬한 결과이다.

 

6-1. Normalized Term Frequency

- 문서들마다 길이가 다양한데, 길이가 긴 문서가 보통 더 많은 단어들을 가지고 있을 것이다.

- 그래서 긴 문서가 짧은 문서보다 더 중요하다거나 관련이 있다는 오해를 불러일으킬 수 있다.

- 각 TF는 다음과 같은 방식으로 정상화된다.

    - 문서 안의 총 단어의 수 (document length) 로 나눈다.

    - 혹은 corpus 안의 특정 단어의 빈도로 나눈다.

 

7. Inverse Document Frequency (IDF) 🌟

- TF는 하나의 문서에서 그 단어가 얼마나 많이 있는지를 측정한다.

- 우리는 또한 단어의 가중치를 결정할 때 전체 corpus에서 그것이 얼마나 만연한지를 고려할 수 있다. 

 

- corpus에서 단어가 너무 희귀하거나 너무 많으면 클러스터링이나 분류를 할 때 도움이 되지 않는다. 무시하는 것이 낫다.

- 따라서 TF에 lower / upper limit을 둘 수 있다.

 

- 어떤 단어가 포함된 문서가 범위 내에서 적을수록 그 문서는 meaningful하다고 볼 수 있다.

- 이러한 단어 t의 희소성은 IDF에 의해 측정된다.

 

- IDF는 단어가 희귀할수록 크다.

- t를 포함한 문서가 많을수록 IDF는 1에 수렴한다.

 

8. Combining TF and IDF : TF-IDF 🌟

- 아주 대중적인 텍스트 표현이다.

- 문서 d에서 t에 대한 TF값과 전체 corpus에서 t에 대한 IDF값을 곱한 것이다.

- 따라서 TF-IDF는 하나의 문서에 한정되는 값이다.

- 각 문서가 feature vector가 된다.

- corpus는 feature vector의 집합이다.

 

- feature가 굉장히 많아지기 때문에 자주 선택을 해야하는데, 텍스트 표현에는 많은 잠재적 조건들이 있다.

- term count에 최대/최소 한계값을 걸거나 각 단어들을 중요도에 따라 순위를 매겨서 information gain을 측정하는 등의 방법이 있다.

 

9. (ex) Jazz musicians

- 위키피디아에서 15명의 유명한 재즈 음악가, 전문가들의 전기를 가져온 것이다.

- 문서가 15개로 작음에도 불구하고 corpus와 그에 담긴 단어들은 너무 많다.

- 접미사를 제거하고 stop-word까지 제거한 후에도 약 2,000개의 feature(단어)가 존재한다.

 

- 예시로 "Famous jazz saxophonist born in Kansas who palyed bebop and latin" 문장을 살펴보려고 한다.

- 우선 basic stemming 단계를 거친다.

    - stemming 방법은 완벽하진 않다. 예를 들면 kansas와 famous를 명사의 복수형이라고 생각하여 kansa, famou 라고 저장할 수 있다.

    - 하지만 이렇게 단어를 저장했다면 문서 전체에서 일관성있게 저장했을 것이기 때문에 stemming을 완벽하게 하는것은 그닥 중요하지 않다.

 

- stemming

- 샘플 문장의 단어들 (tokens)은 위와 같다.

 

- stop word (in, and)를 제거한 후 정상화된 TF는 위와 같다.

 

- 최종 TFIDF 값은 위와 같다.

- 이는 샘플 문서에 대한 feature vector이다.

- TFIDF가 클수록 (latin) 희귀한 단어이고, 작을수록 (jazz) 많이 나오는 단어이다.

 

- 단순한 검색 엔진을 실행하기 위해 이 TFIDF를 사용해보자.

- 사용자가 검색 쿼리에 "Famous jazz saxophonist born in Kansas who palyed bebop and latin" 이 문장을 입력했다고 하자.

- 그럼 우선 이 TF-IDF 표현으로 쿼리를 번역할 것이다.

- 그 다음, 각 음악가의 전기와 쿼리의 단어의 유사도를 각각 계산한 후 가장 가까운 전기를 고를 것이다.

    - 이 때 텍스트 분류에서 두 문서 사이의 유사도를 측정할 때 가장 많이 사용되는 '코사인 유사도 cosine similarity'를 사용할 것이다.

    - cosine similarity = x · y / ||x||₂ ||y||₂

- 유사도 결과를 보면 실제 예제에 해당하는 음악가인 'Charlie  Parker'와의 유사도가 가장 큰 것을 볼 수 있다.

 

10. Beyond "Bag of Words"

- bag of words는 비교적 간단하지만 다양한 상황에서 놀랍게도 잘 수행된다.

- 보통 데이터 과학자가 새로운 텍스트 마이닝 문제를 볼 때 가장 먼저 선택하는 방법이다.

- 하지만, 더욱 정교한 기술이 필요한 애플리케이션에 사용하기엔 부족하다.

- 예를 들면 bag of words는 단어의 순서를 고려하지 않는다.

 

10-1. N-gram Sequences

- 단어의 순서가 중요하고 그에 대한 정보를 남기고 싶은 경우 사용한다.

- 인접한 단어의 순서를 항으로 포함하기 때문에 복잡도는 높아진다.

 

- ex) "The quick brown fox jumps"

    - 문장을 구성하는 단어들 {quick, brown, fox, jumps} + {quick_brown, brown_fox, fox_jumps}

    - 이 일반적인 표현 방법을 n-grams라고 부른다.

 

- 'Bag of n-grams up to three'

    - 각 단어들, 인접한 단어쌍, 인접한 세 개의 단어쌍을 features로 하여 각 문서를 나타낸다.

    - 장점 : easy to generate (언어학적 지식이나 복잡한 파싱 알고리즘을 알 필요가 없다.)

    - 단점 : greatly increase the size of the feature set (각 단어를 저장할 때보다 더 많은 단어쌍이 포함되기 때문에 feature 집합의 크기가 매우 커진다.)

 

10-2. Named Entity Extraction

- 구절을 추출할 때 일반적으로 알려진 이름을 인식하길 바랄 수 있다.

- 예를 들면 Silicon Valley, Minnesota Twins, The Lord of the Rings 등과 같이 각 단어 별로 보면 아무 의미 없지만, 그 자체로 알려진 의미가 있는 구절들을 인식하고자 한다.

- basic bag of word나 n-grams 표현으로도 쉽지 않다. 왜냐하면 두 방법 모두 공백이나 구두점을 기반으로 텍스트를 분할하기 때문이다.

- 이 방법을 실행하기 위해서는 집약된 지식이 필요하다. 큰 corpus에 의해 학습되거나, 사람이 직접 개입해야 한다.

 

10-3. Topic Models

- 지금까지 살펴본 방법들은 문서에 있는 단어들로부터 직접적으로 모델을 만드는 방법이다.

- 이는 비교적 효율적이지만, 항상 최적의 방법인 것은 아니다.

 

- 단어와 문서가 복잡해지면 문서와 모델 사이에 추가적인 layer (topic layer) 를 만들 수 있다. 

- 각 문장은 단어의 순서를 구성하고, 단어들은 적어도 하나의 토픽에 매핑된다.

- topic layer는 문서의 단어들의 클러스터들이라고 볼 수 있다.

- 장점) 검색엔진에서 입력된 쿼리가 문서의 특정 단어들과 완전히 똑같지 않을 수 있다. 이 때 그 단어를 알맞은 토픽에 매핑하고, 그와 관련된 문서를 보여준다.

 

11. (ex) Mining news stories to predict stock price movement

- 뉴스를 기반으로 주식 시장을 예측하고자 한다.

- 단순하게 하기 위해서 그 날 하루의 변화를 예측할 것이고, 정확한 값이 아닌 변화가 있는지 없는지만 예측할 것이다. 또한, 작은 변화는 예측이 어렵기 때문에 큰 변화가 있을 경우에 변화가 있다고 예측할 것이며, 주가는 그 기업의 이름이 명시되지 않은 뉴스에 의해서도 변화될 수 있지만, 이 예제의 경우 그것까지 고려하기 어렵기 때문에 기업의 이름이 명시된 뉴스에 한해서 마이닝을 할 것이다.

 

- -2.5% ~ 2.5% 의 변동이 있을 경우 '안정된 상태'라고 간주한다.

- -5% 이하, 5% 이상의 경우 변동이 있다고 간주한다. 그 사이는 고려하지 않는다.

 

- 지도학습을 위해 과거 데이터인 1999년 데이터를 사용한다.

- 샘플 뉴스이다.

- 1년 동안 주식회사 BEAM의 주가 그래프이다. 

- 숫자로 표시된 각 지점에 주가가 오르고 내렸는데, 각 지점마다 회사 관련 뉴스가 있었다.

- 각 뉴스의 요약 주석이다.

- 데이터 전처리 : 각 뉴스를 TFIDF 표현으로 줄이기 위해 'bag of words' 단계를 적용한다.

- 각 단어는 소문자화 되었고, stopwords도 제거되었다.

- 'n-grams up to two'를 생성했다.

- 각 뉴스에는 관련 주가 움직임에 기반한 라벨이 붙어있다. (change or no change)

    - 결과적으로 약 16000개의 태그된 뉴스가 나왔다.

 

- 예측 가능성을 보기 위해 ROC curve를 이용했다.

- 이 curves는 10-fold cross validation의 평균을 채택했다.

 

- 결과

    - 뉴스 내용에는 예측가능한 신호가 있다.

    - NB와 LR는 트리보다 더 성능이 좋다.

 

- 아래 그래프는 lift curves이다.

- 뉴스 기사를 점수를 매기고 정렬하기 위해 모델을 사용한다면 우리가 얻을 수 있는 Lift의 양을 정확히 보여준다.

- 결과 

    - x = 0.2인 경우에서 LR과 NB의 lift는 거의 2.0이다.

    - 이는 만약 모든 뉴스 기사의 점수를 매기고 상위 20%만 선택했다면, positive 뉴스는 랜덤으로 예측된 것보다 2배의 정밀도를 보인다.

수업 출처) 숙명여자대학교 소프트웨어학부 박동철 교수님 '데이터사이언스개론' 수업

 

1. Evidence-Based Classification 

- 지금까지 분류를 위한 여러 방법을 알아보았다.

- 이제 분류의 다른 방법을 알아볼 것이다.

 

- Evidence 

    - 실제 일어난 것들. 실제 data 값들. (data instance의 feature values)

    - data의 각각의 feature vector를 타겟 값에 대한 증거 (evidence)로 생각할 수 있다.

- 각 feature에 의해 주어진 증거의 강점을 안다면, 그것들을 확률적으로 결합하여 개체를 분류할 수 있다.

- 훈련 데이터로부터 각 증거의 강도를 알 수 있다.

 

2. (ex) online targeting advertising

- 고객들이 과거에 방문한 웹페이지를 기반으로 온라인 타겟 광고를 한다고 생각해보자.

- 웹페이지의 상단, 사이드, 하단에 광고를 띄우려고 한다.

- 화면 광고의 특징

    - 검색 결과를 바탕으로 나타나는 검색 광고와는 다르다. 

    - 사용자들은 어느 키워드도 입력하지 않는다.

    - 그러므로 우리는 사용자의 feature values를 기반으로 사용자가 특정 광고에 관심이 있는지 없는지 유추할 필요가 있다.

 

- 광고 타겟팅 문제를 더욱 정확하게 정의내려보자.

- 네이버나 페이스북과 같은 매우 큰 컨텐츠 제공자와 일하고 있다고 가정해보자.

    - 다양한 컨텐츠, 많은 온라인 고객들을 보유하고 있다.

- 우리 웹사이트를 방문하는 고객들의 몇몇 부분집합을 타겟으로 하고자 한다.

- 이 광고 캠페인은 호텔을 광고하기 위해서 진행된다. 사람들이 호텔 방을 예약하도록 하는 것이 목표이다.

 

- 훈련 데이터를 얻기 위해서 우리는 온라인 고객들을 랜덤으로 선택하여 이 캠페인을 과거에 진행했다.

- 이제 우리가 원하는 것은 '타겟 고객을 대상으로' 광고 캠페인을 진행하는 것이다.

- 그를 통해 광고에 사용하는 비용 대비 많은 예약자를 얻고자 하는 것이다.

 

- 광고 타겟팅 문제를 어떻게 정의할 수 있을까?

    - instance는 무엇이 될까

    - 타겟 변수는 무엇이 될까

    - 특성들은 무엇이 될까

    - 훈련 데이터는 얼마나 모아야 할까

    - 어떤 분류 모델을 이용해야 할까

 

- 다음과 같이 정의하고자 한다.

    - instance : 고객

    - target variable : 그 고객이 이 호텔 광고를 본 뒤 일주일 내에 예약을 한 적이 있거나 할 예정인가?

    - features : key question! 이후에 다룰 예정

    - training data : 타겟 변수에 대한 이진값 (Y / N)

    - classification model : 광고를 본 후 방을 예약할 고객의 확률을 추정하기 위해 Naive Bayes classifier을 사용할 것이다.

 

- key question) 고객을 묘사하기 위해 어떤 특징 (features)을 활용해야 할까?

    - 어떤 attribute가 필요할까

    - 호텔에게 좋은 고객이 될 가능성이 높은 고객과 낮은 고객들을 차별화할 수 있도록 해야 한다.

- 이 예제에서 (호텔)는 고객이 이전에 방문했던, 혹은 좋아요를 눌렀던 컨텐츠들의 집합을 feature로 활용할 것이다.

    - ex) Jessie = {www.sookmyung.ac.kr, "Avengers: Endgame", ...}

    - 브라우저 쿠키나 다른 메커니즘을 통해 기록된 것을 이용할 것이다.

- 각 증거(컨텐츠 조각들)의 강도와 방향을 추정하기 위해 과거 데이터를 활용할 것이다.

    - 그리고 클래스 멤버십의 가능성을 추정하기 위해 그것들을 결합할 것이다.

- 이 예제의 framework와 잘 맞는 여러 다른 문제들이 있다.

    - 각 개체는 증거들의 집합으로 묘사된다.

    - 우리는 개체를 분류하기 위해서 각 증거 조각의 강도를 결합해야 한다.

 

- ex) spam detection

    - 각 메일은 단어들의 집합으로 구성되어 있다.

    - 각 단어들이 이 메일이 스팸인지 아닌지 구분하는 증거가 된다.

    - 메일을 분류하기 위해 증거들을 확률적으로 결합할 것이다.

    - problem definition

        - instance : an email message

        - target classes : spam or not-spam

        - features : the words (and symbols) in the email message

 

3. Combining Evidendce Probabilistically

- 우리는 고객이 광고를 본 후 호텔 룸을 예약할 확률을 알고싶다.

- 사건이 일어날 확률을 p(C)라고 하면, 우리는 조건부 확률인 p(C | E)에 관심을 가져야 한다.

    - E = {e1, e2, ..., ek} : 고객이 방문한 웹사이트들의 집합

    - C : 고객이 룸을 예약하는 사건

- E가 달라질 때마다 p(C | E)도 달라질 것이다. 즉, 서로 다른 웹사이트를 방문한 고객들은 서로 다른 행동을 보일 것이다.

- 훈련 데이터를 통해서 p(C | E)를 유추할 수 있다.

- 하지만, 중요한 문제가 있다. 훈련 데이터에서 정확히 똑같은 집합의 증거를 가진 개체 (k개의 웹사이트를 똑같이 방문한 사람) 는 거의 없을 것이다. 

- 따라서 증거를 하나씩 분리해서 고려한 후에 다시 합쳐야 한다.

- 즉, E = {e1, e2, ..., ek} 일 때, e1, e2, ..., ek를 각자 분리해서 계산한다는 뜻이다.

 

4. Joint Probability

- Notations

    - A, B : 두 사건

    - p(A), p(B) : A와 B가 각각 일어날 확률

    - p(AB) : 두 사건이 동시에 일어날 확률 -> joint probability

 

- 두 사건 A, B가 독립인 경우 p(AB) = p(A) · p(B)

- 독립이 아닌 경우 p(AB) = p(A) · p(B | A)

 

5. Bayes' Rule 

- p(AB) = p(A) · p(B | A) = p(B) · P(A | B)

==> p(B | A) = {p(A | B) · p(B)} / p(A)

 

- A와 B를 각각 E, H라고 하자.

- H : 가능성을 평가하고자 하는 어떠한 가설

- E : 우리가 관찰할 수 있는 증거

 

==> p(H | E) = {p(E | H) · p(H)} / p(E)

- 이것이 베이즈 정리이다.

 

- p(H | E)를 구할 때 p(E | H)를 대신 살펴봄으로써 증거 E가 주어졌을 때 가설 H의 확률을 계산할 수 있다.

- 즉, p(E | H), p(H), p(E)를 통해서 p(H | E)를 구할 수 있다는 장점이 있다.

 

6. Importance of Bayes' Rule

- p(E | H), p(H), p(E)가 p(H | E)보다 결정하기 쉽다.

 

- ex) medical diagnosis

    - 예를 들어, 내가 의사이고 빨간 반점을 가진 환자가 찾아왔다고 가정해보자.

    - 나는 환자가 홍역을 갖고 있다고 추측할 수 있다.

    - H를 '홍역', E를 '붉은 반점'이라고 할 때, p(H | E)를 구해야 한다.

    - 하지만 p(H | E)를 바로 구하는 것은 거의 불가능하다.  

    - 왜냐하면 그 확률을 구하려면 한 사람에게 붉은 반점이 나타날 수 있는 모든 사례들과 그 중 홍역일 비율을 생각해야 하기 때문이다.

 

    - 하지만, 대신 p(E | H), p(H), p(E)를 구해본다면,

    - p(E | H) : 홍역일 때 붉은 반점이 생길 확률

    - p(H) : 어떤 사람이 홍역에 걸릴 확률

    - p(E) : 어떤 사람에게 붉은 반점이 생길 확률

    - 이 확률들은 전문가로부터 이미 알려져 있거나 직접 구할 수 있다.

    - 따라서 베이즈 정리를 통해서 p(H | E)를 더욱 쉽게 구할 수 있다.

 

7. Applying Bayes' Rule to Classification

- 데이터 사이언스의 많은 부분이 베이지안 방법에 기반을 두고 있다.

- 그들의 핵심 논리가 베이지 정리에 근거한 것이다. 

 

- p(C = c | E) = {p(E | C = c) · p(C = c)} / p(E)

    - C = c : 타겟 변수값이 c인 사건 (ex: C = 'YES' or C = 'NO')

    - E : 증거 (the vector of feature values)

    - p(C = c | E) : 증거가 E일 때 C = c일 확률. 우리가 구하고 싶은 값이며 '사후확률 (posterior probability)'라고 부른다.

 

    - p(C = c) : 클래스 c의 사전확률. 모든 예시들 중 class가 c일 확률

    - p(E | C = c) : 클래스 C = c일 때 증거가 E일 확률. feature vector가 E인 클래스 c의 비율

    - p(E) : E일 가능성. 모든 예시들 중 E가 발생할 확률

    - 아래 세 가지 확률은 데이터로부터 쉽게 구할 수 있다.

 

- 사후확률 p(C = c | E)

    - 클래스 확률의 추정치로 바로 사용할 수 있다.

    - 개체들의 순위를 매기기 위한 점수로 사용할 수 있다.

    - 또는, 분류할 때 서로 다른 c값에 대해 p(C = c | E)의 최댓값을 선택할 수 있다.

    - ex) p(C = 'YES' | E) = 0.7, p(C = 'NO' | E) = 0.3 -> determine C = 'YES'

 

- ex) spam detection

    - w1, ..., wn : 메일 속 단어들

    - p(Spam | w1, ..., wn) = {p(w1, ..., wn | Spam) · p(Spam)} / p(w1, ..., wn)

 

8. Major Difficulty in Computing p(C = c | E)

- E = {e1, e2, ..., ek}

- E는 충분히 크고, 구체적인 조건들의 집합이다.

- p(E | C = c) = p(e1, e2, ..., ek | C = c)

 

- 하지만 p(e1, e2, ..., ek | C = c)를 구하는 것은 어렵다. 

- 훈련 데이터에서 증거가 주어진 E  = {e1, e2, ..., ek}와 완전히 일치하는 특정 개체를 절대 볼 수 없을지도 모른다. 

- 만약 존재한다고 하더라도 확신을 가지고 확률을 추정할만큼 충분히 있진 않을 것이다.

 

9. Conditional Independence

- p(AB | C) = p(A | C) · p(B | AC) = p(B | C) · p(A | BC)

- C가 일어날 때 A와 B는 독립적이지 않다.

 

- 하지만, C가 일어날 때 조건적으로 A와 B가 독립이라면

- p(AB | C) = p(A | C) · p(B | C) = p(B | C) · p(A | C)

- 이 경우가 더 확률을 계산하기 쉽다.

 

- 따라서 데이터사이언스의  베이지안 방법에서는 '조건부 독립'을 강하게 가정함으로써 이 문제를 다룬다.

 

- p(E | c) = p(e1 ^ e2 ^ ... ^ ek | C) = p(e1 | C) · p(e2 | C) · ... · p(ek | C)

- 클래스 c가 주어졌을 때, eᵢ를 다른 eⱼ와 독립적이라고 가정한다.

- 간단히 표현하기 위해서 C = c 를 c라고 표현하겠다.

- 각 p(eᵢ | c) 는 데이터로부터 바로 계산될 수 있다.

    - 모두 맞는 feature vector를 찾을 필요가 없다.

    - 단순히 클래스 c의 개체에서 각 feature eᵢ를 찾은 비율을 계산하면 된다.

    - 그러면 증거를 한 번에 비교하는 것보다 상대적으로 eᵢ가 많이 발생할 수 있다. 

 

10. Naive Bayes Classifier

- 이 전의 식과 베이즈 정리를 결합하면 다음과 같이 '나이브 베이즈 방정식 (Naive Bayes equation)'이 나온다. 

- 베이즈 방정식을 활용하여 표본이 각 클래스에 속할 확률을 추정하는 방식이다.

- 더 높은 확률을 갖는 클래스를 반환한다.

 

- 예를 들어, Y에 속할 확률이 30%라고 치면, N에 속할 확률은 70%가 아니라 따로 또 계산을 해줘야 한다.

만약 N에 속할 확률이 45%라면 Y에 속할 확률보다 크기 때문에 N으로 분류한다.

 

- 우리는 분류에만 관심이 있기 때문에 정확한 값보다는 어떤 클래스에 속할 확률이 더 큰지가 더 중요하다.

- 따라서 실제로는 분모의 p(E)는 모든 클래스에 대해 똑같기 때문에 생략하고, 분자만 계산한다.

 

11. Advantage of Naive Bayes

- 매우 간단한 classifier이다. 

    - 그럼에도 불구하고 모든 특징 증거들을 고려한다.

- 저장공간과 실행시간에 대해 매우 효율적이다. 

    - 오직 p(c)와 p(eᵢ | c)만 저장하고, 몇몇의 간단한 곱셈만 수행하기 때문이다.

- 단순함과 강한 독립성 가정에도 불구하고 많은 실생활 문제들에서 놀라울 정도로 잘 수행된다.

    - 독립이 아닌 사건들에도 적용할 수 있다. 독립성 가정의 위반은 분류 성능을 낮추지 않는 경향이 있다.

    - 두 증거가 사실 독립적이지 않은데 독립적으로 다뤘다면 증거들의 double counting 문제가 생긴다.

    - (ex) p(AB) = p(A) · p(B | A) vs. p(AB) = p(A) · p(B)

    - 이는 classifier 측면에서는 별로 영향을 미치지 않는다. 단순히 확률이 과대평가될 가능성이 있다.

- 따라서 독립적이지 않은 evidence들이 많기 때문에 확률 추정치 자체가 정확하다고 볼 수는 없다.

    - 그렇기 때문에 실무자들은 확률의 실제값과는 관련이 없는, 단지 순위를 매기기 위해 Naive Bayes를 사용한다.

- 자연스럽게 점증적으로 학습한다. (incremental learner)

    - 한 번에 한 가지 훈련 사례를 모델에 업데이트 할 수 있다.

    - 새로운 훈련 데이터가 들어올 때 과거의 모든 훈련 데이터들을 재처리 할 필요가 없다.

    - 특히 새로운 라벨링 데이터가 들어올 때마다 모델을 업데이트하고자 하는 애플리케이션에 유리하다.

    - ex) creating a personalized spam email classifier

    - 사용자가 웹브라우저에서 '스팸'버튼을 클릭할 때 새로운 라벨링된 데이터가 들어온다. 그를 통해서 스팸 탐지 모델을 업데이트할 수 있다.

 

12. (ex) Weather Forecast

- 위와 같이 날씨에 따른 골프 가능 여부 데이터셋이 있다.

- 그럼 아래 사례의 클래스는 어떻게 예측할 수 있을까?

- 우선 모든 필요한 확률들을 계산해야 한다.

p(C | E) ≈ p(e1 | c) · p(e2 | c) · ... · p(ek | c)

 

- p(c)

- p(eᵢ | c) for "outlook"

- p(eᵢ | c) for "temp"

- p(eᵢ | c) for "humidity"

- p(eᵢ | c) for "windy"

 

- compute p(c | E) for each class c

    - p(Yes | rainy, cool, high, true) ≈ p(rainy | yes) · p(cool | yes) · p(high | yes) · p(true | yes) · p(yes) = 0.00529

    - p(No | rainy, cool, high, true) ≈ p(rainy | no) · p(cool | no) · p(high | no) · p(true | no) · p(no) = 0.02057

- 정확한 확률값의 크기에 상관없이 Yes보다 No인 확률이 더 크기 때문에 play golf = No 로 결정된다.

 

13. (ex) Patient Diagnosis

- 위의 예제와 같이 데이터셋을 통해서 flu 클래스를 예측해보고자 한다.

 

- p(c)

- p(eᵢ | c) for "chills"

- p(eᵢ | c) for "runny nose"

- p(eᵢ | c) for "headache"

- p(eᵢ | c) for "fever"

 

- compute p(c | E) for each class

    - p(flu = Y | chills = Y, runny nose = N, headache = Mild, feaver = N) = 0.006

    - p(flu = N | chills = Y, runny nose = N, headache = Mild, feaver = N) = 0.0185

- flu = N인 확률이 더 크기 때문에 Flu = N으로 결정된다.

 

14. (ex) Spam Detection

 

- p(c)

- p(eᵢ | c) for the word "password"

- p(eᵢ | c) for the word "review"

- p(eᵢ | c) for the word "send"

- p(eᵢ | c) for the word "us"

- p(eᵢ | c) for the word "your"

- p(eᵢ | c) for the word "account"

 

- compute p(c | E) for each class c

    - p(spam | ¬password, review, ¬send, ¬us, your, account) = 0.000976

    - p(ham | ¬password, review, ¬send, ¬us, your, account) = 0

- spam 일 확률이 더 크기 때문에 spam으로 결정된다.

 

15. A Model of Evidence "Lift"

- 전체 모집단에 대해 선택된 하위 모집단에서 positive class가 얼마나 더 만연한지 측정하는 classifier 평가지표이다.

- 즉, Lift = positive / sampling (targeting)

 

- evidence lifts의 하나로 Naive Bayes를 생각해볼 수 있다. 

- 변환한 식에서 p(eᵢ | c) / p(eᵢ) 가 클래스 c의 evidence lift이다.

- evidence lift는 eᵢ가 클래스 c를 얼마나 더 lift 시키는지, 클래스 c와 얼마나 연관성이 있는지, eᵢ가 이 개체를 클래스 c로 분류하는데 얼마나 도움이 되는지를 나타내는 지표이다.

 

- 사전확률 p(c)에서부터 시작하여 예시 E를 살펴볼 것이다.

- 각각의 증거 eᵢ는 클래스에 대한 확률을 높이거나 낮춘다. 

- 만약 liftc(eᵢ) > 1 이라면 확률은 증가할 것이고, liftc(eᵢ) < 1이라면 확률은 감소할 것이다.

 

16. (ex) Evidence Lifts from facebook 'likes'

- 최근 연구자들은 페이스북의 '좋아요'가 보통 직접적으로 드러나지 않는 사람들의 특징들을 꽤 예측한다는 논문을 발표했다.

- 지식 수준이 어떤지, 정신적인 상태는 어떤지, 이미 밝힌 동성애자인지, 술을 마시거나 담배를 피는지, 종교나 정치적 견해는 어떤지 등 말이다.

- 어떤 사람이 좋아요를 누른 기록과 각각 "High IQ"에 대한 evidence lifts이다. 

- "Sheldon Cooper"에 좋아요를 눌렀다는건 일반적인 사람들보다 '높은 IQ'를 갖고 있을 확률이 30% 더 높다는 의미이다.

- 마찬가지로 "Lord of the rings"에 좋아요를 눌렀다는건 일반적인 사람들보다 '높은 IQ'를 가지고 있을 확률이 69% 높다는 의미이다.

 

- 일반적으로 페이스북 인구에서 타겟 변수를 'IQ > 130'으로 잡으면, 약 14%의 사람들이 Yes 클래스에 해당한다는 가설이 있다.

- 그러면 아무것도 좋아요를 누르지 않은 경우엔 'IQ > 130'일 확률 추정치는 기본 비율인 14%이다.

- 만약 "Sheldon Cooper"에 좋아요를 눌렀다면, 확률 추정치는 0.14 x 1.3 = 18% 로 30% 증가된 값이 된다.

- 만약 (Sheldon Cooper, Star Trek, Lord of the Rings) 세 개에 좋아요를 눌렀다면, 확률 추정치는 0.14 x 1.3 x 1.39 x 1.69 = 43%가 된다. 

- 이처럼 evidence lift를 통해서 행동 특성을 예측할 수 있다.

 

수업 출처) 숙명여자대학교 소프트웨어학부 박동철 교수님 '데이터사이언스개론' 수업

 

1. Visualizing Model Performance

- 모델 성능을 시각화하기 위한 몇몇 유용한 기술들에 대해 다룬다.

- 모델 성능을 직관적으로 보여준다.

 

2. Ranking instead of Classifying

- 이전 장에서는 각 경우에 대한 결정을 expected value에 기반하여 어떻게 계산할 지 알아보았다.

- 이번에는 다른 전략으로 ranking에 대해 알아볼 것이다.

- 각 경우를 분리하여 결정하기보다는, 예측된 점수를 기반으로 사례들의 순위를 매긴 다음 상위 n개의 경우를 택하는 것이다.

 

- 많은 경우, 그저 가장 성능이 좋은 n개의 케이스를 원할 때가 있다. 예를 들어 캠페인을 위한 마케팅 예산이 이미 정해져 있는 경우가 그렇다.

- 이러한 경우 각 경우의 정확한 확률 추정치는 그닥 중요하지 않다.

- 정확한 확률값을 구하기보다 상대적인 순위를 통해서 가장 효율적인 몇가지 방법만 택하는 것이다.

 

3. Ranking Instances

- 개체에 점수를 매기는 classifier가 있다고 하자. 이때 점수는 확률값 (or distance)이다.

- ex) class probability(decision tree, k-NN classifier), distance from the separating boundary(support vector machine, logistic regression)

 

- 각 개체들을 점수에 따라 정렬한 후 특정한 값 T를 임계값으로 설정한다.

- 임계값을 높게 잡으면 정말 몇 개의 경우만 선택될 것이고, 임계값을 낮게 잡으면 가능한 많은 경우를 선택할 수 있을 것이다.

 

4. Thresholding Instances

- 임계값이 변할 때마다 true positive와 false positive의 수가 달라진다. 

- 따라서, 각 임계값마다 특정한 confusion matrix가 형성된다.

- 임계값을 기준으로 높은 순위는 'YES', 낮은 순위는 'NO'라고 예측하기 때문이다.

임계값에 따른 confusion matrix

 

- 임계값이 낮아질수록 개체들은 N에서 Y로 옮겨진다. (예측값이)

    - (N, p) -> (Y, p), (N, n) -> (Y, n)

- 기술적으로, 각각의 임계값은 서로 다른 classifier를 생성한다.

- 그리고 각각의 confusion matrix를 통해 나타낸다.

 

- 그러면 다른 classifier에 의해 만들어진 순위는 서로 다른데 어떻게 비교해야 할까? 어떤 순위가 더 낫다고 볼 수 있을까?

- 또한, 적절한 임계값을 어떻게 찾을까? 

    - 이건 expected profit이 최대가 되는 임계값으로 결정할 수 있다.

 

5. Profit Curve

- 임계값에 따른 expected profit을 보여주는 곡선이다.

- 임계값이 낮아질수록 negative가 아니라 positive로 예측되는 개체들이 추가된다.

- 즉, 임계값이 낮아질수록 positive predict가 높아진다.

- 타겟 마케팅을 위한 3개의 classifier를 나타낸 profit curve이다.

- 각 곡선에 대해 고객들은 몇몇 모델에 기반하여 마케팅에 대해 응답할 확률에 따라 높은 확률부터 낮은 확률까지 정렬된다.

- 보통 고객의 비율에 대해 이야기할 것이다.

- x축은 임계값이고, y축은 그에 다른 이익이다.

 

- 곡선은 profit이 음수로 갈 수 있음을 보여준다. 항상 그런 것은 아니고 cost-benefit matrix에 따라 달라진다.

- 이윤이 작거나 응답자의 수가 작을 때 발생한다.

- 응답하지 않을 사람들에게 너무 많이 제공함으로써 비용을 너무 많이 지불하게 된다.

 

- 모든 곡선들은 같은 지점에서 시작해서 같은 지점에서 끝난다.

    - 0%는 지출도 없고 이익도 없는 상태이다.

    - 100%는 모든 사람들이 타겟이 된 상태이다. 따라서 모든 classifier가 같은 성능을 갖는다.

 

- 하지만, 그 사이에서는 classifier가 고객을 정렬한 방법에 따라 서로 다른 값을 갖는다.

    - 직선인 경우는 random model을 적용한 경우로 최악의 성능을 갖는다.

    - 위의 그래프에 따라 만약 마케팅에 예산이 정해져있어 8%의 고객에게만 제공할 수 있을 땐 x = 8 이내에서 가장 높은 값을 갖는 classifier 1을 선택하면 되고, 예산 상관없이 최고의 이익을 내고 싶다면 약 x = 50에서 가장 높은 값을 갖는 classifier 2를 선택하면 된다.

 

6. Two Limitation of Profit Curves

- 이전 장에서 본 조건부 확률을 이용하는 expected profit이다. 

- 이 값을 이용하기 위해서는 사전확률인 p(p)와 p(n)을 알고 있어야 하고, 그 값은 안정적으로 고정되어 있어야 한다.

- 또한, cost와 benefit (b(h, a), c(h, a))도 알고 있어야 하고 안정적으로 고정되어 있어야 한다.

- 하지만, 많은 실제 경우에서는 이 값들은 정확하지 않고 불안정하다.

    - ex) 사기 탐색의 경우 사기 금액이 정해져있지 않고 항상 변한다.

    - churn 관리의 경우 고객에게 제공하는 상품의 금액이 항상 다를 것이다.

 

7. Receiver Operating Characteristic (ROC) Graph

- 전체 공간에 성능 가능성을 보여줌으로써 불확실성을 수용할 수 있는 방법이다.

- calssifier에 의해 만들어지는 benefits (true positives) 과 costs (false positives) 사이의 상대적인 성능값을 보여준다.

- 각 점 (fpr, tpr) 은 classifier 한 개를 나타낸다.

- fpr = false positive rate (= FP / (FP + TN)) = 1 - specificity : negative 중에 틀린 것

- tpr = true positive rate (= TP / (TP + FN)) = sensitivity : positive 중에 맞은 것

 

- 점 A는 classifier A의 cost = 0.1, benefit = 0.4일 때의 성능을 나타낸다.

 

- (0, 0) : classifier가 무조건 N으로 예측한 것이다. false positive errors = true positives = 0

- (1, 1) : classifier가 무조건 Y로 예측한 것이다. 

- (0, 1) : 완벽한 classifier이다. 모든 negative와 positive를 올바르게 분류한다.

- (x, x) : positive class를 x · 100%로 랜덤으로 예측하는 classifier이다. 

    - (0.5, 0.5) : 랜덤으로 절반을 positive로 예측한다. positive를 절반 맞출 것으로 기대한다.

    - (0.9, 0.9) : 랜덤으로 90%를 positive로 예측한다. negative는 90% 틀리고, positive는 90% 맞을 것으로 기대한다.

 

- ROC space에서 c₁ 과 c₂를 비교해보자

    - c₁ 이 c₂에 비해 북서쪽 (왼쪽 위) 에 있으면 c₁이 더 낫다. true positive rate과 true negative rate이 모두 더 높거나 나쁘지 않다.

    - c₁ 이 c₂에 비해 남서쪽 (왼쪽 아래) 에 있으면 c₁이 더 보수적이다. false positive rate은 낮지만, true positive rate도 더 낮다. 틀리는 경우를 낮추는 model이다.

    - c₁ 이 c₂에 비해 북동쪽 (오른쪽 위) 에 있으면 c₁이 더 급진적이다. true positive rate도 높고 false positive rate도 높다. Y로 예측하는 개체를 늘림으로써 positive를 맞추는 경우에 더욱 집중하는 model이다.

 

- ranking model

    - 임계값에 따라 점수가 임계값보다 높으면 Y, 아니면 N으로 예측한다.

    - 각 임계값에 따라 ROC space에 다른 점들을 생성한다. 각 임계값에 따라 다른 confusion matrix가 생성되기 때문이다.

 

- 임계값이 낮아질수록 positive로 예측하는 개체들이 늘어나는데, positive instance와 negative instace를 모두 지나치게 된다.

- 따라서 true positive rate와 false positive rate이 모두 증가하기 때문에 곡선이 우상향한다.

 

8. Advantage of ROC Curves

- ROC Curve는 classifier가 사용될 조건으로부터 classifier 성능을 분리한다.

- 즉, 사전확률(p(p), p(n)) 과 costs and benefits(v(h, a))가 필요하지 않다는 것이다.

- 이러한 조건들이 바뀌어도 classifier의 위치와 상대적인 성능이 변하지 않는다.

- 사전 클래스가 달라지더라도 각 점의 위치는 달라질 수 있지만, curve의 모양 (다른 classifier 대비 상대적인 성능) 은 바뀌지 않는다.

 

9. The Area Under the ROC Curve (AUC)

- classifier의 ROC curve 아래의 면적이 간단히 1²의 일부로 표현된다. -> 0과 1의 범위 내로 표현된다.

- ROC Curve는 더 많은 정보를 제공하지만, AUC는 성능을 요약하여 하나의 숫자로 표현해야 할 때 유용하다.

- 왼쪽 그래프에서 숫자가 AUC이며 classifier의 성능을 나타낸다. 0.95는 0.85보다 10% 더 좋은 성능을 갖는다는 것이다.

- 오른쪽 그래프들에서 첫번째 그래프가 가장 성능이 좋고, 네번째 그래프가 가장 성능이 안좋은 classifier이다.

 

10. Cumulative Response Curve

- ROC Curve는 분류 모델 성능을 시각화하기 위한 일반적인 tool이다.

- 하지만, 개발자가 아닌 이해관계자들이 보기엔 너무 직관적이지 않다.

 

- Cumulative response curves는 더욱 직관적인 시각화이다.

- 임계값에 따른 타겟 개체의 true positive 비율을 함수로 표현한다.

- 따라서 YES 클래스를 얼마나 잘 분류하는지 시각화하는 그래프라고 볼 수 있다.

- false positive보다 true positive가 더욱 가치있기 때문이다.

- x축이 타겟 instance 비율, y축이 true positive rate이다.

 

- 임계값이 낮아질수록 더욱 많은 개체들을 타겟으로 한다.

- Random model : x%를 타겟으로 할 때 x%의 positives를 얻는다.

- A better model : x%를 타겟으로 할 때 x%보다 큰 positives를 얻는다.

- 따라서 그래프에서 대각선보다 위에 있는 그래프들은 더 나은 성능을 제공한다.

 

11. The Lift of a Classifier

- Lift : classifier가 random model (50%) 보다 얼마나 더 성능이 좋은지 나타내는 지표이다.

- 즉, 리스트에서 positive instance를 negative instace 위로 올리는 정도를 의미한다.

 

- Lift = (the percentage of positivie instances targeted) / (the percentage of instances targeted)

= 전체 타겟 개체들 중 positive 개체의 비율

 

(ex) 

- 100 customers (50 positives, 50 negatives)

- 리스트를 스캔해 내려가다가 중간에서 (50% targeted) 멈추면 얼마나 많은 positives가 있을 것으로 예상하는가?

- case 1 : sorted randomly

    - 절반의 positives가 있을 것이다. -> lift = 0.5 / 0.5 = 1

- case 2 : ordered by an effective classifier

    - lift > 1

- case 3 : perfect classifier

    - lift = 1 / 0.5 = 2

 

12. Lift Curve

- 타겟 개체의 비율에 대한 lift 값을 그래프로 표현한다.

- 기본적으로 주어진 x 점에서의 cumulative response curve 값을 해당 점에서의 대각선 값으로 나눈 값이다.

- 따라서, cumulative response curve의 대각선은 lift curve에서 y = 1의 수평선이 된다.

- ex) 'our model gives a two times lift'

    - 임계값을 선택할 때, 모델 타겟팅은 랜덤일 때보다 2배 더 낫다. (잘 맞춘다)

    - cumulative response curve에서 true positive rate은 random classifier의 true positive rate의 두 배일 것이다.

 

- 즉, lift는 타겟팅의 효과를 측정한다.

 

+ Recent posts