크로스핏 체험을 다녀오고 근육통에 시달리는 채로 숙제중입니다.
처음해봤는데 제가 환상이 많았던 것인지 써억 만족스럽지는 않네요.
아마도 헬스로 돌아가지 않을까합니다만 뭐 어쨌든 이번주 숙제는 해야겠지요.
솔직히 말하면 사알짝 스불재 인생의 번아웃이 온 것 같아서 회사 프로젝트 하나 끝나고 연차를 쫌 내리 썼습니다.
아무것도 안하고 이틀동안 누워만 있으니 좀 회복되는 것 같기도 하고 아닌 것 같기도 하고 그렇습니다.
요즘은 그냥 휴가만 기다리고 있어요.
03-1 k-최근접 이웃회귀
k-최근접 이웃 회귀
회귀(regression) : 두 변수 사이의 상관관계를 분석하는 방법
회귀라는 용어는 19세기 통계학자이자 사회학자인 프랜시스 골턴(Francis Galton)이 처음 사용했습니다.
그는 키가 큰 사람의 아이가 부모보다 더 크지 않다는 사실을 관찰하고 이를 ‘평균으로 회귀한다’라고 표현했습니다.
k-최근접 이웃 분류 알고리즘 : 예측하려는 샘플에 가장 가까운 샘플 k개를 선택하고 이 샘플들의 클래스를 확인하여 다수 클래스를 새로운 샘플의 클래스로 예측합니다.
k-최근접 이웃 회귀 : 예측하려는 샘플에 가장 가까운 샘플 k개를 선택하고 이웃 샘플들의 수치들의 평균을 구해서 타깃값을 예측합니다.
데이터 준비
이번주는 colab이 아닌 VS code를 사용했습니다.
요즘 거의 google colab만 사용하다가 오랜만에 VS code를 사용하니까 조금 헷갈리기는 했지만 색상은 정말 이쁩니다.
머신러닝 모델에 사용하기 전에 훈련 세트와 테스트 세트로 나눕니다.
사이킷런의 train_test_split() 함수를 사용해 훈련 세트와 테스트 세트로 나눕니다.
사이킷런에서 사용할 훈련 세트는 2차원 배열이어야 합니다.
perch_length가 1차원 배열이기 때문에 train_input과 test_input도 1차원 배열입니다.
2차원 배열로 만들기 위해 억지로 하나의 열을 추가하는데 이 때 사용하는 메서드는 reshape() 메서드입니다.
넘파이는 배열의 크기를 자동으로 지정하는 기능도 제공하는데, 크기에 -1을 지정하면 다른 차원으로 채우고 남은 원소에 맞게 차원을 지정하라는 의미입니다.
train_input.reshape(-1,1) : 첫 번째 크기를 나머지 원소 개수에 맞게 설정하고 두 번째 크기를 1로
결정계수(R2)
KNeighborsRegressor : 사이킷런에서 k-최근접 이웃 회귀 알고리즘을 구현한 클래스
정확도 : 테스트 세트에 있는 샘플을 정확하게 분류한 개수의 비율(분류)
결정계수
: 실제 타깃값
: 예측값
: 타깃값의 평균
: 잔차 제곱합 (Sum of Squared Errors, SSE)
: 총 제곱합 (Total Sum of Squares, TSS)
만약 타깃의 평균 정도를 예측하는 수준이라면 결정계수는 0에 가까워지고, 예측이 타깃에 아주 가까워지면 1에 가까운 값이 됩니다.
사이킷런은 sklearn.metrics 패키지 아래 여러 가지 측정 도구를 제공합니다.
mean_absolute_error : 타깃과 예측의 절댓값 오차를 평균하여 반환합니다.
과대적합 vs 과소적합
과대적합(overfitting) : 훈련 세트에서 점수가 굉장히 좋았는데 테스트 세트에서는 점수가 굉장히 나쁘게 나온 경우
과소적합(underfitting) : 반대로 훈련 세트보다 테스트 세트의 점수가 높거나 두 점수가 모두 너무 낮은 경우
과소적합이 일어나는 이유는 훈련 세트와 테스트 세트의 크기가 매우 작기 때문입니다.
과소적합을 해결하는 방법은 모델을 조금 더 복잡하게 만들면 됩니다.
k-최근접 이웃 알고리즘으로 모델을 더 복잡하게 만드는 방법은 이웃의 개수 k를 줄이는 것입니다.
03-2 선형회귀
k-최근접 이웃의 한계
k-최근접 이웃 회귀는 가장 가까운 샘플을 찾아 타깃을 평균합니다.
따라서 새로운 샘플이 훈련 세트의 범위를 벗어나면 엉뚱한 값을 예측할 수 있습니다.
머신러닝 모델은 한 번 만들고 끝나는 프로그램이 아닙니다.
시간과 환경이 변화하면서 데이터도 바뀌기 때문에 주기적으로 새로운 훈련 데이터로 모델을 다시 훈련해야 합니다.
선형회귀
선형회귀(linear regression) : 특성이 하나인 경우 어쩐 직선을 학습하는 알고리즘
사이킷런은 sklearn.linear_model 패키지 아래에 LinearRegression 클래스로 선형 회귀 알고리즘을 구현해 놓았습니다.
하나의 직선을 그리려면 기울기와 절편이 있어야 합니다.
y=a×x+b
LinearRegression 클래스가 찾은 a와 b는 lr 객체의 coef_와 intercept_ 속성에 저장되어 있습니다.
머신러닝에서 기울기를 종종 계수(coefficient) 또는 가중치(weight)라고 부릅니다.
matplotlib.pyplot.plot()
은 선 그래프를 그릴 때 사용하는 함수
plt.plot(x값 리스트, y값 리스트)
-
x값 리스트
: 그래프의 x좌표 값들 -
y값 리스트
: 각 x값에 대응하는 y좌표 값들
이렇게 두 점 이상을 연결해서 선을 그리는 것.
모델이 단순하여 농어의 무게가 음수일 수도 있다는 문제점을 해결해야 합니다.
다항 회귀
다항 회귀(ploynomial regression) : 다항식을 사용한 선형 회귀
2차 방정식 그래프를 찾기 위해 훈련 세트에 제곱항을 추가했지만, 타깃값은 그대로 사용합니다.
03-3 특성 공학과 규제
다중 회귀
다중 회귀(multiple regression) : 여러 개의 특성을 사용한 선형 회귀
특성 공학(feature engineering) : 기존의 특성을 사용해 새로운 특성을 뽑아내는 작업
데이터 준비
판다스(pandas) : 데이터 분석 라이브러리
데이터프레임(dataframe) : 판다스의 핵심 데이터 구조
사이킷런의 변환기
변환기(transformer) : 특성을 만들거나 전처리 하기 위한 다양한 사이킷런 클래스
LinerRegression 같은 사이킷런의 모델 클래스는 추정기(estimator)라고 부릅니다.
PolynomialFeatures 클래스
다항 특성을 생성해주는 클래스
기존 데이터의 특성을 제곱하거나 곱해서 새로운 특성을 추가해줍니다.
이 클래스는 sklearn.preprocessing 모듈에 포함되어 있습니다.
기존 특성:
-
x₁ = 2
-
x₂ = 3
다항 특성을 만들면
-
x₁
-
x₂
-
x₁²
-
x₁·x₂
-
x₂²
이 순서로 생성됩니다.
[[2, 3]]
: 샘플 1개, 특성 2개 형태의 2차원 배열
include_bias=False
라 상수항(1)은 포함하지 않음
PolynomialFeatures 클래스의 fit() 메서드가 하는 일은 특성의 개수를 파악하는 것이 전부입니다.
따라서 훈련 데이터의 특성 개수만 동일하다면 fit() 매서드에 아무 값이나 전달해도 상관이 없습니다.
또한 훈련(fit)을 해야 변환(transform)이 가능합니다.
사이킷런의 일관된 api 때문에 두 단계로 나뉘어져 있습니다.
두 메서드를 하나로 붙인 fit_transform 메서드도 있습니다.
get_feature_names_out()
메서드 : 특성이 각각 어떤 입력의 조합으로 만들어졌는지 알 수 있습니다.
항상 훈련 세트를 기준으로 테스트 세트를 변환하는 습관을 들이는 것이 좋습니다.
다중 회귀 모델 훈련하기
PolynomialFeatures 클래스의 degree 매개변수를 사용하여 필요한 고차항의 최대 차수를 지정할 수 있습니다.
특성의 개수를 크게 늘리면 선형 모델은 강력해집니다.
하지만 이런 모델은 훈련 세트에 너무 과대적합되므로 테스트 세트에서는 형편없는 점수를 만듭니다.
규제
규제(regularization) : 머신러닝 모델이 훈련 세트를 너무 과도하게 학습하지 못하도록 훼방하는 것.
즉, 모델이 훈련 세트에 과대적합되지 않도록 만드는 것.
선형 회귀 모델의 경우 특성에 곱해지는 계수(또는 기울기)의 크기를 작게 만드는 일입니다.
일반적으로 선형 회귀 모델에 규제를 적용할 때 계수 값의 크기가 서로 많이 다르면 공정하게 제어되지 않을 것입니다.
규제를 적용하기 전에 먼저 정규화를 해야합니다. (사이킷런의 StandardScaler 클래스)
훈련 세트에서 학습한 평균과 표준편찬은 StandardScaler 클래스 객체의 mean_, scale_ 속성에 저장됩니다.
특성마다 계산하므로 55개의 평균과 표준 편차가 들어 있습니다.
선형 회귀 모델에 규제를 추가한 모델을 릿지와 라쏘라고 부릅니다.
릿지(Ridge) : 계수를 제곱한 값을 기준으로 규제를 적용
라쏘(Lasso) : 계수의 절댓값을 기준으로 규제를 적용
라쏘는 아예 계수를 0으로 만들 수도 있으며 일반적으로 릿지를 조금 더 선호합니다.
릿지 회귀
릿지와 라쏘 모델을 사용할 때 규제의 양을 임의로 조절할 수 있습니다.
모델 객체를 만들 때 alpha 매개변수로 규제의 강도를 조절합니다.
alpha 값이 크면 규제 강도가 세지므로 계수 값을 더 줄이고 조금 더 과소적합되도록 유도합니다.
alpha 값이 작으면 계수를 줄이는 역할이 줄어들고 선형 회귀모델과 유사해지므로 과대적합될 가능성이 큽니다.
alpha 값은 릿지 모델이 학습하는 값이 아니라 사전이 지정해야 하는 값입니다.
하이퍼파라미터(hyperparameter) : 머신러닝 모델이 학습할 수 없고 사람이 알려줘야 하는 파라미터
적절한 alpha 값을 찾는 한 가지 방법은 alpha 값에 대한 R2 값의 그래프를 그려 보는 것입니다.
훈련 세트와 테스트 세트의 점수가 가장 가까운 지점이 최적의 alpha 값이 됩니다.
적절한 alpha 값은 두 그래프가 가장 가깝고 데스트 세트의 점수가 가장 높은 0.1입니다.
라쏘 회귀
np.sum()
함수는 배열을 모두 더한 값을 반환합니다.
넘파일 배열에 비교 연산자를 사용했을 때 각 원소는 True 또는 False가 됩니다.
print(np.sum(lasso.coef_==0)
비교 연산자에 맞는 원소의 개수를 헤아리는 효과를 냅니다.
max_iter
는 알고리즘의 수행 반복 횟수를 지정합니다.
기본숙제
Ch.03(03-1) 확인문제(p.135) 4번 출력 그래프 인증하기
추가숙제
모델 파라미터에 대해 설명하기
모델 파라미터(model parameter)는 머신머닝 모델이 학습을 통해 데이터를 설명하기 위해 알고리즘이 찾은 값이라는 의미입니다.
머신러닝 알고리즘의 훈련 과정은 최적의 모델 파라미터를 찾는 것과 같은데, 이를 모델 기반 학습이라고 부릅니다.
선형회귀의 기울기와 절편 등이 대표적인 모델 파라미터입니다.
KNN(k-최근접 이웃)은 학습없이 훈련 데이터를 그대로 저장해 두고, 예측시 거리를 계산해 이웃을 찾는 사례 기반 학습 방법입니다.
즉, 학습없이 데이터를 기억하고 필요할 때마다 데이터를 참조해 답을 내는 방식이라 모델 파라미터가 없습니다.