Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[6주차 과제 제출] 4팀 이재흠 (+추가) #91

Open
wants to merge 19 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 1 addition & 6 deletions week1/3팀_이재흠.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,7 @@

**셀**은 노트북에서 실행할 수 있는 최소 단위입니다. 셀 안에 있는 내용을 한번에 실행하고 그 결과를 노트북으로 나타냅니다. 기존에 실행된 셀 내용이 다른 셀에서 실행할때 영향을 끼친다는 것이 노트북의 큰 특징입니다.

######구글 코랩
=======

###### 구글 코랩

**구글 코랩**은 주피터 노트북을 커스터마이징 웹 브라우저에서 무료로 파이썬 프로그램을 테스트하고 저장할 수 있는 서비스 입니다. 클라우드 기반의 주피터 노트북 개발 환경을 가지고 있어 자신의 컴퓨터의 사양이 좋지 않아도 프로그램을 돌릴 수 있어 유용합니다.
Expand Down Expand Up @@ -93,8 +92,6 @@ predict( ) 메서드는 새로운 데이터의 정답을 예측하는 메소드
<br>그래서 우리는 이 데이터를 훈련하는 데이터(train set)와 테스트하는 데이터(test set)로 나누어 모델 평가를 해야 합니다.


######샘플링 편향
=======
###### 샘플링 편향

훈련 데이터와 테스트 데이터에는 다른 특징을 가지는 데이터들이 골고루 섞여져 있어야 합니다.
Expand Down Expand Up @@ -142,6 +139,4 @@ mean = np.mean(train_input, axis=0) #행을 따라(axis=0) 각 열의 평균값
std = np.std(trian_input, axis=0) #행을 따라(axis=0) 각 열의 표준편차를 계산합니다.

````
=======
````

40 changes: 21 additions & 19 deletions week2/3팀_이재흠.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,12 @@
<br><br>이와 달리, **회귀(regression)** 는 연속적인 숫자를 예측하는 과정입니다. 분류에서는 몇개의 정해진 클래스중 하나를 선택하여 결정을 하도록 짜여져 있지만,
회귀는 대푯값이 클래스가 아니며, **연속성**을 띤 출력값을 지니게 됩니다.

일반적으로 엊고자 하는 데이터의 값이 이름(ex. 생성종류, 이름)일 경우 분류를 이용하고, 데이터의 값이 숫자(키, 나이)일 경우 회귀를 사용합니다.
일반적으로 얻고자 하는 데이터의 값이 이름(ex. 생성종류, 이름)일 경우 분류를 이용하고, 데이터의 값이 숫자(키, 나이)일 경우 회귀를 사용합니다.

###### * k-최근접 이웃 회귀 (k-NN Regression)
<br><img alt="k-최근접 이웃 회귀 방식 설명" src="images\3팀_이재흠\03-1k-NN Regression explain1.png" width="500"><br>
▲ k-최근접 이웃 회귀에 작동방식([이미지 출처][1])]

![k-최근접 이웃 회귀 방식 설명](./images/3팀_이재흠/03-1k-NN Regression explain1.png)
<br>▲ k-최근접 이웃 회귀에 작동방식([🖼️ 이미지 출처][1])]
<br> 기존에 배운 k-최근접 이웃(k-NN, K-Nearest Neighbor)이 근처에 있는 k개의 데이터를 보고 속할 **그룹**을 판단해주는 알고리즘이었습니다.
이와 달리 **k-최근접 이웃 회귀 (k-NN Regression)** 는 근처에 있는 k개의 데이터를 보고 그 값들의 **평균**을 반환하는 알고리즘입니다.

Expand Down Expand Up @@ -59,11 +60,11 @@ print(test_array.shape) #(1,1000)

<br> R<sup>2</sup>를 구하는 방법은 다음과 같습니다.

