이제 본격적으로 연합학습을 공부하기 전, 자주 나오는 용어들을 정리하고자 한다.

공부를 시작하는 초기 단계라서 이해하기 어려운 내용 + 논문 출처는 나중에 다시 추가할 예정

헷갈리는 개념이라 이번 기회에 이해가 잘 되도록 정리해야겠다.

틀린 부분이 있다면 댓글로 알려주세요. 감사히 생각하겠습니다.


Non-IID 란?

 우선, 연합학습은 모델을 학습하는 여러가지 방법 중 하나의 방법으로 연합학습에 참여하는 각 클라이언트들은 자신의 로컬 데이터를 서버에 전송하지 않고, 자신의 로컬 영역에서 로컬 데이터를 기반으로 모델을 학습한다. 일반적인 경우, 학습의 대상이 되는 데이터들은 클라이언트마다 다른 것이 자명하고 이것을 Non-IID(Independent and Identically Distributed) Data 라고 한다.

 IID는 확률 및 통계의 용어로서 확률변수 집합이 서로 독립적이고, 동일한 확률분포를 가질 때를 의미한다.

즉, Non-IID라는 것은 반대로 분산된 각 클라이언트가 가지고 있는 데이터가 서로 매우 다른 성격이고, 불균형한 확률분포를 가진다는 것을 의미한다. 연합학습에서는 서로 이질적인(Heterogeneous) 데이터를 학습하기 위한 가정을 가지고 수행된다.

 

Non-IID 이해를 위한 간단한 예시

그림 출처 : https://www.researchgate.net/publication/344017123_Wireless_for_Machine_Learning?_tp=eyJjb250ZXh0Ijp7ImZpcnN0UGFnZSI6Il9kaXJlY3QiLCJwYWdlIjoiX2RpcmVjdCJ9fQ

 

 위의 사진은  AI를 공부하는 모두가 아는 MNIST의 손글씨 Dataset이다.

 왼쪽의 각 클라이언트들의 dataset은 정확한 숫자의 모양은 달라도 확률변수 집합이 서로 독립적이고, 숫자 0~9를1개씩 가지는 동일한 확률 분포를 가진다.  ->  IID dataset

 반대로 오른쪽의 각 클라이언트들의 dataset은 확률변수 집합이 비독립/독립 적일지는 몰라도, 숫자 0~9를 균등하게 가지지 않는 불균형한 확률분포를 가진다.   ->  Non-IID dataset

 

문제점 및 과제

 대부분의 경우 각 클라이언트의 데이터는 Non-IID 할 것이다. 만일 Non-IID Dataset으로 모델을 학습하게 되면 모델 정확도도 낮아지고, 균일하지 않고 많기만한 Data에 Network cost도 높아질 것이다.

 이를 해결하기 위해 학습에 참여하는 클라이언트 선택하는 방법,  데이터셋 증류(Dataset distillation) 등 다양한 방법들이 연구되고 있다.

시간이 많이 흘러 CNN에 대해 배우는 중이다.

 

Training set과 Test set의 이미지를 Feature Scaling하거나 다른 변환이 필요할 때 사용한다.

 

데이터를 학습할 때, Class 별로 Balanced 하게 존재하는 경우가 흔치 않고,

Imbalance한 Data set을 학습시켜 모델을 만들경우 좋은 성능을 내기가 어렵다.

 

따라서 ImageDataGenerator 함수를 사용하여 여러 가지 방법으로 데이터를 변형하거나 만들어 낼 수 있다.

사용 전 from keras.preprocessing.image import ImageDataGenerator 로 임포트 해주어야 한다.

 

from tensorflow.keras.preprocessing.image import ImageDataGenerator
import numpy as np

train_datagenerator = ImageDataGenerator(
        rescale=1./255,    
        shear_range=0.2,    
        zoom_range=0.2,     
        horizontal_flip=True)

우선은 필요한 것만 사용하였는데, ImageDataGenerator의 파라미터를 하나하나 살펴보면

  • rescale : 픽셀 하나 하나에 feature scaling을 적용하기 위해 사용. 신경망에서 feature scaling은 필수다
  • shear_range : 이미지 기울기
  • zoom_range : 이미지 일부 확대
  • horizontal_flip : 이미지 가로 뒤집기
  • vertical_flip : 이미지 세로 뒤집기
  • brightness_range : 이미지 밝기 값
  • rotation_range : 이미지 회전 값
  • width_shift_range : 좌우로 움직임
  • height_shift_range : 위 아래로 움직임

 

