파이썬&기계학습 입문 2 (완)

Joel Lee·2023년 5월 6일
0

AI & DS

목록 보기
2/14
post-thumbnail

Notes

본 글은 Kikagaku의 무료 강좌 파이썬&기계학습 입문의 강의 노트 중 두 번째 노트입니다.
아래의 리스트는 해당 강좌의 커리큘럼이며, 본 노트는 "8. 도입"부터 "11. 단회귀분석 구현"까지의 내용을 간단하게 정리한 글입니다.

Curriculum (401/548)
1. 도입 (42 min)
2. 미분 (49 min)
3. 선형대수 (55 min)
4. 단회귀분석 (52 min)
5. 중회귀분석 (56 min)
6. Python 속성 강의 (101 min)
7. 단회귀분석 구현 (51 min


8. 중회귀분석 구현 (27 min)
9. 연습문제 (52 min)
10. 통계 (32 min)
11. 중회귀분석 2 (31min)

중회귀분석 구현

연습문제: 중회귀분석의 계산

데이터셋

X =[  1  2  3   1  2  5   1  3  4   1  5  9], y =[  1  5  6  8]\mathbf{X} = \begin{bmatrix}   1 & 2 & 3 \\   1 & 2 & 5 \\   1 & 3 & 4 \\   1 & 5 & 9 \end{bmatrix} , \mathbf{y} = \begin{bmatrix}   1 \\ 5 \\ 6 \\ 8 \end{bmatrix}

필요한 지식

  w = (XT X)1 XT y  \mathbf{w} = (\mathbf{X}^{\text{T}} \mathbf{X})^{-1} \mathbf{X}^{\text{T}} \mathbf{y}
  • 벡터, 행렬의 정의: np.array( [ [ ] ] )
  • 전치: .T
  • 역행렬: np.linalg.inv( )
  • 행렬곱: np.dot( A, B )

순서

  1. Step1: XT X\mathbf{X}^{\text{T}} \mathbf{X}
  2. Step2: (XT X)1(\mathbf{X}^{\text{T}} \mathbf{X})^{-1}
  3. Step3: XT y\mathbf{X}^{\text{T}} \mathbf{y}
  4. Step4: w = (XT X)1 XT y\mathbf{w} = (\mathbf{X}^{\text{T}} \mathbf{X})^{-1} \mathbf{X}^{\text{T}} \mathbf{y}

Scikit-learn 으로 구현

from sklearn.linear_model import LinearRegression
import numpy as np

X = np.array([
			  [1,2,3],
			  [1,2,5],
			  [1,3,4],
			  [1,5,9]
])

y = np.array([
			  [1],
			  [5],
			  [6],
			  [8]
])

# 모델 선언
model = LinearRegression(fit_intercept=False)
# 모델 학습
model.fit(X, y)
# 파라미터 확인
model.coef_
# 예측정확도 확인 (결정계수 0~1)
model.score(X, y)
# 예측
x_new = np.array([
				  [1, 3, 6]
])
y_pred = model.predict(x_new)

연습문제

데이터 읽어오기

import numpy as np
import pandas as pd

# 데이터 읽어오기
df = pd.read_csv('/~/~/~.csv')

# 데이터 정보 확인, 읽어온 후에 반드시 확인하는 걸 추천
df.info()

분포의 확인

import seaborn as sns
sns.set() # 격자표시

# 히스토그램 표시
sns.displot(df['x6'], bins = 10) # bins는 구간수

# 상관계수 산출
df.corr()
# 상관계수를 알 수 있는 분포표
sns.pairplot(df) # 그래프가 많아 처리 시간이 김

입력변수와 출력변수 나누기

여러 방법이 있는데, 편한 걸 쓰자.

X = df.iloc[:, :13]
y = df.iloc[:, -1]
X = df.drop('y', axis = 1)
y = df['y']

모델의 구축과 검증

'Scikit-learn 으로 구현 ' 과 동일

훈련 데이터와 검증 데이터

from sklearn.model_selection import train_test_split

# 훈련 데이터와 검증 데이터 나누기
X_train, X_test, t_train, t_test = train_test_split(X, t, test_size = 0.4, random_state=1) # random_state 는 난수 시드 고정(재현성 확보)

모델 학습과 검증 등은 동일

예측값 계산과 모델의 보존

주의사항

# 변수의 차원에는 항상 신경쓰도록
np.array(sample).reshape(1,-1).shape # 조금 복잡한 reshape
y_pred = model.predict([sample]) # 위처럼 reshape해도 되지만, 이처럼 [sample]도 가능

모델 보존과 읽어오기

import joblib
# 모델 보존
joblib.dump(model, 'model.pkl')
# 모델 읽어오기
model_new = joblib.load('/content/drive/MyDrive/1. Projects/Kikagaku/1. Python&機械学習入門/model.pkl')

파라미터 확인

# 파라미터를 보기 편하게
np.set_printoptions(precision=3, suppress=True) # 유효숫자, 지수형식표시
model.coef_
  • w\mathbf{w} 의 값을 확인만 하는 걸로는 어떤 변수의 영향이 큰지 판단할 수 없다. 애초에 x_i 의 스케일감이 서로 제각각이기 때문.

통계

주된 통계량

  • 평균 xˉ\bar{x}
  • 분산 σ2\sigma^{2}
    - 모분산 or 표본분산 : 데이터가 모집단인가 표본인가. 보통은 모집단 전체의 데이터가 없으므로 표본분산을 이용.
    - 모분산을 구하는 식에 모평균 대신 표본평균을 넣으면 스케일이 N1N\frac{N-1}{N} 배가 되기 때문.
  • 표준편차 σ\sigma : 원래 스케일으로 논의할 수 있다.

연습문제

정규분포와 3σ\sigma

  • 정규분포를 이용하는 이유
    - 수식으로 다루기 쉽다
    - 물리현상으로 자주 나옴
  • 3σ3\sigma : 99.7%
    이상값 검출에 사용
    Hampel 판별법: 평균 대신 중앙값 이용.
    * 이상값으로 인해 평균이 정확하지 않을 수도 있기 때문에 쓰기도 함.

스케일링

  • Standard Scaling (데이터 표준화) 각 변수의 스케일을 맞추기 위해 각 변수의 분포를 표준정규분포 (평균 0, 표준편차 1 인 정규분포) 로 바꿈.
xs=xxˉσx_{s}= \frac{x-\bar{x}}{\sigma}
  • 그러면 w\mathbf{w} 의 값에 따라 어떤 변수가 중요한지 대강 파악할 수 있음.

중회귀분석 2

이상값 제거 + 스케일링 + 중회귀분석

  • 모델의 정확도를 올리는 방법
    - 이상값 제거
    - 이상값을 평균이나 중앙값으로 보간
    - 주성분 분석 등을 써서 잠재변수로 변환시킨 후, 3σ3\sigma 법을 적용

이상값 제거

import numpy as np
import pandas as pd

# 데이터 읽어오기
df = pd.read_csv('/~/~/~.csv')

# 제거 후 df
_df = df

cols = df.columns
for col in cols:
	# 3σ법의 상하한을 설정
	low = mean[col] - 3 * sigma[col]
	high = mean[col] + 3 * sigma[col]
	# 조건으로 줄이기
	_df = _df[(_df[col] >= low) & (_df[col] <= high)]

모델 구축

  • 과학습 (오버피팅)
    - 과학습을 막는 구체적인 방법에 대해서는 Kikagaku 의 탈블랙박스 코스에서 배울 수 있다.

스케일링을 고려한 중회귀분석

# scikit-learn에 내장된 스케일러 import
from sklearn.preprocessing import StandardScaler

# 인스턴스화
scaler = StandardScaler()

# 스케일러 학습(평균과 표준편차 산출)
scaler.fit(X_train)
# 여기에서도 훈련 데이터만을 이용해서 스케일링. 검증 데이터는 진짜 검증 시에만 쓴다.

# 변수들의 scaling
X_train2 = scaler.transform(X_train)
X_test2 = scaler.transform(X_test)

# 모델 학습
model = LinearRegression().fit(X_train2, y_train)

# 검증 (훈련 데이터)
model.score(X_train2, y_train)

# 검증 (검증 데이터)
model.score(X_test2, y_test)

# weight 확인
sns.barplot(x=X.columns, y=model.coef_)
  • 중회귀 분석은 스케일링에 의해 정확도가 바뀌지 않음.
  • 스케일링은 weight 를 확인하기 위한 것.
profile
개발자 전직을 향해 나아가고 있는 Technical Sales Engineer

0개의 댓글