Stay Hungry Stay Foolish

혼공/머신러닝

3장 회귀 알고리즘과 모델 규제

dev스카이 2022. 8. 13. 23:59

지도 학습 알고리즘은 크게 분류회귀로 나뉜다. 분류는 2장에서 다뤘고, 3장에서는 회귀를 배운다.

Regression : 클래스 중 하나로 분류하는 것이 아니라 임의의 어떤 숫자를 예측하는 문제이다.

※ 19세기, 통계학자이자 사회학자인 Francis Galton이 처음 사용한 용어다. 두 변수 사이의 상관관계를 분석하는 방법을 회귀라고 불렀다.

 

2장에서 사용했던 k-Nearest Neighbor Algorithm이 회귀에도 작동한다. k-최근접 이웃 분류 알고리즘은 예측하려는 샘플에 가장 가까운 샘플 k개를 선택하고, 이 샘플들의 클래스를 확인하여 그 중 다수 클래스를 새로운 샘플의 클래스로 예측한다.

k-Nearest Neighbor Classifier Algorithm

k-최근접 이웃 회귀 알고리즘은 예측하려는 샘플에 가장 가까운 샘플 k개를 선택한다. 이웃과 다르게 이웃한 샘플의 타깃은 어떤 클래스가 아닌 임의의 수치이다. 이웃 샘플의 타깃값의 평균이 샘플 X의 예측 타깃값이 된다.

k-Nearest Neighbor Regression Algorithm

회귀 알고리즘 종류

- Linear Regression : 특성이 하나인 경우 직선을 학습하는 알고리즘이다.

- Polynomial Regression : 다항식을 사용한 알고리즘이다. 

- Multiple Regression : 여러 개의 특성을 사용하는 선형 회귀 알고리즘이다. (특성이 2개일 때 평면을 학습)

 

실습하기 전 알아두어야 할 용어

- Overfitting : 모델의 훈련 세트 점수가 테스트 세트 점수보다 훨씬 높을 경우를 의미하며, 과대적합이라고 한다. 훈련 세트에만 잘 맞는 모델이라 테스트 세트와 새로운 샘플에 대한 예측을 만들 때 잘 동작하지 않는다.

- Underfitting : 모델의 훈련 세트와 테스트 세트 점수가 모두 동일하게 낮거나 테스트 세트 성능이 오히려 더 높을 경우를 의미하며, 과소적합이라고 한다. 모델이 단순해 훈련 세트에 적절히 훈련되지 않은 경우를 말한다.

- Feature Engineering : 기존의 특성을 사용해 새로운 특성을 뽑아내는 작업으로, 특성 공학이라고 한다.

- Regularization : 머신러닝 모델이 훈련 세트를 너무 과도하게 학습하지 못하도록 훼방하는 것을 의미하며, 규제라고 한다.

  - ridge : 선형 회귀 모델에 규제를 추가한 모델 중 하나로, 계수를 제곱한 값을 기준으로 규제를 적용한다.

  - Lasso : 선형 회귀 모델에 규제를 추가한 모델 중 하나로, 계수의 절댓값을 기준으로 규제를 적용한다.


- 변환기(Transformer) : 특성을 만들거나 전처리하기 위해 사이킷런에서 제공하는 다양한 클래스를 말한다.

- 추정기(Estimator) : 선형 회귀 알고리즘과 같은 사이킷런의 모델 클래스를 말한다.


구글 코랩으로 머신러닝 실습하기

농어의 길이만을 이용해 무게를 예측하는 머신러닝 만들기

 

1. 농어 데이터 준비

import numpy as np 
perch_length = np.array([8.4, 13.7, 15.0, 16.2, 17.4, 18.0, 18.7, 19.0, 19.6, 20.0, 21.0,
       21.0, 21.0, 21.3, 22.0, 22.0, 22.0, 22.0, 22.0, 22.5, 22.5, 22.7,
       23.0, 23.5, 24.0, 24.0, 24.6, 25.0, 25.6, 26.5, 27.3, 27.5, 27.5,
       27.5, 28.0, 28.7, 30.0, 32.8, 34.5, 35.0, 36.5, 36.0, 37.0, 37.0,
       39.0, 39.0, 39.0, 40.0, 40.0, 40.0, 40.0, 42.0, 43.0, 43.0, 43.5,
       44.0])