<img alt="k-최근접 이웃 회귀 방식 설명" src="images\3팀_이재흠\03-1 R2 explain1.png" width="200"><br>
여기서 SSE는 회귀선에 위치한 값(추정 값)과 실제값의 차이(오차)의 제곱이며, SST는 실제 값 과 Y의 평균을 뺀 값의 제곱을 의미합니다.
![k-최근접 이웃 회귀 방식 설명](./images/3팀_이재흠/03-1 R2 explain1.png)
<br>여기서 SSE는 회귀선에 위치한 값(추정 값)과 실제값의 차이(오차)의 제곱이며, SST는 실제 값 과 Y의 평균을 뺀 값의 제곱을 의미합니다.

<br>R<sup>2</sup>는 회귀모형 내에서 설명변수 x로 설명할 수 있는 반응변수 y의 변동 비율입니다.
<br>[R<sup>2</sup>결정계수에 대한 더 자세한 설명][2]
<br>[R<sup>2</sup>결정계수에 대한 더 자세한 설명][2]
<br>scikit-learn에 있는 클래스 r2_score를 이용해 패키지를 통해 쉽게 사용할 수 있습니다.
```python
from sklearn.metrics import r2_score
Expand All @@ -74,9 +75,10 @@ r2_score(test_target, test_prediction) #결정계수
<br>

###### * MAE(mean absolute error)
<img alt="k-최근접 이웃 회귀 방식 설명" src="images\3팀_이재흠\03-1 MAE expain1.png" width="200"><br>
![k-최근접 이웃 회귀 방식 설명](./images/3팀_이재흠/03-1 MAE expain1.png)


**MAE(mean absolute error)**는 모든 절대 오차의 평균입니다.
**MAE(mean absolute error)** 는 모든 절대 오차의 평균입니다.
<br>scikit-learn에 있는 클래스 mean_absolute_error 패키지를 통해 쉽게 사용할 수 있습니다.
```python
from sklearn.metrics import mean_absolute_error
Expand All @@ -88,8 +90,8 @@ print(mae)

###### * 과대적합 vs 과소적합

<img alt="과대적합이 된 그래프와 과소적합이 된 그래프" src="images\3팀_이재흠\03-1 overunder explain1.png" width="500"><br>
▲ 과대적합, 과소적합에 대한 설명 이미지([이미지 출처][3])]
![과대적합이 된 그래프와 과소적합이 된 그래프](./images/3팀_이재흠/03-1 overunder explain1.png)<br>
▲ 과대적합, 과소적합에 대한 설명 이미지([🖼️ 이미지 출처][3])]

훈련세트에서 점수가 높게 나왔지만, 테스트 세트에서 점수가 매우 안좋게 나왔다면 모델이 훈련세트에 **과대적합(overfitting)** 되었다고 말합니다.
<br>반면, 훈련세트와 테스트 세트가 동시에 낮거나 테스트 세트의 점수가 오히려 더 높은 경우, 모델이 훈련세트에 **과소적합(underfitting)** 되었다고 말합니다.
Expand All @@ -98,20 +100,20 @@ print(mae)
###### * k-최근접 이웃 회귀 (k-NN Regression)의 한계

k-최근접 이웃 회귀 알고리즘은 직관적이며, 간단하기에 처음 머신러닝을 시작하기에 편리하지만, **데이터 밖의 범위**의 새로운 데이터에서는 예측이 불가능하다는 단점이 있습니다.
<br>이해하기 쉽게 표를 이용하여 설명해보자
<br><img alt="어느 지점에서부터는 예측이 맞지 않는 그래프이다" src="images\3팀_이재흠\03-2 limit of k-NN Regression.png" width="500"><br>
위 그래프는 훈련 데이터(점)에 따른 테스트 결과값(선)의 그래프이다. 5~45 정도 까지는 어느정도 예측을 했지만, 50이상부터는 일직선으로 나와버린다.
이는 k개의 '근처'에 있는 데이터를 보기 때문에 데이터들에서 멀어질 경우 생기는 현상입니다.
<br>이해하기 쉽게 표를 이용하여 설명해봅시다.
<br>![어느 지점에서부터는 예측이 맞지 않는 그래프입니다.](./images/3팀_이재흠/03-2 limit of k-NN Regression.png)<br>
위 그래프는 훈련 데이터(점)에 따른 테스트 결과값(선)의 그래프입니다. 5~45 정도 까지는 어느정도 예측을 했지만, 50이상부터는 일직선으로 나와버리는 현상이 일어납니다.
이는 알고리즘이 데이터에서 멀어질 때에도 k개의 '근처'에 있는 데이터를 보고 판단하기 때문에 생기는 현상입니다.