예시 결과 참고 : https://m.blog.naver.com/PostView.nhn?blogId=isu112600&logNo=221582003889&proxyReferer=https:%2F%2Fwww.google.com%2F

Part 2-2 에서 독립변수의 개수가 1개 이상인 다중 선형 회귀 모델을 만들었다.

2023.08.29 - [ML & DL/머신러닝의 모든 것] - Part 2-2. 다중 선형 회귀 모델 만들기

 

Part 2-2. 다중 선형 회귀 모델 만들기

Part 2-1. 에서 독립변수의 개수가 1개인 단순 선형 회귀 모델을 만들었다. 2023.08.29 - [ML & DL/머신러닝의 모든 것] - Part 2-1. 단순 선형 회귀 모델 만들기 Part 2-1. 단순 선형 회귀 모델 만들기 Part 1에서

jijibae.tistory.com


이번에는 다항 회귀에 대해 알아보자

 

다항 회귀(Polynomial  Regression)란?

단순 선형 회귀, 다중 선형 회귀는 선형 데이터 세트 문제에 적합한 모델이다. 

이렇게 데이터 세트의 독립변수(x)와 결과(y)가 선형의 관계가 아닐 때 사용할 수 있는 모델이 다항식 회귀 모델이다.

 

다항 회귀 공식

단순 선형 회귀의 독립변수 개수는   1

다항 선형 회귀의 독립변수 개수는  >=1

다항 회귀의 독립변수의 개수는 1   

 

단순 선형 회귀와 다항 회귀의 독립변수의 개수는 1개로 같고, 그것의 차이는 독립변수와 종속변수와의 관계가 선형인가 비선형인가의 차이이다.

다항 회귀는 위의 공식을 참고해도 알 수 있듯이 독립 변수 1개의 n제곱 형태를 가진다.

위의 차이를 명확하게 이해하면 쉽게 구현할 수 있다.

 

다항 회귀 구현

출처 : 머신러닝의 모든것(유데미)

위 데이터세트는 A회사의 연차별 연봉을 조사한 것이다.

A회사에서 6.5년 근무하던 a가 B회사로 이직을 하여 과거 자신이 받았던 임금이 160,000$ 임을 감안해 똑같이 160,000$를 요구한다면  B회사 입장에서는 이것을 믿어야할까? 다항 회귀 방법을 통해 검증해보자.

 

 

<목차>

1. 라이브러리 임포트

2. 데이터세트 임포트

3. 전체 데이터세트를 사용하여 단순 선형 회귀 모델을 학습

4. 전체 데이터세트를 사용하여 다항 회귀 모델을 학습

5. 단순 선형 회귀 모델의 결과예측을 시각화하기

6. 다항 회귀 모델의 결과예측을 시각화하기

7. (6)의 결과를 더 매끄럽게 시각화하기

8. a가 거짓인지 아닌지 확인해보기

 

 

1. 라이브러리 임포트

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

 

2. 데이터세트 임포트

dataset = pd.read_csv('파일명')
x = dataset.iloc[:, 1:-1].values
y = dataset.iloc[:, -1].values

 

3. 전체 데이터세트를 사용하여 단순 선형 회귀 모델을 학습

from sklearn.linear_model import LinerRegression
lin_reg = LinearRegression()
lin_reg.fit(x, y)

 

4. 전체 데이터세트를 사용하여 다항 회귀 모델을 학습

다항 선형 회귀를 만드는 방법은 다음과 같다.

 1. n제곱된 특성들의 행렬을 만든다. (n = degree)

 2. 단순 선형 회귀를 만들어서 둘의 특성을 통합하면 된다.

from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree = 4)
x_poly = poly_reg.fit_transform(x)
lin_reg_2 = LinearRegression()
lin_reg_2.fit(x_poly, y)

line1 : 사이킷런의 preprocessing 모듈에 접근해 PolynomialFeatures 클래스를 임포트한다.

           전처리에 있는 이유는 x1이라는 특성을 x1^2, x1^3, ... , x1^n으로 전처리 할 것이기 때문이다.

line2 : x1^4까지 제곱된 행렬을 만들어주는 객체 생성

line3 : 기존의 특성행렬 x 를 적용시켜 제곱된 행렬의 형태로 만들어준다.

line4 : 단순 선형 회귀 모델을 하나 더 만든다.

