본문 바로가기

머신러닝

[머신러닝] 선형회귀분석 과제 실습

과제: Boston 주택 가격 Linear Regression 예측

  • Boston 주택 가격 데이터셋을 사용하여 주택 가격을 예측하는 회귀 모델을 만드세요.
  • Linear Regeression을 사용하세요
  • MSE로 성능을 평가하세요
  • 아래와 같이 데이터를 불러오세요
from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()
X, y = housing['data'], housing['target']

 

 


 

위 과제에선 전처리를 하지 않아도 된다는 조건이 있었으므로 

단순히 선형회귀분석 사이클을 돌려보는 연습을 한다는 마음으로 복습부터 시작했다. 

 

1. 데이터 프레임 생성하기

# 주어진 데이터
housing.data
housing.target

# data 데이터프레임화하기
housing_data_df = pd.DataFrame(data=housing.data, columns=housing.feature_names)
housing_data_df.info()

# target 데이터프레임화하기
housing_target_df = pd.DataFrame(data=housing.target, columns=housing.target_names)
housing_target_df.info()

# CONCAT 활용해 housing 데이터프레임 생성하기
housing_df = pd.concat([housing_data_df, housing_target_df], axis=1)
housing_df.head(3)

 

housing_df에서 MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude 중 MedHouseVal(종속변수)와 선형 관계가 있는 독립변수(들)을 찾아 선형회귀분석을 실행하면 된다. 

 

 

2. 선형 관계 확인하기 - seaborn 활용해 pairplot 그려보기

 

사실 내가 예상한 아름다운 선형 관계를 보여주는 컬럼은 없었지만, 

굳이 하나 꼽자면 MedInc이 선형 관계를 보여주고 있으므로 독립변수, 종속변수를 설정하고 가설을 세워준다. 

 

 

3. 변수 확립 후 가설 세우기

  • 독립변수 = MedInc
  • 종속변수 = MedHouseVal
  • 귀무가설: MedHouseVal은 MedInc에 영향을 받지 않을 것이다. 
  • 대립가설: MedHouseVal은 MedInc에 영향을 받을 것이다. 

 

4. 테스트-트레인 데이터 분류 (3:7)

 

문제에서 주어진 대로 3:7의 비율로 테스트-트레인으로 데이터를 분류해 선형회귀모델에 트레인 데이터를 학습시킨다. 

# 변수 할당하기
X=housing_df[['MedInc']]
y=housing_df[['MedHouseVal']]

# 테스트-트레인 분류
X_train, X_test, y_train, y_test = train_test_split(housing_df[['MedInc']], housing_df[['MedHouseVal']], 
                                                    test_size=0.3, shuffle=True, random_state=42)

 

 

5. 선형회귀모델 학습 및 예측

 

# 선형회귀모델 불러오기
from sklearn.linear_model import LinearRegression
model_lr = LinearRegression()

# 모델 학습시키기
model_lr.fit(X_train,y_train)

# 학습한 모델에 테스트값 넣어 예측하기
y_pred=model_lr.predict(X_test)

 

6-1. 검정 - MSE, r2 score

 

위 선형회귀모델이 얼마나 정확도를 가지는지 검정한다. 

from sklearn.metrics import mean_squared_error, r2_score
print('MSE 값:', mean_squared_error(y_true, y_pred))
print('r2 값:', r2_score(y_true, y_pred))

 

MSE 값: 0.6917979868048499

r2 값: 0.47293192589970245

 

6-2. 검정 - OLS

import statsmodels.api as sm
results = sm.OLS(y, sm.add_constant(X)).fit()
results.summary()

 

 

7. 검정 해석하기 

① MSE: MSE값이 낮을수록 모델의 예측이 실제값에 더 가깝다는 것을 의미 

    약 0.69

⇒ 다른 변수 4개를 넣고 분석했을 때 약 1.14가 나왔으므로 이와 비교해서는 예측이 실제값에 더 가깝다는 것을 알 수 있음. 

 

② r2 score: 모델의 설명력을 보여주는 지표로 0과 1사이의 값을 가지며 1에 가까울수록 믿을 수 있다고 판단

   약 0.47

⇒ 다른 변수 4개를 넣고 분석했을 때 약 0.12가 나왔으므로 이와 비교해서는 예측이 실제값에 더 가깝다는 것을 알 수 있음. 

 

③ Prob(f-statistic): f-검정 p-value 값으로 도출된 회귀식이 회귀분석모델 전체에 대해 통계적으로 의미가 있는지 파악

  0 

⇒ 0.05보다 작으므로 신뢰 가능

 

④ P>|t|: t-검정 p-value 값으로 각 변수가 종속변수에 미치는 영향이 유의한지 파악

  0

⇒ 0.05보다 작으므로 신뢰 가능

 


 

선형회귀모델 복습하면서 과제 2번 끝냈다. 

아무것도 모르는 상태에서 기본 프로세스를 아는 상태가 된 것같아 뿌듯하다. 

전처리, 정규화, 과적합 여부 판단 등 더 정확한 분석을 하기 위해 거쳐야할 과정들은 많지만..