###### * 선형 회귀 (linear regression)
**선형회귀(linear regression)** 는 종속 변수 y와 여러 개의 독립 변수 x와의 선형 관계를 모델링하는 회귀분석 기법입니다.
그중에 변수 x가 하나일 때를 **단순 선형 회귀(Simple Linear Regression)** 이라 부르기도 합니다.
<br><img alt="선형회귀와 k-nn" src="images\3팀_이재흠\03-2 linear regression explain1.png" width="500"><br>
<br>![선형회귀와 k-nn](./images/3팀_이재흠/03-2 linear regression explain1.png)<br>
k-NN 회귀(주황색)과 달리 선형 회귀(파란색)은 주어진 훈련 데이터 범위 밖을 지나는 데이터도 예측이 가능하다는 특징이 있습니다.
또한 훈련하는 속도가 빠르고 결과값을 내는데 시간이 좀 걸리는 k-nn과 달리, 선형회귀는 훈련 속도는 다소 느리지만(그래도 빠르긴 하다) 테스트 속도가 빠르다는 장점을 지니고 있습니다.

이때 하나의 선형함수는 다음과 같이 표현할 수 있습니다.
<br><img alt="y=wx+b" src="images\3팀_이재흠\03-2 linear regression explain2.png" width="200"><br>
<br>![y=wx+b](./images/3팀_이재흠/03-2 linear regression explain2.png)<br>
이때 w를 **가중치(weight)** , 별도로 더해지는 값 b를 **편향(bias)** 이라고 부릅니다.

