본문 바로가기
개발/머신러닝-딥러닝

2023.06.08 ML(머신러닝)의 선형회귀, 평기지표, log활용

by 상달군 2023. 6. 12.
728x90

1.Rent 데이터셋 살펴보기

2.선형회귀(Linear Regression)

3.평가 지표 만들기

  • 3-1.MSE(Mean Squared Error)
  • 3-2.MAE(Mean Absolute Error)
  • 3-3.RMSE(Root Mean Squared Error)
  • 3-4.평가지표 적용하기

4.log활용하기

 


5.선형 회귀.ipynb


1.Rent 데이터셋 살펴보기

🎈실습 !!

 - 미국 부동산 데이터셋을 이용한 실습을 진행 하겠습니다. 

 

🔻 모듈과 데이터셋 불러오기 

import numpy as np
import pandas as pd
import seaborn as sns

rent_df = pd.read_csv('/content/drive/MyDrive/7.머신러닝 딥러닝/실습데이터/rent.csv')
rent_df

🔻 데이터 확인하기 

# 데이터의 정보 확인하기
rent_df.info()

데이터 칼럼 알아보기

  • Posted On: 매물 등록 날짜
  • BHK: 베드, 홀, 키친의 개수
  • Rent: 렌트비
  • Size: 집 크기
  • Floor: 총 층수 중 몇층
  • Area Type: 공용공간을 포함하는지, 집의 면적만 포함하는지
  • Area Locality: 지역
  • City: 도시
  • Furnishing Status: 풀옵션 여부
  • Tenant Preferred: 선호하는 가족형태
  • Bathroom: 화장실 개수
  • Point of Contact: 연락할 곳

🔻 우리가 사용할 데이터를 한번 확인 해봅시다. 

# 막대 그래프 그리기
sns.displot(rent_df['Rent'])

👀🗨Rent의 값을 막대그래프로 그려 보니 뭔가 분포도가 이상한거 같습니다. 

 

👀 'Rent'의 값을 한번 순서대로 뽑아 보겠습니다. 

rent_df['Rent'].sort_values()

🗨 'Rent'의 값을 뽑아보니 1200~ 3500000인것을 확인 할수 있습니다. 

 

👀 null값 확인하기 

# sum()으로 null값 확인하기 
rent_df.isna().sum()

 

# mean()으로 null값 확인해보기 
rent_df.isna().mean()

🔻결측치가 있는 열 삭제 하기 

# 결측치가 있는 열을 삭제 (df에 결과를 저장은 하지 않고 확인만)
# 1의 의미는 "na가 있는 열을 삭제 해라" 
rent_df.dropna(1) # BHK, Size 열이 모두 삭제 , rent_df.drop('BHK', axis=1)

🔻결측치 처리 하기 

# 결측치 처리 하기 
# 1. 결측 데이터가 전체 데이터에 비해 양이 굉장히 적을 경우 삭제하는 것도 방법
# 2. 결측치에 데이터를 채울 경우 먼저 boxplot을 확인하는 것이 좋음 

sns.boxplot(y=rent_df['Size'])

👀boxplot을 확인 후 mean 보다는 median을 사용하는게 좋다고 판단 됩니다. 

# boxplot을 확인 후 mean 보다는 median을 사용하는게 좋다고 판단 됩니다. 
rent_df.fillna(rent_df.median()).loc[na_index]

na_index = rent_df[rent_df['BHK'].isna()].index
na_index

rent_df['BHK'].fillna(rent_df['BHK'].median()).loc[na_index]

rent_df = rent_df.fillna(rent_df.median())

rent_df.isna().mean()

🔻 원 핫 인코딩 하기전 데이터를 한번 봅시다. 

# 원 핫 인코딩을 해보자 ~
rent_df.info()

🔻  "Area Type"은 텍스트 형태숫자형태라벨인코딩 하겠습니다. 

# Area Type은 텍스트 형태이기 때문에 모델에서 계산을 할 수 없다.
# 라벨 인코딩을 통해 숫자로 변경 해주어야 합니다. 
rent_df['Area Type'].value_counts()

🔻중복값 제거후 확인

# 중복값 제거후 확인하는방법
rent_df['Area Type'].unique()

🔻 nunique()를 이용하여 유니크한 종류의 개수 구하기 !

# 유니크한 종류의 개수 구하기 !
rent_df['Area Type'].nunique()

🔻위에서 사용한 유니크한 종류 개수를 다른 칼럼들도 구해 보겠습니다. 

Floor

Area Type 

Area Locality

City

Furnishing Status

Tenant Preferred

Point of Contact 

for i in ['Floor', 'Area Type', 'Area Locality', 'City', 'Furnishing Status', 'Tenant Preferred', 'Point of Contact']:
    print(i, rent_df[i].nunique())

🔻불필요한 칼럼 삭제 하기 

