본문 바로가기

Hello MLop/ML

MLop_ML_선형회귀_보험료 예측

20221107

20일 차

 

 

머신러닝 수업 1일차

 

기본적인 과정을 끝마치고 프로젝트도 해보고

 

머신러닝의 세계로 발을 딛었다.

 

1일차라 간단하게 insurance.csv를 가지고 맛만 보는 시간을 가졌다.

 

 

 

처음으로 해보는 방식은 선형회귀를 통해 실습해 보았다.


 

중요 라이브러리를 import해주고

file_name실제 파일 이름을 변수로 저장

주소url이라는 변수에 저장 후

f 스트링을 통해 file_name을 넣어주고

pd.read_csv()를 통해 데이터를 확인해 보았다.

 

 


 

.head()를 해본 결과 데이터가 잘 나온것을 확인할 수 있었다.

 


 

 

.info()결측치 확인데이터 타입, 컬럼명을 확인하고

 

 


.describe()를 통해 각 컬럼별 데이터값의 통계량을 보았다.

 

* 판다스의 숫자 데이터를 소숫점 n자리 까지만 표시하기 위해

    pd.options.display.float_format = '{:.2f}'.format

 


 

범주형 데이터전처리 하기 위해

사이키런(sklearn)에서 선형회귀(LinearRegression)를 임포트 해주고

독립변수종속변수를 나누어

저장하려고 하자 오류가 났다.

 


그 이유는 컬럼 'sex''smoker','region'이 데이터 값을 object를 가지기 때문이다.

때문에 우린 이를 수치화 해줘야 하는데,

 


흡연여부를 나타내는 smoker 컬럼의 경우는 흡연 한다 or 안한다로 나타낼 수 있기 때문에

df.smoker == 'yes'bool타입을 통해

값을 True or False로 나타내고

bool타입은 0 1로 나타내기 때문에

.mul(1)을 하면?

 

위와 같이 1과 0으로 이루어진 column으로 바꿀 수 있다.

* 마무리로 smoker 컬럼을 재 정의 해준다.

 

 


 

이제 남은 두 컬럼 'sex''region'이 남았는데

이 두 컬럼은 bool타입으로 바꾸긴 난해한 컬럼이다.

 

성별TrueFalse로 볼 수 없으며

region(지역)은 총 4개로 구성되어 있기 때문이다.

 


 

이런 경우 .get_dummies 메서드를 쓰면

자동으로 각각의 컬럼들을 1,0으로 나누어 준다.

 

* 결측치가 없기 때문에 .get_dummies 사용

* 결측치가 존재 하는 컬럼일 경우 없앨지, 살릴지 선택해야함.

* 만약 살린다면 결측치를 채워주고 변환 가능

 


위의 데이터 프레임을 보면

.get_dummies() 를 사용한 댓가로

컬럼 갯수가 11개로 늘어나고

그에 따라 로우 갯수가 1338개로 늘어난 것을 알 수 있다.

 

 

따라서 효율적 계산과 처리를 위해

컬럼 갯수를 줄여야 하는데

 

성별(sex)의 경우 남자 아니면 여자 이기 때문에 둘 중 하나만 써도 되고

지역(region)의 경우 결측치가 없기 때문에

한 장소가 1이면 다른 세 장소가 0 이므로 한 장소를 없앨 수 있다.

 

이런 경우 get_dummies()안에 drop_first=True를 추가해주면 된다.

 

 


실행 한 결과 위의 컬럼이 11개에서 9개로 줄었으므로

데이터 또한 약 2650개 정도 줄어든 것을 확인할 수 있다.

 


그럼 이제 비교하기 위한 데이터 전처리 과정이 끝났으니

러닝을 하기 위한 전처리를 해보자.

 

 


df_dummy의 컬럼중 expenses를 제외한 컬럼들을 X (독립변수)로 저장하고

y= df_dummy.expenses(종속변수) 로 저장했다.

* 우리가 비교하려는 컬럼이 보험료에 얼마나 영향을 미치는가? 이기 때문

 

그리고 사이키런에서 train_test_split을 import 해

러닝 준비를 시킨다.

 


독립 변수 X종속 변수 y를 이용해

연습할 독립 변수 X_train 연습할 종속변수 y_train

시험을 치룰 독립 변수 X_test 시험을 치룰 종속변수 y_test를 만들고

 

test_size를 정하고random_stateseed값 임의로 만든다.

 

 


사이키런에서 import 선형회귀(LinearRegression)를 해주고

model에 X_train, y_train을 설정하여 러닝 준비를 끝낸다.

 

 


pred라는 변수에 model.predict()를 사용하여

X_test의 예측값을 저장하고 이제 비교를 해보자.

 

 


comparison, 즉 비교라는 뜻을 가진 변수에DataFrame을 생성해 준다.컬럼은 'actual'y_test값, 'pred'pred(X_test)를 넣어준다.

 

위의 사진을 보면 값이 차이가 많이 나는것을 알 수 있다.

 


좀 더 이 수치를 이해하기 쉽게 시각화를 해봐야 하는데

matplotlib.pyplotseaborn을 이용해 시각화 툴을 임포트 해준다.

 

그리고 위와 같이 x축명에 'axtual' 을, y축명에 'pred'을 대입해주고

data = comparison을 써주면

 

위와 같은 산점도 형식으로 그래프가 나온다.

 

시각화된 그래프를 보더라도 뭔가 일치하는 그래프의 모양은 아닌걸로 보아

 

러닝 결과가 바람직 하지 못하다는것을 알 수 있다.

 


 

이렇게 선형회귀분석에서 기준치와의 오차가 심한경우

 

MSE(평균제곱오차)

RMSE(평균오차) (결정계수)

 

세 가지의 데이터로 비교해 얼마나 오차가 심한지도 판단이 가능하다.

 


MSE (평균제곱오차)

오차(잔차)의 제곱에 대한 평균을 취한 값

실제값(관측값)과 추정값과의 차이. 즉 오차가 얼마인가를 알려주는데 많이 사용되는 척도

  * MSE가 작을수록 추정의 정확성이 높아짐

 

RMSE(평균오차)

- MSE의 제곱근 

 

 

  (결정계수)

 

- 회귀식이 얼마나 정확한지를 나타내는 숫자 (0≦1)

* R² =0  신뢰할 수 없다.

* R² =0.5 어느정도 신뢰한다.

* R² =1 신뢰할만하다.

 


.coef_기울기를 구하는 메서드 인데

선형회귀분석에서 기울기를 구해 그 차이를 보는 정도로 오차가 얼마나 났는지 추측할 수 있다.

 

.intercept_절편을 구하는 메서드 인데

기울기와 절편을 이용해 x절편 y절편을 구할 수 있다.

 

 


마지막으로 우리가 만든 것을 모델로 배포 하는 과정이다.

joblib import.pkl로 저장시켜 배포 할 수 있다.