scikit-learn에서는 LinearRegression모델로 간편하게 선형회귀 모델을 만들 수 있습니다.
Expand All @@ -126,18 +128,18 @@ print(lr.intercept_) #학습된 선형함수의 편향을 불러옵니다.
```

선형회귀의 학습과정 중에는 경사하강법(Gradient Descent)이 나오긴 하지만, 이는 다른 챕터에서 다룰 예정입니다.
<br>[선형회귀와 다중회귀& 경사하강법에 대한 간단한 설명(링크)][4]
<br>[선형회귀와 다중회귀& 경사하강법에 대한 간단한 설명(링크)][4]

###### * 다항 회귀 (polynomial regression)
**다항 회귀(polynomial regression)** 는 다항식을 이용한 선형 회귀로, 항이 2차, 3차, 제곱근일수도 있으며(로그함수 일 수도 있습니다!), 함수의 형태가 **비선형**이라는 특징이 있습니다.
<br><img alt="대충 그린 선형과 비선형 차이" src="images\3팀_이재흠\03-2 polynomial regression explain1.png" width="500"><br>
<br>![대충 그린 선형과 비선형 차이](./images/3팀_이재흠/03-2 polynomial regression explain1.png)<br>

### 03-3. 특성 공학과 규제

###### * 다중 회귀 (multiple regression, Multiple Linear Regression)
여러개의 특성을 활용한 선형 회귀를 **다중 회귀(multiple regression, Multiple Linear Regression)** 라고 부릅니다.
단순 선형 회귀와 달리 다중 회귀는 여러개의 특성을 사용한다는 차이점이 있습니다.
<br><img alt="y=wx+b" src="images\3팀_이재흠\03-3 multiple regression explain1.png" width="500"><br>
<br>![y=wx+b](./images/3팀_이재흠/03-3 multiple regression explain1.png)<br>

다중 회귀에 사용되는 특성들 중에는 특성을 제곱한다던지 특성을 서로 곱하여 새로운 특성을 만드는 경우가 있습니다. 이처럼 기존의 특성을 이용하여 새로운 특성을 만들어 내는 작업을 **특성 공학(feature engineering)** 이라고 부릅니다.
###### * 판다스(Pandas)와 사이킷런 변환기, 정규화 클래스
Expand Down
Binary file modified week2/images/3팀_이재흠/03-1 MAE expain1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified week2/images/3팀_이재흠/03-1 R2 explain1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified week2/images/3팀_이재흠/03-1 overunder explain1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified week2/images/3팀_이재흠/03-1k-NN Regression explain1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified week2/images/3팀_이재흠/03-2 limit of k-NN Regression.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified week2/images/3팀_이재흠/03-2 linear regression explain1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified week2/images/3팀_이재흠/03-2 linear regression explain2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
124 changes: 124 additions & 0 deletions week3/3팀_이재흠.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
# 🖥️ 혼공머신 스터디 : 4장 요약
#### 스터디 3조 이재흠 (@rethinking21, [email protected])

***
## 챕터 4 다양한 분류 알고리즘 🎁<br><br>

### 04-1. 로지스틱 회귀 🐍

###### 다중분류(multi-class classification)
타깃 데이터에 2개 이상의 클래스가 포함된 문제를 **다중분류(multi-class classification)** 라고 부릅니다.
이전에 배웠던 k-최근접 이웃 분류기를 통해 다중 분류를 수행 하실 수 있습니다.
```python
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier(n_neighbors=3)
kn.fit(train_scaled. train_target)
proba = kn.predict_proba(test_scaled[4])
print(np.round(proba, decimals=4))
```
출력값에 보이는 결과는

###### 로지스틱 회귀(logistic regression)

**로지스틱 회귀(logistic regression)** 는 분류 모델로, 선형회귀와 동일하게 선형방정식을 학습합니다.
확률은 0에서 1 사이의 값이어야 하기 때문에, 선형회귀는 확률을 표현하는 데에는 적절하지 않습니다

![시그모이드 함수의 그래프](./images/3팀_이재흠/04-1 logistic function.png)<br>
▲ [🖼️ 이미지 출저][1]
<br> **시그모이드 함수(sigmoid function)** 는 이를 해결해주는 함수입니다.
이 함수는 무한히 음수값이 될 때는 0에 가까워지고, 무한히 양수값이 될 때는 1에 가까워집니다.


Scikit-learn에서는 LogisticRegression 클래스를 이용하여 로지스틱 회귀모델을 이용할 수 있습니다.
```python
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=20, max_iter=1000)
lr.fit(train_data, target_data)
```
여기서 max_iter 매개변수는 반복횟수를 의미하고, C 매개변수는 LogisticRegression 클래스의 규제를 제어합니다.

또한 Scipy의 expit이라는 함수를 통해 시그모이드 함수를 구현 할 수 있습니다.
```python
from scipy.special import expit
print(expit(decisions))
```

###### 불리언 인덱싱(boolean indexing)
넘파이 배열은 True, False 값을 전달하여 행을 선택 할 수 있습니다. 이를 **불리언 인덱싱(boolean indexing)** 이라고 부릅니다.

```python
import numpy as np
char_arr = np.array(['A', 'B', 'C', 'D', 'E'])
print(char_arr[[True, False, True, False, False]]) # ['A' 'C']
```

###### 소프트맥스 함수 (softmax function)

로지스틱 회귀로 다중 분류를 수행할 때는 **소프트맥스(softmax)** 함수를 사용하여 확률로 변환합니다.

![소프트맥스 함수](./images/3팀_이재흠/04-1 softmax function.png)<br>

scipy에서의 함수 softmax를 이용하여 소프트맥스 함수를 사용 할 수 있습니다.

```python
from scipy.special import softmax
import numpy as np
proba = softmax(decision, axis=1)
print(np.round(proba, decimals=3))
```

### 04-2. 확률적 경사 하강법 ⛰️

###### 경사하강법
**경사하강법** 은 함수 값이 낮아지는 방향으로 독립 변수 값을 변형해 최소 함수 값을 갖도록 하는 방법을 말합니다. 보통 산에서 내려오는 것으로 비유를 많이 합니다.
<br>경사하강법에서 조심해야 하는 부분은 step size입니다. 이 값이 너무 작을 경우 학습을 여러번 해도 온전히 학습이 안되는 문제가 발생 할 수 있으며, 반대로 값이 너무 클경우 제대로 학습이 되지 않는 문제가 발생합니다.
<br>![편안한 stepsize](./images/3팀_이재흠/04-2 GD step size 01.gif)<br>
<br>![너무 커서 불편한](./images/3팀_이재흠/04-2 GD step size 02.gif)<br>
▲[🖼️ 이미지 출처][2]
<br><br>경사하강법에는 종류가 여러가지가 있습니다.

먼저, 전체 데이터를 한번에 돌려서 경사하강법을 수행하는 **배치 경사 하강법(Batch Gradient Descent)** 가 있습니다.
이 방법은 가장 안정적이지기도 하지만, 전체데이터를 사용하기에 컴퓨터 자원을 많이 소모한다는 단점이 있습니다.

이와 달리 전체데이터중 한개를 무작위로 골라서 학습시키는 **확률적 경사 하강법(Stochastic Gradient Descent, SGD)** 이 있습니다.
이 경우 학습속도가 빠르다는 장점이 있지만, 데이터가 말 그대로 확률적이기에 최소비용에 도달했는지 판단하는데 어려움이 있다는 단점이 존재합니다.

전체 데이터 중에 여러개의 데이터를 뽑아와 학습시키는 방법도 있습니다. 이를 **미니배치 경사 하강법(minibatch Gradient Descent)** 라고 부릅니다.
SGD의 노이즈를 줄이면서, 속도 또한 빠르다는 장점이 있기에 실전에서 많이 쓰이는 방법입니다.

<br>![경사학습법을 그림으로 나타낸 것](./images/3팀_이재흠/04-2 manyGDs.png)<br>

훈련세트를 한번 다 사용 하는 것을 **에포크(epoch)** 라고 합니다.
또, **배치(batch)** 는 모델의 가중치를 한번 업데이트시킬 때 사용되는 샘플들의 묶음을 의미합니다.
배치와 에포크를 조절해가며 학습의 효율을 조절해야 합니다.

에포크를 많이 수행하게 되면 어느새 훈련/테스트 세트의 정확도가 낮아지는 현상이 발생합니다. 이는 과대적합이 된 경우로서 우리는 이 경우가 오지 전에 훈련을 종료해야 합니다.
이를 **조기 종료(early stopping)** 라고 합니다.

[❕ 경사하강법에 대한 자세한 내용][3]

Scikit-learn에서 확률적 경사 하강법을 제공하는 대표적인 분류용 클래스는 SGDClassifier가 있습니다.
```python
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss='log', max_iter=10, random_state=42)
sc.fit(train_scaled, train_target)
```
여기서 max_iter는 수행할 에포크 횟수를 뜻합니다. loss는 추후의 나올 손실함수를 무엇으로 계산할 것인지를 정해주는 매개변수입니다.

###### 손실함수(loss function)

**크로스엔트로피 손실 함수(cross-entropy loss function)** 분류 모델이 얼마나 잘 수행되는지 측정하기 위해 사용되는 지표입니다.
분류 과정에서 실제값과 예측값이 정확할수록 점점 0에 가까워지게 됩니다.

**로지스틱 손실함수(logistic loss function)** 는 다중 분류를 위한 손실 함수인 크로스 엔트로피(cross entropy) 손실 함수를 이진 분류 버전으로 만든 것입니다.
그래서 **이진 크로스엔트로피 손실 함수(binary cross-entropy loss function)** 이라고 불리기도 합니다.

[❕ 로지스틱 손실 함수에 대한 더 자세한 내용][4]

SGDClassifier 에서의 loss 매개변수의 기본값은 힌지손실입니다. **힌지 손실(hinge loss)** 는 **서포트 벡터 머신** 이라는 또 다른 머신러닝 알고리즘을 위한 손실함수입니다.


[1]: https://velog.io/@yuns_u/Logistic-Regression
[2]: https://hackernoon.com/life-is-gradient-descent-880c60ac1be8
[3]: https://angeloyeo.github.io/2020/08/16/gradient_descent.html
[4]: https://ukb1og.tistory.com/22
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added week3/images/3팀_이재흠/04-2 manyGDs.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading