TIL

240131수_TIL

30303 2024. 1. 31. 20:53
728x90

선형회귀 적용 2

MSE= 예측값 - 실제값

Y=0.86x+109.37를 이용하여 예측 컬럼을 추가

 

#예측값을 만들기

body_df['pred']=body_df['weight']*w1+w0

body_df.head()

 

#에러

body_df['error']=body_df['height']-body_df['pred']

body_df.head

 

#에러 제곱

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

body_df.head()

 

# 더한 데이터프레임의 길이로 나누기

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

 

MSE=10.152939045376318

 

-1 산점도 

-2 데이터로 학습한 선형회귀 예측값

sns.scatterplot(data=body_df,x='weight',y='height')

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

 

r2 score

 

#평가함수는 공통적으로 정답(실제 y,true), 예측 (pred)

y_true=body_df['height']

y_pred=body_df['pred']

mean_squared_error(y_true,y_pred)

 

r2_score(y_true, y_pred)

 

0.8899887415172141

 

y_pred2=model_lr.predict(body_df[['weight']])

y_pred2

 

mean_squared_error(y_true,y_pred2)

 

predict 를 사용한 방법

 


tips 데이터

 

 #전체 금액X:total_bill 받을 있는 Y:tip

 

sns.scatterplot(data= tips_df,x='total_bill',y='tip')

 

X=tips_df[['total_bill']]

y=tips_df[['tip']]

model_lr2.fit(X,y)

모델 학습

#y(tip)=w1*x(total_bill)+w0

w1_tip=model_lr2.coef_[0][0]

w0_tip=model_lr2.intercept_[0]

 

print('y={}x+{}'.format(w1_tip.round(2),w0_tip.round(2)))

y=0.11x+0.92

 

=> total_bill 1달러 오를 때 tip 0.11증가

=> total_bill 100달러 증가 시 tip 11달러 증가

(10%)

 

y_true_tip=tips_df['tip']

y_pred_tip=model_lr2.predict(tips_df[['total_bill']])

 

mean_squared_error(y_true_tip,y_pred_tip)

1.036019442011377

 

r2_score(y_true_tip,y_pred_tip)

0.45661658635167657

 

모델 학습 후, 예측값을 tip_df에 넣어 선 추가. 

tips_df['pred']=y_pred_tip

sns.scatterplot(data= tips_df,x='total_bill',y='tip')

sns.lineplot(data=tips_df,x='total_bill', y='pred',color='red')

 

 

낮은 r score.

다른 변수 추가 

 

선형회귀의 종류

- 단순 선형회귀 : X변수 1개(1차함수)

- 다항/다중 선형회귀:X변수 2개 이상

 

숫자가 아닌) 범주형 변수를 추가하는 방법; 해당 데이터를 숫자로 바꿈 ; 인코딩 (딥러닝에서 이미지,텍스트로 숫자로 변환)

 

자료의 종류

범주형

- 명목:성별, 혈액형

- 순서: 학점, 등급

수치형

- 이산형: 두개의 값이 유한한 개수로 나뉘어진

- 연속형: 두개의 값이 무한한 개수로 나뉘어진

 

#범주형 데이터 사용하기

#male 1 female 0

#자료가 들어왔을 0,1 조건을 만드는 함수

def get_sex(x):

    if x== 'Female':

        return 0

    else:

        return 1

 

#apply method 행에 특정한 함수를 적용시킴

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

 

model_lr3=LinearRegression()

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

y=tips_df[['tip']]

 

#학습

model_lr3.fit(X,y)

 

#예측

y_pred_tip2=model_lr3.predict(X)

 

#단순선형회귀 mse: X변수가 전체 금액

#다중선형회귀 mse: X변수가 전체 금액, 성별

print('단순선형회귀', mean_squared_error(y_true_tip,y_pred_tip))

print('다중선형회귀', mean_squared_error(y_true_tip,y_pred_tip2))

 

단순선형회귀 1.036019442011377

다중선형회귀 1.0358604137213616

 

print('단순선형회귀', r2_score(y_true_tip,y_pred_tip))

print('다중선형회귀', r2_score(y_true_tip,y_pred_tip2))

 

단순선형회귀 0.45661658635167657

다중선형회귀 0.45669999534149963

 

sns.barplot(data=tips_df,x='sex',y='tip')

 

사전에 데이터 분포 확인해보기.

 


선형 회귀 심화 2

 

선형회귀

1 선형성 linearity 종속변수y와 독립변수x간에 선형관계 존재해야

2 등분산성 homoscedasticity 오차의 분산이 모든 수준의 독립변수에 대해 일정해야 / 오차가 특정 패턴을 보이지 않고 독립변수 값에 상관없이 일정해야

3 정규성 normality 오차항은 정규분포를 따라야

4 독립성 independency x변수는 서로 독립적이어야 ; 다중회귀에서 다중공선성의 문제 ; 독립변수 간 강한 상관관계가 나타나는 것

 

다중공선성 해결방법

- 상관계수가 높은 변수 중 하나만 택 or 히트맵으로 나타내기

- 두 변수를 동시에 설명하는 차원 축소 pca(principle component analysis)실행 /제일 많이 표현되는 주성분, 공통적 특성을 사용

 

선형회귀 장점; 직관적. 이해쉬움. x와y의 관계 정량화 가능. 모델학습 빠름. 가중치 계산이 빠름(행렬)

단점; xy간 선형성 가정이 필요./평가지표가 평균을 포함하기에 이상치에 민감/ 범주형 변수 인코딩 시 정보 손실

 


분류분석 - 로지스틱 회귀

 

ML 예측

회귀; 숫자를 예측

분류; 범주, 카테고리를 예측. 

 

정확도 accuracy 

맞춘개수/전체데이터

여성의 생존;233 남성의 사망;468 전체인원;891

(233+468)/891 

정확도 78%


로지스틱 회귀 이론

 

y가 범주형 데이터인 경우 선형함수의 한계

y는 0 or 1

1차 방정식으로 만들 경우 오류 발생키도. 

 

따라서 로지스틱 회귀. x값이 일 경우 1에 수렴. -일 경우 0에 수렴

로그함수; 특정 값에 수렴. 

 

오즈비(odds ratio);승산비

실패확률 대비 성공 확률

-성공확률 80% 실패확률 20%: 오즈비 = 80/20=4 ; 1번 실패하면 4번은 성공

p/(1-p)

p 0과1사이

p가 증가할수록 오즈비 급격한 증가, 따라서 로그를 씌워 완화