Python(Colab) 선형 회귀(Linear Regression)

2023. 6. 12. 17:43파이썬/머신러닝 및 딥러닝

1. 기초 설정

import numpy as np
import pandas as pd
import seaborn as sns
 
rent_df  = pd.read_csv('/content/drive/MyDrive/KDT-1/머신러닝과 딥러닝/rent.csv')
 
rent_df.info()
 
✔ 컬럼 설명

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

 

2. 사용할 컬럼 이상치 확인하기

(Rent) - 렌트비를 종속변수로 사용 예정

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

 

3. 이상치 제거

# 인덱스로 제거하기
rent_df.drop(1837)
 
 

 

4. 결측치가 있는 컬럼과 그 결측치가 잇는 데이터의 전체 비율 확인

한마디: 결측치를 가진게 총 데이터에서 얼마나 차지하는지 확인

rent_df.isna().mean()
 

 

 

5. 결측치가 있는 컬럼 모두 삭제

rent_df.dropna(1)
 
# rent_df.drop(['BHK','Size'], axis =1 )과 같은 의미
✔나에게 어색했던 문법
rent_df.dropna(1) = rent_df.dropna(axis=1)

rent_df.dropna(0) = rent_df.dropna(axis=0)

 

 

6. Size라는 column에서 NaN인 데이터 인덱스 찾기

 

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

 

 

7. Size column 결측치 처리

✔ 강사님 조언

1. 결측 데이터가 전체 데이터에 비해 양이 굉장히 적을 경우 삭제하는 것도 방법
2. 결측치에 데이터를 채울 경우 먼저 boxplot을 확인하는 것이 좋다. 
    (why? mean(평균)으로 채울 것인지, median(중위도)로 채울 것이 더 분포가 잘 이루어져있는지 판단하기 위해)

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

 

 

# boxplot을 확인 후 mean보다 median을 사용하는 것이 좋다고 판단 !
# 집의 사이즈와 렌트비용(Rent)비용은 상관관계가 있다고 판단
 
 
# 평균과 중위도는 다르다 !
 
# 고루고루 분포가 잘 되어 있음으로 중위도를 쓰는 것이 더 났다는 판단
 
 
rent_df.fillna(rent_df.median()).loc[na_index]

 

✔중간값은 모든 관측값을 이용하지 않으므로 평균값보단 이상치(아웃라이어)의 영향을 덜 받는다.

 

<결측치 종류>

1. MCAR(Missing Completely At Random): 완전무작위 결측
 ==> 결측치가 다른 변수와 아무 상관 없는 경우 

대책: 단순 무작위 표본추출로 대체

2. MAR(Missing At Random): 무작위 결측
==> 누락된 자료가 특정 변수와 연관이 되어 발생하지만 변수의 결과와는 관계 없는 경우
예)

3) MNAR(Missing Not At Random): 비무작위 결측
==> 1,2번 이외의 경우를 말하며, 결측치의 값이 다른 변수와 연관이 있는 경우

 

8. BHK column 결측치 처리

# BHK는 침실,주방 갯수는 소수점으로 떨어지지 않으며 더불어 중위도와 평균이 비슷하기때문에 median으로 대체 예정

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

 

 

9. object(문자열)인 데이터 라벨 인코딩 ( 사용할 컬럼: Area_Type, City, Furnishing Status )

 

unique():value_counts와 유사하게 몇가지 종류 여부를 반환 

nunique():value_counts와 유사하게 몇가지 종류가 있는지 수치로 반환

# unique(): value_counts랑 비슷하면 몇 종류가 있는지 알 수 있는 지
rent_df['Area Type'].unique()
 
 
 
# 🔴 내가 바꾸고 싶은 컬럼의 범주가 몇개인지 한번에 확인하는 법
# 결과중 Floor, Area Locality 두개는 범주가 너무 많음으로 계산이 오래걸림 그래서 삭제할 제외할 에정
for i in ['Floor','Area Type','Area Locality','City','Furnishing Status','Tenant Preferred','Point of Contact']:
    print(i,rent_df[i].nunique())
 
 
 
# 사용할 컬럼 : 라벨 인코딩 진행 
rent_df = pd.get_dummies(rent_df,columns=['Area Type','City','Furnishing Status'])

 

10. 독립변수와 종속변수 나누기 

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

 

10. 학습 검증데이터 분류하기

 

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=10)
 
X_train.shape, y_train.shape
 
X_test.shape, y_test.shape
 

 

 

11. 선형회귀 사용하기

 

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
 
#학습 데이터 학습시키기
lr.fit(X_train,y_train)
 
 
#검증 데이터 테스트하기
pred = lr.predict(X_test)

 


 

✔ 평가지표

 

1. MSE(Mean Squared Error)
- 예측값과 실제값의 차이와 제곱에 대해 평균을 낸 값

1)

## MSE 함수로 만들어보기

p = np.array([3,4,5]) # 예측값

act = np.array([1,2,3]) # 실제값

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

2)

## 모듈로 사용하기
 
from sklearn.metrics import  mean_squared_error
 
mean_squared_error(p,act)
2. MAE(Mean Absolute Error)
- 예측값과 실제값의 차이와 절대값에 대해 평균을 낸 값

1)

## MAE 함수로 만들어보기
 
def my_mae(pred,actual):
    return np.abs(pred-actual).mean()

2)

## 모듈로 사용하기
from sklearn.metrics import mean_absolute_error
 
mean_absolute_error(p,act)

 

 

3. RMSE(Root Mean Squared Error)
- 예측값과 실제값의 차이와 제곱에 대한 평균을 루트를 씌운 값


머신러닝과 딥러닝은 계산할 숫자들이 작을수록 성능이 증가
## RMSE 함수로 만들어보기
 
def my_rmse(pred,actual):
    return np.sqrt(my_mse(pred,actual))

 

## 모듈로 사용하기(MSE와 같은 모듈)
 
from sklearn.metrics import  mean_squared_error
 
mean_squared_error(p,act,squared=False)

 

 

12. 데이터의 평가지표 적용하기

 

#MSE
mean_squared_error(y_test,pred)
 
#MAE
mean_absolute_error(y_test,pred)

 

 

#RMSE
mean_squared_error(y_test,pred,squared=False)
 

 

 

13. log를 활용하여 평가해보기

 

13-1 기초설정)

# 예제 리스트
 
# 독립변수
a= [1,2,3,4,5]
 
# 종속변수   
b=[1,10,100,1000,10000]  
 
 
b_log = np.log(b)
b_log
 
 

 

기존 b : [1,10,100,1000,10000]
log b : [0. , 2.30258509, 4.60517019, 6.90775528, 9.21034037]

y=log(X)이기때문에

 

 

728x90