perch_weight = np.array([5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 110.0,
       115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 130.0,
       150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 197.0,
       218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 514.0,
       556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 820.0,
       850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 1000.0,
       1000.0])

파이썬 리스트에서 넘파이 배열로 변환하는 건 번거로우니 바로 넘파이 배열로 변환한다.

 

2. 훈련 세트와 테스트 세트로 나누기

#훈련 세트와 테스트 세트로 나눔
from sklearn.model_selection import train_test_split 
train_input, test_input, train_target, test_target = train_test_split(perch_length, perch_weight,random_state=42)

train_test_split() : 전달되는 리스트나 배열을 비율에 맞게 훈련 세트와 테스트 세트로 나누어 주는 함수다. 나누기 전엔 알아서 섞어 준다. 나누고 싶은 리스트나 배열을 원하는 만큼 전달하면 된다. 이 함수 내에 자체적으로 랜덤 시드를 지정할 수 있는 random_state 매개변수가 있다. 기본적으로 25%를 테스트 세트로 떼어 낸다.

 

사이킷런에 사용할 훈련 세트는 2차원 배열이어야 한다. 농어 데이터는 1차원이기 때문에 훈련 세트와 테스트 세트도 1차원으로 만들어진다. 2장에서는 2개의 특성을 사용했기 때문에 자연스럽게 2차원 배열을 사용했다. 이번 실습에서는 특성 1개만 사용하므로 수동으로 2차원 배열을 만들어야 한다. 

#넘파이에서 배열의 크기를 자동 지정
train_input = train_input.reshape(-1,1)  #크기에 -1을 지정하면 나머지 원소 개수로 모두 채우라는 의미임.
test_input = test_input.reshape(-1,1)
print(train_input.shape, test_input.shape)

reshape() : 배열의 크기를 바꿀 수 있는 넘파이 배열 메서드이다. 주의할 점은 크기가 바뀐 새로운 배열을 반환할 때 원본 배열에 있는 원소의 개수와 다르면 에러(ValueError)가 발생한다. 

 

원래 train_input의 크기는 (42, )인데, 이를 2차원 배열로 바꾸면 (42,1)이 된다. 따라서 reshape(42,1)라고 지정할 수 있지만, 넘파이는 배열의 크기를 자동으로 지정하는 기능도 제공한다. 위의 결과는 (42, 1) (14, 1) 이다.

 

3. k-Nearest Neighbor Regression Algorithm 구현

from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor()
knr.fit(train_input, train_target) #회귀 모델 훈련
print(knr.score(test_input,test_target))

KNeighborsRegressor : k-최근접 이웃 회귀 알고리즘을 구현할 클래스이다.

 

테스트 세트 점수

위의 결과에서 분류의 경우는 테스트 세트에 있는 샘플을 정확하게 분류한 개수의 비율, 즉 정확도(정답을 맞힌 개수의 비율)이다. 그러나 회귀에서는 예측하는 값이나 타깃 모두 임의의 수치이기 때문에 정확한 숫자를 맞힌다는 것은 거의 불가능하다. 그래서 회귀의 경우는 결정계수(Coefficient of Determination) 혹은 R²라고 부르는 점수를 이용한다. 

 

결정계수가 정확도처럼 얼마나 좋은지 이해하기는 어려우므로, 타깃과 예측한 값 사이의 차이를 구해 보면 어느 정도 예측이 벗어났는지 가늠할 수 있다. 사이킷런은 sklearn.metrics 패키지 아래 여러 가지 측정 도구를 제공한다.

from sklearn.metrics import mean_absolute_error
test_prediction = knr.predict(test_input) #테스트 세트에 대한 예측을 만듦
mae = mean_absolute_error(test_target,test_prediction) #테스트 세트에 대한 평균 절댓값 오차를 계산함
print(mae)

mean_absolute_error() : 타깃과 예측의 절댓값 오차를 평균하여 반환한다.

 