line5 : line4 에서 만든 단순 선형 회귀 모델에 특성 값으로 제곱된 행렬을 넣어준다.

 

5. 단순 선형 회귀 모델의 결과예측을 시각화하기

plt.scatter(x, y, color = 'red')
plt.plot(x, lin_reg.predict(x), color = 'blue')
plt.title('Truth or Bluff(Linear Reggresion)')
plt.xlabel('Position Level')
plt.ylabel('Salary')
plt.show()

line1 : scatter을 사용하여 데이터를 빨간 점으로 표현할 것이다.

line2 : 학습시킨 선형회귀 모델에 x를 입력으로 주었을 때, 나오는 예측 결과를 plot 이용해 파란색 선으로 표현할 것이다.

line3,4,5 : 제목, x축, y축 이름 설정

line6 : 출력

비선형의 데이터를 단순 선형 모델로 예측한 결과 회귀선이 실제 데이터와 오차가 많다.

6. 다항 회귀 모델의 결과예측을 시각화하기

plt.scatter(x, y, color = 'red')
plt.plot(x, lin_reg_2.predict(x_poly), color = 'blue')
plt.title('Truth or Bluff(polynomial Regression)')
plt.xlabel('Position Level')
plt.ylabel('Salary')
plt.show()

line2 : line_reg_2를 이용할 때는 다양한 제곱으로 변환이 완료된 특정 x의 행렬에 적용해야한다.

           x 자체는 단일 특성이므로 변환 없이 사용할 수가 없다.

 

이 데이터에서는 선형 회귀보다 다항 회귀가 더 높은 정확도를 보여준다.

 

7. (6)의 결과를 더 매끄럽게 시각화하기

X_grid = np.arange(min(x), max(x), 0.1)
X_grid = X_grid.reshape((len(X_grid), 1))
plt.scatter(x, y, color = 'red')
plt.plot(X_grid, lin_reg_2.predict(poly_reg.fit_transform(X_grid)), color = 'blue')
plt.title('Truth or Bluff (Polynomial Regression)')
plt.xlabel('Position level')
plt.ylabel('Salary')
plt.show()

x축의 범위를 더 촘촘하게(0.1간격)으로 나눠서 회귀선을 표시하면 더 매끄러워진다.

numpy의 arange 함수를 이용한다.

회귀선이 보기좋게 매끄러워 졌다.

 

8. a가 거짓인지 아닌지 확인해보기

 우리가 이러한 작업을 한 이유는 새로운 고용자 a가 전 직장에서 받는 임금이 맞는지를 알기 위해 했으므로, 

그의 말이 맞는지 확인해보자.

print(lin_reg_2([[6.5]]))

=>[158862.45265155] 로 160,000$를 받았다는 a의 말이 맞을 수 있다는 결론이 나온다.

 

 

Part 2-1. 에서 독립변수의 개수가 1개인 단순 선형 회귀 모델을 구현했다.

2023.08.29 - [ML & DL/머신러닝의 모든 것] - Part 2-1. 단순 선형 회귀(Simple Linear Regression)의 이해와 구현

 

Part 2-1. 단순 선형 회귀(Simple Linear Regression)의 이해와 구현

Part 1에서 머신러닝 훈련을 위한 데이터 전처리 과정을 배웠다. 2023.08.25 - [ML & DL/머신러닝의 모든 것] - Part 1. 데이터 전처리 Part 1. 데이터 전처리 머신러닝 모델을 훈련시키기 전에 데이터를 전

jijibae.tistory.com


이번에는 다중 선형 회귀 모델을 만들어보자.

 

선형 회귀(Linear Regression)란?

 선형 회귀는 널리 사용되는 회귀 알고리즘이다.

 선형회귀는 종속 변수 y와 하나 이상의 독립 변수 x와의 선형 상관관계를 모델링하는 기법이다.

 독립 변수 x가 1개라면 단순 선형 회귀, 2개 이상이면 다중 선형 회귀라고 한다.

 

1) 단순 선형 회귀(Simple Linear Regression)

 위와 같은 식이 단순 선형 회귀의 식이며, 우리가 알고 있는 직선의 방정식이다. 

모델을 학습 시킨다는 뜻은 새로운 데이터를 입력했을 때 정확도가 높은 예측을 할 수 있게끔 상수 b0의 값과 기울기 b1의 값을 알아내는 것이다. 

 

