Polynomial Regression 실습
- 선형 그래프가 나오지 않는 상황에서, 새로운 특성 집합을 생성하여 다항 그래프를 만든다
- 다항식을 치환해서, Linear Regression으로 만들 수 있다
실습 준비
df = pd.read_csv("FuelConsumption.csv")
# take a look at the dataset
df.head()
생성된 데이터 프레임을 5줄 출력해봅니다
데이터 프레임이 잘 생성 된 것을 볼 수 잇습니다.
그렇다면, 회귀 모델에 사용할 필드로 새로운 데이터 프레임을 형성합니다.
다시 한번, 데이터 프레임을 출력해봅니다
cdf = df[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB','CO2EMISSIONS']]
cdf.head(9)
엔진 크기와 CO2 소비로 그래프를 그려봅시다
plt.scatter(cdf.ENGINESIZE, cdf.CO2EMISSIONS, color='blue')
plt.xlabel("Engine size")
plt.ylabel("Emission")
plt.show()
그래프가 잘 그려졌고, 나름 선형 그래프로? 보이는군요
정말 선형 모델인지 확인해 봅시다
Test 데이터 생성
msk = np.random.rand(len(df)) < 0.8
train = cdf[msk]
test = cdf[~msk]
훈련 테스트 분할(Train Test Split) 기법으로 테스트 데이터를 생성합니다.
Polynomial Regression (다항 회귀)
그래프가 완전한 선형이 아니고, 곡선의 형태를 가지면, 다항 회귀 방법을 사용 할 수 있습니다.
다항 회귀 즉 Polynomial Regression은 독립 변수 x와 종속 변수 y의 관계를 x의 n차 다항식으로 모델링합니다.
예를 들어, 2차 다항식 회귀를 사용하려면 다음과 같은 방정식을 가정할 수 있습니다
그렇다면 문제는 x 값인 엔진 크기와 같은 데이터를 이 방정식에 어떻게 맞출 수 있는지입니다.
이를 위해 추가적으로 theta 1, x, x^2
과 같은 특성을 생성합니다
from sklearn.preprocessing import PolynomialFeatures
from sklearn import linear_model
train_x = np.asanyarray(train[['ENGINESIZE']])
train_y = np.asanyarray(train[['CO2EMISSIONS']])
test_x = np.asanyarray(test[['ENGINESIZE']])
test_y = np.asanyarray(test[['CO2EMISSIONS']])
poly = PolynomialFeatures(degree=2)
train_x_poly = poly.fit_transform(train_x)
train_x_poly
Scikit-learn 라이브러리의 PolynomialFeatures() 함수는 원래의 특성 집합에서 새로운 특성 집합을 생성합니다.
이는 지정된 차수 이하의 모든 다항식 조합으로 구성된 행렬이 생성됩니다.
예를 들어, 원래의 특성 집합에는 엔진 크기(ENGINESIZE)라는 하나의 특성만 있다고 가정해 봅시다.
이제 2차 다항식을 선택하면, degree=0, degree=1, degree=2로 3개의 특성이 생성됩니다
fit_transform은 x 값들을 입력으로 받아서 0부터 2의 거듭제곱까지의 값을 가진 데이터 리스트를 출력합니다
(다항식의 차수를 2로 설정했기 때문입니다).
아래의 방정식과 예시를 확인해보세요.
다항 회귀 - 선형 회귀로 푸는 방법
다항식 회귀 모델은 Multiple Linear Regression의 특징 세트와 유사한 구조를 가지고 있습니다.
실제로, 다항식 회귀는 [[Linear Regression]]의 특수한 경우로, 주요 아이디어는 어떻게 특징을 선택하느냐에 있습니다.
단지
이제 이것을 ‘선형 회귀’ 문제로 다룰 수 있습니다.
따라서, 선형 회귀와 동일한 방법을 사용하여 이러한 문제를 해결할 수 있습니다.
clf = linear_model.LinearRegression()
train_y_ = clf.fit(train_x_poly, train_y)
# The coefficients
print ('Coefficients: ', clf.coef_)
print ('Intercept: ',clf.intercept_)
Coefficients: [[ 0. 50.89469036 -1.52813537]]
Intercept: [105.71556316]
앞서 언급한 대로, **계수(Coefficient)**와 절편(Intercept) 은 곡선에 맞는 선형 회귀의 매개변수입니다.
이제 그래프를 그릴 수 있습니다! 확인해보죠
plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue') # 훈련 데이터셋의 엔진 크기와 이산화탄소 배출량을 산점도로 표시 (파란색)
XX = np.arange(0.0, 10.0, 0.1) # 0부터 10까지 0.1 간격으로 X 범위 생성
yy = clf.intercept_[0] + clf.coef_[0][1]*XX + clf.coef_[0][2]*np.power(XX, 2) # 예측된 Y값 계산
plt.plot(XX, yy, '-r') # 예측된 곡선을 빨간색 선 그래프로 표시
plt.xlabel("Engine size") # x축 레이블 설정
plt.ylabel("Emission") # y축 레이블 설정
평가
from sklearn.metrics import r2_score
test_x_poly = poly.transform(test_x) # 테스트 데이터의 다항식 특징 변환
test_y_ = clf.predict(test_x_poly) # 다항 회귀 모델을 사용하여 테스트 데이터에 대한 예측값 계산
print("Mean absolute error: %.2f" % np.mean(np.absolute(test_y_ - test_y))) # 평균 절대 오차 출력
print("Residual sum of squares (MSE): %.2f" % np.mean((test_y_ - test_y) ** 2)) # 잔차 제곱의 합 (MSE) 출력
print("R2-score: %.2f" % r2_score(test_y, test_y_)) # R2 스코어 출력
test_x_poly = poly.transform(test_x)
- 테스트 데이터의 다항식 특징 변환을 수행합니다.
- 이는 다항 회귀 모델에 적합한 형식으로 테스트 데이터의 특징을 변환합니다.
test_y_ = clf.predict(test_x_poly)
- 다항 회귀 모델을 사용하여 테스트 데이터에 대한 예측값을 계산합니다.
np.mean(np.absolute(test_y_ - test_y))
- 예측값과 실제값의 평균 절대 오차(Mean Absolute Error)를 계산하여 출력합니다.
np.mean((test_y_ - test_y) ** 2)
- 평균 제곱 오차 (Mean Squared Error, MSE)를 계산하여 출력합니다.
r2_score(test_y, test_y_)
- 예측값과 실제값을 사용하여 R2 스코어를 계산하여 출력합니다.
- R2 스코어는 회귀 모델의 설명된 분산의 비율을 나타내며, 높을수록 모델의 성능이 좋음을 나타냅니다
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'AI' 카테고리의 다른 글
Classification (0) | 2023.07.07 |
---|---|
Non-Linear Regression 실습 (0) | 2023.07.06 |
Non-Linear Regression (0) | 2023.07.06 |
Multiple Linear Regression 실습 (0) | 2023.07.06 |
Multiple Linear Regression (0) | 2023.07.06 |