평균 절댓값 오차

예측이 평균적으로 19g 정도 타깃값과 다르다. 

 

앞에서 훈련한 모델을 사용해 훈련 세트의 결정계수를 확인해보자.

print(knr.score(train_input,train_target))

훈련 세트의 결정계수

테스트 세트를 사용한 점수와 비교하면 훈련 세트의 점수가 더 낮다. 훈련 세트에 모델을 훈련하면 훈련 세트에 잘 맞는 모델이 만들어지고, 보통은 훈련 세트의 점수가 더 높게 나온다. 그러나 위 결과는 테스트 세트 점수가 더 높다. 이는 과소적합되었다고 할 수 있다. 

 

이를 해결하려면 훈련 세트에 더 잘 맞게 모델을 복잡하게 만들면 된다. 복잡하게 만드는 것은 이웃의 개수 k를 줄이는 것이다. 이웃의 개수를 줄이면 국지적(한 지역에 한정된)인 패턴에 민감해지고, 이웃의 개수를 늘리면 데이터 전반에 있는 일반적인 패턴을 따를 것이다. 

knr.n_neighbors = 3 #이웃의 개수를 3으로 설정한다.
knr.fit(train_input, train_target) #모델을 다시 훈련한다.
print(knr.score(train_input, train_target)) #훈련 세트의 점수
print(knr.score(test_input, test_target)) #테스트 세트의 점수

사이킷런의 k-최근접 이웃 알고리즘의 기본 k값은 5이다. 따라서 n_neighbors 속성값을 3으로 바꾼다.

 

훈련 세트와 테스트 세트 결정계수

이전과 달리 테스트 세트가 훈련 세트보다 낮아졌으므로, 과소적합 문제를 해결했다고 볼 수 있다. 회귀 모델을 성공적으로 만들었다. 


문제점

길이가 50cm인 농어를 모델에 넣었을 때, 농어의 무게를 1,033kg라고 예측했다. 하지만 실제 농어의 무게는 이보다 훨씬 무겁다. 100cm인 농어도 마찬가지다. 문제가 된 이유는, 새로운 샘플이 훈련 세트의 범위를 벗어났기 때문이다. 

 

해결하기

1. LinearRegression Algorithm 구현

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(train_input,train_target) #선형 회귀 모델 훈련
print(lr.predict([[50]])) #50cm 농어 예측
print(lr.coef_,lr.intercept_)

coef_ : 기울기를 뜻하는 모델 파라미터이다. 머신러닝에서는 기울기를 종종 계수(coefficient) or 가중치(weight)라고 한다.

intercept_ : 절편을 뜻하는 모델 파라미터이다.

50cm 농어 무게

농어의 무게는 위와 같다. 선형 회귀는 y = a × x + b 를 계산한다. x는 농어의 길이, y는 농어의 무게다.

기울기와 절편

앞에서 구한 기울기와 절편을 이용해 농어의 길이 15에서 50까지 나타내는 직선을 그려보자.

plt.scatter(train_input, train_target)
#1차 방정식 그래프
plt.plot([15,50], [15*lr.coef_+lr.intercept_, 50*lr.coef_+lr.intercept_])
plt.scatter(50, 1241.8, marker='^') #농어 데이터
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

최적의 직선

길이가 50cm인 농어에 대한 예측이 직선의 연장선에 있으므로, 모델 훈련이 성공적으로 됐다.

 

모델을 평가해보자.

print(lr.score(train_input, train_target))
print(lr.score(test_input, test_target))

훈련/테스트 세트 결과

얼핏 보면 테스트 세트의 점수가 낮아 과대적합 되었다고 볼 수 있겠지만, 훈련 세트의 점수도 그리 높지 않아 과소적합이라고 할 수 있다. 문제가 뭘까? 실제로 농어의 무게가 0이 될 수가 없지만, 위 그래프의 좌측 하단을 보면 0에 가까워지는 걸 볼 수 있다. 따라서 직선이 아닌 곡선을 찾아야 한다.

 

2. Polynomial Regression Algorithm 구현하기