2) 다중 선형 회귀(Multiple Linear Regression)

 단순 선형 회귀의 식과 다르게 다중 선형 회귀의 식은 독립변수 x의 개수가 1개 이상인 것을 알 수 있다.

같은 의미로 모델을 학습 시킨다는 뜻은 새로운 데이터를 입력했을 때 정확도 높은 예측을 할 수 있게 상수 b0와 계수 b1,b2,...,bn을 찾는 것이다.

 

이번에는 다중 선형 회귀 모델을 만들어 보겠다.

 

다중 선형 회귀 실습

출처 : 모두의 인공지능(유데미)

위 데이터세트는 50개의 스타트업 기업들의 각 분야에 사용하는 지출과 이익의 정도를 나타낸 것의 일부이다.

A, B, C, D 열의 값들이 이익에 영향을 주므로, 독립 변수 x의 개수가 4개라고 할 수 있다.

따라서 위의 데이터에 적합한 모델은 다중 선형 회귀 모델이다.

 

 

<목차>

1. 라이브러리 임포트

2. 데이터세트 임포트

3. 범주형 데이터 인코딩

4. 데이터세트를 훈련세트와 테스트세트로 나누기

5. 다중 선형 회귀 모델을 훈련세트로 학습시키기

6. 테스트 세트의 예측 결과 출력하기

 

 

 

1. 라이브러리 임포트

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

 

2. 데이터세트 임포트

dataset = pd.open_csv('파일명')
x = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

 

3. 범주형 데이터 인코딩

 위의 데이터 세트에서 'State' 열의 값이 범주형이므로 전에 배운 One-Hot 인코딩 방식을 이용해서 세 개의 열로 바꿔준다.

데이터세트의 맨 앞으로 옴

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformer = [('encoder', OneHotEncoder(), [3]), remainder = 'passthrough')
x = np.array(ct.fit_transform(x))

line1 : 사이킷런의 compose 모듈에 접근해 ColumnTransformer 클래스 임포트

line2 : 사이킷런의 preprocessing 모듈에 접근해 OneHotEncoder 클래스 임포트

line3 : ColumnTransformer의 인스턴스 ct생성 인자로는 (변환하고싶은열, 유지하고싶은열)

line4 : 변환한 열을 numpy array 형식으로 반환

 

4. 데이터세트를 훈련세트와 테스트세트로 나누기

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 0)

 

5. 다중 선형 회귀 모델을 훈련세트로 학습시키기

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(x_train, y_train)

놀랍게도 단순 선형 회귀 모델을 만들 때 사용한 클래스와 동일하다. 클래스가 가변수의 함정도 알아서 처리할 거고, 통계적 유의성이 가장 높은 최적을 특성을 선택하는 것도 알아서 처리할 것이다.

 

6. 테스트 세트의 예측결과 출력하기

 단순 선형 회귀의 결과는 2차원의 직선으로 나오는데, 다중 선형 회귀의 결과의 경우 변수의 개수에 따라 3차원, 4차원, 5차원으로 커지므로 시각화 하는 것은 불가능하다. 따라서 벡터 두개로 결과를 표시하겠다.

y_pred = regressor.predict(x_test)
np.set_printoptions(precision=2)
print(np.concatenate((y_pred.reshape(len(y_pred),1), y_test.reshape(len(y_test),1)),1))

line1 : 다중 선형 회귀 모델에 x_test 값을 입력값으로 준다.

line2 : numpy형식으로 소수점 2번째 자리 까지 표시하는 방법

line3 : concatenate 함수는 배열이나 벡터를 튜플 형식으로 입력값을 주면 합쳐준다.

           reshape 함수는 배열을 행방향이나 열방향으로 전환해준다.

           함수 형태는 concatenate(합치고싶은 배열, 합치는 방향)  합치는 방향 = 0  (수직방향), 합치는 방향 = 1 (수평방향)

                               reshape(원소의 개수, 표시방향) 표시방향 = 0 (수평방향), 합치는 방향 = 1 (수직방향)

 

결과

왼쪽 : 예측, 오른쪽 : 정답

다중 선형 회귀 모델도 단순 선형 회귀 모델에서 사용하는 클래스와 동일하다는 것에서 놀랐다.

입력으로 주어지는 데이터가 어떤가에 따라 알아서 단순 선형 회귀 모델로 만들어지거나 다중 선형 회귀 모델로 만들어지는 것을 배웠다.