2. Multiple Linear Regression(다중 선형 회귀)¶
원-핫 인코딩¶
In [1]:
import pandas as pd
In [2]:
dataset = pd.read_csv('../data/MultipleLinearRegressionData.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
dataset.head()
Out[2]:
hour | absent | place | score | |
---|---|---|---|---|
0 | 0.5 | 3 | Home | 10 |
1 | 1.2 | 4 | Library | 8 |
2 | 1.8 | 2 | Cafe | 14 |
3 | 2.4 | 0 | Cafe | 26 |
4 | 2.6 | 2 | Home | 22 |
In [19]:
X, y
Out[19]:
(array([[1.0, 0.0, 0.5, 3],
[0.0, 1.0, 1.2, 4],
[0.0, 0.0, 1.8, 2],
[0.0, 0.0, 2.4, 0],
[1.0, 0.0, 2.6, 2],
[1.0, 0.0, 3.2, 0],
[0.0, 1.0, 3.9, 0],
[0.0, 1.0, 4.4, 0],
[1.0, 0.0, 4.5, 5],
[0.0, 0.0, 5.0, 1],
[0.0, 0.0, 5.3, 2],
[0.0, 0.0, 5.8, 0],
[0.0, 1.0, 6.0, 3],
[0.0, 0.0, 6.1, 1],
[0.0, 1.0, 6.2, 1],
[1.0, 0.0, 6.9, 4],
[0.0, 0.0, 7.2, 2],
[1.0, 0.0, 8.4, 1],
[0.0, 1.0, 8.6, 1],
[0.0, 1.0, 10.0, 0]], dtype=object),
array([ 10, 8, 14, 26, 22, 30, 42, 48, 38, 58, 60, 72, 62,
68, 72, 58, 76, 86, 90, 100], dtype=int64))
In [4]:
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(drop='first'), [2])], remainder='passthrough')
X = ct.fit_transform(X) # 범주형 데이터를 변환하고 학습
X
# remainder='passthrough' 범주형 데이터 외에 나머지는 그대로 유지
# remainder='drop' : 변환되지 않은 열들을 삭제
# 1 0 : Home
# 0 1 : Library
# 0 0 : Cafe
Out[4]:
array([[1.0, 0.0, 0.5, 3],
[0.0, 1.0, 1.2, 4],
[0.0, 0.0, 1.8, 2],
[0.0, 0.0, 2.4, 0],
[1.0, 0.0, 2.6, 2],
[1.0, 0.0, 3.2, 0],
[0.0, 1.0, 3.9, 0],
[0.0, 1.0, 4.4, 0],
[1.0, 0.0, 4.5, 5],
[0.0, 0.0, 5.0, 1],
[0.0, 0.0, 5.3, 2],
[0.0, 0.0, 5.8, 0],
[0.0, 1.0, 6.0, 3],
[0.0, 0.0, 6.1, 1],
[0.0, 1.0, 6.2, 1],
[1.0, 0.0, 6.9, 4],
[0.0, 0.0, 7.2, 2],
[1.0, 0.0, 8.4, 1],
[0.0, 1.0, 8.6, 1],
[0.0, 1.0, 10.0, 0]], dtype=object)
다중공선성(Multicollinearity)이란?¶
다중공선성은 하나의 변수를 다른 변수로 예측할 수 있는 경우 발생합니다. 즉, 어떤 변수들이 서로 완전히 또는 부분적으로 상관관계를 가지면, 모델이 이들 간의 상관성을 해석하기 어려워집니다. 예를 들어, 세 가지 범주를 모두 인코딩하면 해당 열의 값을 합산하여 마지막 범주를 예측할 수 있는 상황이 생기므로 다중공선성이 발생합니다.
예시:
Apple과 Banana 열이 0이면, Orange 열은 자동으로 1이어야 합니다. 이는 모델이 하나의 변수를 다른 변수들로 예측할 수 있게 만들므로 다중공선성을 유발합니다.
drop='first'의 역할: drop='first' 옵션은 이 문제를 방지하기 위해 원-핫 인코딩 시 첫 번째 범주를 제거합니다. 즉, 첫 번째 범주는 자동으로 나머지 범주에 의해 유추될 수 있으므로 굳이 포함하지 않아도 됩니다. 위 예시에서 'Apple'을 제거한 후 원-핫 인코딩하면 다음과 같이 변환됩니다:
데이터 세트 분리¶
In [5]:
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)
학습 (다중 선형 회귀)¶
In [6]:
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X_train, y_train)
Out[6]:
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
LinearRegression()
예측 값과 실제 값 비교 (테스트 세트)¶
In [7]:
y_pred = reg.predict(X_test)
y_pred
Out[7]:
array([ 92.15457859, 10.23753043, 108.36245302, 38.14675204])
In [8]:
y_test
Out[8]:
array([ 90, 8, 100, 38], dtype=int64)
- reg.coef_은 각 독립 변수의 기여도를 나타내며, 모델이 학습한 변수 간의 관계를 보여줍니다. reg.coef_에서 절대값이 클수록 해당 독립 변수가 종속 변수에 더 큰 영향을 미칩니다. 계수의 부호(양수/음수)는 변화 방향을 나타낼 뿐, 영향력의 크기는 절대값을 기준으로 판단합니다.
- reg.intercept_는 모든 독립 변수가 0일 때 예측되는 종속 변수의 값입니다.
In [9]:
reg.coef_
# ('Home', 'Library', 공부시간, 결석)
# 'Cafe' 가 drop 됐음으로 'Cafe' 가 기준이 되어 나머지 데이터가 그에 대한 비교로 나타남
# 'Cafe' 의 회귀계수는 0임
Out[9]:
array([-5.82712824, -1.04450647, 10.40419528, -1.64200104])
In [10]:
reg.intercept_
Out[10]:
5.365006706544733
모델 평가¶
In [11]:
reg.score(X_train, y_train) # 훈련 세트
Out[11]:
0.9623352565265528
In [12]:
reg.score(X_test, y_test) # 테스트 세트
Out[12]:
0.9859956178877445
다양한 평가 지표 (회귀 모델)¶
- MAE (Mean Absolute Error) : (실제 값과 예측 값) 차이의 절대값
- MSE (Mean Squared Error) : (실제 값과 예측 값) 차이의 제곱
- RMSE (Root Mean Squared Error) : (실제 값과 예측 값) 차이의 제곱에 루트
- R2 : 결정 계수
R2 는 1에 가까울수록, 나머지는 0에 가까울수록 좋음
In [13]:
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_test, y_pred) # 실제 값, 예측 값 # MAE
Out[13]:
3.225328518828811
In [14]:
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, y_pred) # MSE
Out[14]:
19.90022698151514
In [15]:
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, y_pred, squared=False) # RMSE
C:\Users\ysh\anaconda3\Lib\site-packages\sklearn\metrics\_regression.py:483: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.
warnings.warn(
Out[15]:
4.460967045553591
In [16]:
from sklearn.metrics import r2_score
r2_score(y_test, y_pred) # R2
Out[16]:
0.9859956178877445
'Python > SikitLearn' 카테고리의 다른 글
05. (비지도학습)_K-Means (0) | 2024.11.23 |
---|---|
04. (지도학습)_Logistic Regression(로지스틱 회귀) (0) | 2024.11.23 |
03. (지도학습)_Polynomial Regression(다항 회귀) (0) | 2024.11.23 |
01. (지도학습)_Linear Regression(선형 회귀) (0) | 2024.11.23 |