2차 방정식 그래프를 찾기 위해 훈련 세트에 제곱 항을 추가한다. 목표하는 값은 어떤 그래프를 훈련하든지 바꿀 필요가 없기 때문에 타깃 값은 그대로 사용한다.

train_poly = np.column_stack((train_input**2, train_input))
test_poly = np.column_stack((test_input**2, test_input))

column_stack() : 1차원 배열을 2차원 배열에 열로 쌓는다.

 

모델을 다시 훈련하자. (테스트 할 때는 모델에 농어 길이의 제곱과 원래 길이를 같이 넣어줘야 한다.)

lr = LinearRegression()
lr.fit(train_poly, train_target)
print(lr.predict([[50**2, 50]]))
print(lr.coef_, lr.intercept_)

 

농어 무게 예측

앞에서 훈련한 모델보다 더 높은 값을 예측했다. (앞에서는 1241이라고 예측)

계수와 절편

그래프를 그려보자.

point = np.arange(15,50)
plt.scatter(train_input, train_target)
plt.plot(point, 1.01*point**2 - 21.6*point + 116.05)

plt.scatter(50,1574, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

점수를 평가하자.

print(lr.score(train_poly, train_target))
print(lr.score(test_poly, test_target))

점수

훈련 세트와 테스트 세트의 점수가 높아진 것을 볼 수 있다. 그래도 테스트 세트의 점수가 높아서 과소적합이다. 


문제점

위에서 훈련 세트와 테스트 세트의 점수가 높아진 것을 볼 수 있다. 그래도 테스트 세트의 점수가 높아서 과소적합이다. 이를 해결하기 위해서는 고차항을 넣어야 한다. 특성이 많은 고차원에서는 선형 회귀가 매우 복잡한 모델을 표현할 수 있다.

 

해결하기

1. 데이터 준비하기

import pandas as pd
df = pd.read_csv('https://bit.ly/perch_csv_data') #판다스 데이터 프라임
perch_full = df.to_numpy() #to_numpy() 메서드 사용해서 배열로 변환함

pandas : 데이터 분석 라이브러리이다.

read_csv() : 판다스 데이터프레임이다. 데이터 프라임은 판다스의 핵심 데이터 구조이다.

 

판다스 데이터프라임을 만들기 위해 많이 사용하는 파일은 CSV 텍스트 파일이다. 위의 CSV 파일에 접속하면 생선의 길이, 높이, 두께까지 정리되어 있다. 데이터프라임을 이용해 불러온 파일을 넘파이 배열로 변환한다. 

 

타깃 데이터는 이전과 동일한 방식으로 준비하자.

import numpy as np
perch_weight = np.array([5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 110.0,
       115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 130.0,
       150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 197.0,
       218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 514.0,
       556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 820.0,
       850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 1000.0,
       1000.0])
#훈련 세트와 테스트 세트 나누기
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = 
                                   train_test_split(perch_full, perch_weight,random_state=42)

 

2. PolynomialFeatures Transformer 사용

#sklearn.preprocessing=패키지/PolynomialFeatures=변환기
from sklearn.preprocessing import PolynomialFeatures
#간단한 테스트
poly = PolynomialFeatures()
poly.fit([[2,3]])
print(poly.transform([[2,3]]))

 

 fit() : 새롭게 만들 특성 조합을 찾는 메서드이다. (변환기는 입력 데이터를 변환하는 데 타깃 데이터가 필요치 않다.)

transform() : 실제로 데이터를 변환하는 메서드이다.

변환 결과

2개의 특성(원소)를 가진 샘플이 6개의 특성을 가진 샘플로 바뀌었다. PolynomialFeatures 클래스는 기본적으로 각 특성을 제곱한 항을 추가하고 특성끼리 서로 곱항을 추가한다. 따라서 2와 3을 각각 제곱한 4와 9가 추가되었고, 두 특성을 곱한 6이 추가되었다. 그렇다면 1은 어디서 도출됐을까? 선형 방정식의 절편은 항상 값이 1인 특성과 곱해지는 계수이기 때문이다. [무게 = a × 길이 + b × 높이 + c × 두께 + d × 1] 사이킷런의 선형 모델이 자동으로 절편을 추가하므로 이렇게 특성을 만들 필요는 없다.

 

절편을 제거하자.

poly = PolynomialFeatures(include_bias=False) #절편을 위한 항이 제거됨
poly.fit([[2,3]])
print(poly.transform([[2,3]]))

 

절편을 위한 항을 제거

include_bias = False 를 지정하지 않아도 사이킷런 모델은 자동으로 특성에 추가된 절편 항을 무시한다.

 

이제 적용해보자.

poly = PolynomialFeatures(include_bias=False)
poly.fit(train_input)
train_poly = poly.transform(train_input)
print(train_poly.shape)
poly.get_feature_names_out()
#테스트 세트 변환
test_poly = poly.transform(test_input)

get_feature_names_out() : 특성이 각각 어떤 입력의 조합으로 만들어졌는지 알려 주는 메서드이다.

배열의 크기와 9개의 특성

※ 훈련(fit)을 해야 변환(transform)이 가능하다. 사이킷런의 일관된 api때문에 두 단계로 나뉘어져 있다. 두 메서드를 하나로 붙인 fit_transform 메서드도 있다.

 

3. Multiple Regression Algorithm 구현하기 (다중 회귀 모델 훈련)

※ 다중 회귀 모델 훈련은 선형 회귀 모델을 훈련하는 것과 같다.

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(train_poly, train_target)
print(lr.score(train_poly, train_target))
print(lr.score(test_poly, test_target))

 

훈련/테스트 세트 점수

특성을 추가하니 점수가 매우 높은 것을 알 수 있다. 테스트 세트 점수는 그리 높지는 않지만 과소적합은 아니다.

 

특성을 더 추가해보자.

poly = PolynomialFeatures(degree = 5, include_bias=False)
poly.fit(train_input)
train_poly = poly.transform(train_input)
test_poly = poly.transform(test_input)
print(train_poly.shape)

degree : 최대 차수를 지정하는 매개변수다.

train_poly 크기

5제곱 항을 지정했더니, 55개의  특성이 만들어졌다. (train_poly의 열의 개수가 특성의 개수이다.)

lr.fit(train_poly, train_target)
print(lr.score(train_poly, train_target))
print(lr.score(test_poly, test_target))

훈련/테스트 세트 점수

훈련 세트는 거의 완벽한 점수이지만, 테스트 세트는 아니다. 특성의 개수를 늘리면 선형 모델은 훈련 세트에 대해 거의 완벽하게 학습할 수 있지만, 훈련 세트에 과대적합이 된다. 이를 해결하려면, 규제를 해야 한다. 특성에 곱해지는 계수(또는 기울기)의 크기를 작게 만든다. 하지만, 특성의 스케일이 다르면 규제가 올바르게 되지 않는다. 따라서, 규제를 하기 전에 특성의 스케일을 정규화해야 한다. 2장에서는 평균과 표준편차를 직접 구해 표준점수로 변환했지만, 이 장에서는 변환기를 이용한다.

 

특성 스케일을 정규화하자.

#규제하기 전 정규화
from sklearn.preprocessing import StandardScaler
ss = StandardScaler() #객체 초기화
ss.fit(train_poly) 
train_scaled = ss.transform(train_poly) #표준점수로 변환
test_scaled = ss.transform(test_poly) #표준점수로 변환

정규화를 했으니 규제를 한다. 선형 회귀 모델에 규제를 추가한 모델을 릿지와 라쏘라고 한다. 2가지 모델을 사용해보자.

 

4. Ridge Regression

from sklearn.linear_model import Ridge
ridge = Ridge()
ridge.fit(train_scaled, train_target)
print(ridge.score(train_scaled, train_target))
print(ridge.score(test_scaled, test_target))

릿지 모델 점수

음수였던 테스트 세트의 점수가 좋아졌다. 많은 특성을 사용했음에도 훈련 세트에 과대적합 되지 않아 좋은 성능의 모델이 되었다. 하지만 훈련 세트의 점수가 낮아졌으니, 규제의 양을 직접 조절해서 계수 값을 줄이고 조금 더 과소적합되도록 유도한다. 방법은 모델 객체를 만들 때 alpha 매개변수로 규제의 강도를 조절하는 것이다.

 

alpha값에 대한 결정계수의 그래프를 그리면서 최적의 alpha값을 찾자.

import matplotlib.pyplot as plt
train_score = []
test_score = []
alpha_list = [0.001, 0.01, 0.1, 1, 10, 100]
for alpha in alpha_list:
  ridge = Ridge(alpha = alpha)
  ridge.fit(train_scaled, train_target)
  train_score.append(ridge.score(train_scaled, train_target))
  test_score.append(ridge.score(test_scaled, test_target))

alpha값을 10배씩 늘려가며 릿지 회귀 모델을 훈련한 후 훈련 세트와 테스트 세트의 점수를 리스트에 저장한다.

 

그래프를 그려보자.

plt.plot(np.log10(alpha_list), train_score)
plt.plot(np.log10(alpha_list), test_score)
plt.xlabel('alpha')
plt.ylabel('R^2')
plt.show()

log10() : 10을 밑으로 하는 상용로그로, 넘파이 로그 함수다.

log() : 자연 상수 e를 밑으로 하는 자연로그로, 넘파이 로그 함수다.

훈련 세트 그래프(파)와 테스트 세트 그래프(주)

좌측 그래프는 점수차가 커서 과대적합되었고, 우측 그래프는 점수가 모두 낮아 과소적합이 되었다. 두 그래프가 가장 가깝고 점수가 가장 높은 0.1(10의 -1승)이 적절한 alpha값이다.

 

0.1을 이용해 최종 모델을 훈련하자.

ridge = Ridge(alpha = 0.1)
ridge.fit(train_scaled, train_target)
print(ridge.score(train_scaled, train_target))
print(ridge.score(test_scaled, test_target))

릿지 모델 최종 점수

두 점수 모두 높고, 과대/과소 적합이 아닌 적절한 균형이 됐다. 이로써, 성능이 좋은 릿지 회귀 모델을 만들었다.

 

5. Lasso Regression

라쏘 모델을 훈련하는 방법은 릿지 클래스를 라쏘 클래스로 바꾸기만 하면 된다.

from sklearn.linear_model import Lasso
lasso = Lasso()
lasso.fit(train_scaled, train_target)
print(lasso.score(train_scaled, train_target))
print(lasso.score(test_scaled, test_target))

 

라쏘 모델 점수

과대/과소적합 되지 않고 적절하게 균형을 이룬 점수가 나온 것을 볼 수 있다.

 

alpha값에 대한 결정계수의 그래프를 그리면서 최적의 alpha값을 찾자.

train_score = []
test_score = []
alpha_list = [0.001, 0.01, 0.1, 1, 10, 100]
for alpha in alpha_list:
  lasso = Lasso(alpha = alpha, max_iter = 10000)
  lasso.fit(train_scaled, train_target)
  train_score.append(lasso.score(train_scaled, train_target))
  test_score.append(lasso.score(test_scaled, test_target))

그래프를 그려보자.

plt.plot(np.log10(alpha_list), train_score)
plt.plot(np.log10(alpha_list), test_score)
plt.xlabel('alpha')
plt.ylabel('R^2')
plt.show()

훈련 세트 그래프(파)와 테스트 세트 그래프(주)

좌측은 과대적합이고, 우측은 점수가 좁혀지고 있다. 라쏘 모델의 최적의 alpha값은 10(10의 1승)이다.

 

10을 이용해 최종 모델을 훈련하자.

lasso = Lasso(alpha = 10)
lasso.fit(train_scaled, train_target)
print(lasso.score(train_scaled, train_target))
print(lasso.score(test_scaled, test_target))

라쏘 모델 최종 점수

릿지와 마찬가지로 성능이 좋은 라쏘 회귀 모델을 만들었다.

'혼공 > 머신러닝' 카테고리의 다른 글

2장 데이터 다루기  (0) 2022.07.22
1장 머신러닝이란?  (0) 2022.07.08