# 중요하지 않은 컬럼들 지우기 'Posted On', 'Floor', 'Area Locality', 'Tenant Preferred', 'Point of Contact'
rent_df.drop(['Posted On', 'Floor', 'Area Locality', 'Tenant Preferred', 'Point of Contact'], axis=1, inplace=True)

🔻 X에 독립변수 저장, y에 종속 변수 저장 

X = rent_df.drop('Rent', axis =1) #  독립변수
y = rent_df['Rent'] # 종속변수

🔻학습을 시키기 위해서 자료 준비 

from sklearn.model_selection import train_test_split

#위에서 저장한 X(독립변수)와 y(종속변수)를 넣어 줍니다. 
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2, random_state=10)

#train을 shape로 갯수 확인 
X_train.shape, y_train.shape
X_test.shape, y_test.shape


2.선형회귀(Linear Regression)

 

  • 데이터를 통해 가장 잘 설명할 수 있는 직선으로 데이터를 분석 하는 방법을 '선형회귀'라 한다.
    • 단순 선형 회귀 분석(단일 독립변수를 이용)
    • 다중 선형 회귀 분석(다중 독립변수를 이용)

# LinearRegression 사용하기
from sklearn.linear_model import LinearRegression

# 객체 생성
lr = LinearRegression()

# 학습시키기
lr.fit(X_train, y_train)

🔻 pred에 예측 담기

pred = lr.predict(X_test)

3.평가 지표 만들기

  • 3-1.MSE(Mean Squared Error)
  • 3-2.MAE(Mean Absolute Error)
  • 3-3.RMSE(Root Mean Squared Error)
  • 3-4.평가지표 적용하기

3-1.MSE(Mean Squared Error)

  • 평균 제곱근 오차
  • 예측값과 실제값의 차이에 대한 제곱에 대해 평균을 낸 값


🔻MSE(Mean Squared Error)

# MSE를 사용하기 위해 실제값 말고 우리가 그냥 값을 만들어 테스트

p = np.array([3,4,5]) # 예측값
act = np.array([1,2,3]) # 실제값

def my_mse(pred, actual):
  return ((pred - actual) **2 ).mean()

🔻 위에서 만든 my_mse함수 사용하기 

 

# 숫자의 의미는 없다
# 선이 여러개 그어졌을때 서로의 선의 비교대상으로만 사용하면 된다. 
my_mse(p, act)

🗨결과값으로 나온 숫자는 의미 없다. 


3-2.MAE(Mean Absolute Error)

  • 예측값과 실제값의 차이에 대한 절대값에 대해 평균을 낸 값


# MAE함수 만들기
def my_mae(pred, actual):
  return np.abs(pred - actual).mean()
 
#함수 사용 
my_mae(p,act)


3-3.RMSE(Root Mean Squared Error)

  • 예측값과 실제값의 차이에 대한 제곱에 대해 평균을 낸 후 루트를 씌운 값


🔻 numpy를 이용하여 제곱근후 RMSE만들기 

# np.sqrt 제곱근
def my_rmse(pred, actual):
  return np.sqrt(my_mse(pred, actual))
  
# my_rmse함수사용 
my_rmse(p,act)

 


🔻 라이브러리를 사용하여 모두 출력 해보기 

# MAE, MSE 라이브러리 사용
from sklearn.metrics import mean_absolute_error, mean_squared_error

# MAE
mean_absolute_error(p,act)

# MSE
mean_squared_error(p, act)

#RMSE
mean_squared_error(p, act, squared=False)

 

3-4.평가지표 적용하기

🔻적용하기

 

# 우리가 선형회귀에서 구한 값을 적용해보자
mean_squared_error(y_test, pred)

# MAE
mean_absolute_error(y_test, pred)

🔻이상치 제거 

# 이상치가 존재 하기때문에 오차율이 높게 나타는거 같아서
# 1837은 위에서 3500000 값을 가진 이상치 
X_train.drop(1837, inplace=True)
y_train.drop(1837, inplace=True)

# 이상치 삭제후 다시 학습시키기
lr.fit(X_train, y_train)

🔻예측하기

# 예측선 그리기# 예측을 합니다.
pred = lr.predict(X_test)

🔻오차율 확인해보기 

mean_squared_error(y_test, pred, squared=False)
# index 1837 지우기 전 : 41438.9403701652
# index 1837 지우기 후 : 41377.57030234839 
# 이상치를 하나 지웠다고 오차가 61.37006781680975줄었다 

41438.9403701652-41377.57030234839


4.log활용하기

  • 선형회귀를 사용하기 애매할때 사용된다.

🔻 numpy의 log 사용하기

y_train_log = np.log(y_train)
# log값을 변환하고 했더니 오차가 오히려 더 커졌다 !
# 그러므로 우리의 데이터는 비선형이 아닌 선형에 가깝다.라는 결론이 나온다. 
mean_squared_error(y_test, pred, squared=False)

728x90

댓글