세조목

머신러닝 - 단순&다중선형회귀(24.01.30) 본문

데이터 분석 공부/머신러닝

머신러닝 - 단순&다중선형회귀(24.01.30)

세조목 2024. 1. 31. 00:18

단순선형회귀

1. LinearRegression 함수 가져오기

from sklearn.linear_model import LinearRegression

 

2. 독립변수, 종속변수 준비

X = body_df[['weight']]
y = body_df[['height']]


3. 학습시키기

model_lr = LinearRegression()
model_lr.fit(X=X, y=y)


4. 가중치 & 편향 구하고 변수에 넣기

w1 = model_lr.coef_[0][0] <- 가중치
w0 = model_lr.intercept_[0] <- 편향


5. 선형회귀식 출력

print('y={}x + {}'.format(w1.round(2), w2.round(2)))
 → y = 0.86x + 109.37


6. MSE(Mean Squared Error) 구하기

 1) 에러값(실제값 - 예측값) 각각 계산하기
 2) 에러값 제곱(for 음수 제거)
 3) 모두 더하고 평균 구하기(= MSE 구하기)

 

 1) 에러값(실제값 - 예측값) 각각 계산하기

body_df['pred'] = body_df['weight'] * w1 + w0 <- 예측값 계산
body_df['error'] = body_df['height] - body_df['pred] <- 에러값 구하기

 

2) 에러값 제곱(for 음수 제거)

body_df['error^2'] = body_df['error'] * body_df['error']

 

3) 모두 더하고 평균 구하기

body_df['error^2'].sum() / len(body_df)
>>> 10.152939045376309

 

7. 산점도 그래프와 선 그래프로 표현하기

sns.scatterplot(data = body_df, x='weight', y='height')
sns.lineplot(data = body_df, x='weight', y='pred', color = 'red')

 

8. 선형회귀 모델 평가

1) 라이브러리 import

from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score

또는

from sklearn.metrics import mean_squared_error, r2_score

 

2) MSE와 r2_score 구하기

 

MSE는 앞에서 살펴본것과같이

  1. 예측값을 바탕으로 오류값 구하고
  2. 제곱해서
  3. 평균 구하면 되지만
y_true = body_df['height']
y_pred = body_df['pred']
mean_squared_error(y_true, y_pred)

실제값은 y_true 변수에,

예측값은 y_pred 변수에

넣어준 후

mean_squared_error(y_true, y_pred)

함수를 사용해서 구할수도 있음

MSE가 0에 가까울수록 추측한 값이 원본에 가까운 것이기 때문에 정확도가 높다고 할 수 있다.

 

MSE를 구할 수 있는 방법이 한 가지 더 있는데 predict 메서드를 활용하는 것이다.

predict 메서드는 예측값을 구해주는 함수로

y_pred2 = model_lr.predict(body_df[['weight']])
>>> array([[184.40385835],
       [179.22878362],
       [180.09129608],
       [188.71642061],
       [186.99139571],
       [161.97853455],
       [183.54134589],
       [166.29109682],
       [168.87863418],
       [168.87863418]])

위와 같이 배열 형태로 출력된다.

앞에서와 마찬가지로 mean_squared_error 함수를 사용하면 MSE를 구할 수 있다.

mean_squared_error(y_true, y_pred2)
>>> 10.152939045376309

 

그래서 MSE를 구하는 방법은 총 세가지로 정리할 수 있다.

1. body_df['error^2'].sum() / len(body_df)

2. mean_squared_error(y_true, y_pred)
 * 예측값을 나타내는 pred컬럼을 별도로 만들어준 후 mean_squared_error 함수 사용

3. mean_squared_error(y_true, y_pred2)
  * LinearRegression() 함수의 predict 메서드 사용해서 예측값 구하고, mean_squared_error 함수 사용

 

r2_score

r2_score(y_true, y_pred)
>>> 0.8899887415172141

로 구할 수 있음

r2_score는 0과 1 사이에 존재하며

1에 가까울수록 모델이 데이터를 완벽하게 설명한다는 것을 의미한다.

 

 

다중선형회귀

독립변수를 2개 이상 넣고싶을때는

다중선형회귀를 사용하면 된다.

 

1. dataset 불러오기

tips_df = sns.load_dataset('tips')

 * seaborn 라이브러리에서 자체적으로 제공하는 dataset 中 'tips' 를 사용한다

 

2. 인코딩(sex 컬럼 값을 0 또는 1로 바꾸기)

def get_sex(x):
	if x == 'Female':
    	return 0
    else:
    	return 1

 

3. 인코딩한 컬럼 추가하기

tips_df['sex_en'] = tips_df['sex'].apply(get_sex)

 

4. 독립 변수 & 종속 변수 지정

X = tips_df[['total_bill', 'sex_en']]
y = tips_df[['tip']]

 

5. 모델 학습시키기

model_rl3 = LinearRegression()
model_rl3.fit(X,y)

 

6. 예측값 구하기

y_pred_tip2 = model_rl3.predict(X)
>>> array([[2.70463616],
       [2.00622312],
       [3.12683472],
       [3.40725019],
       [3.5028225 ]])

 

7. MSE & r2 score 단순선형회귀, 다중선형회귀 비교

1) MSE

# 단순선형회귀
mean_squared_error(y_true_tip, y_pred_tip)
>>> 1.036019442011377

# 다중선형회귀
mean_squared_error(y_true_tip, y_pred_tip2)
>>> 1.0358604137213614

 

2) r2 score

# 단순선형회귀
r2_score(y_true_tip, y_pred_tip)
>>> 0.45661658635167657

# 다중선형회귀
r2_score(y_true_tip, y_pred_tip2)
>>> 0.45669999534149974