➡️ 머신러닝 (Machine Learning, ML)
- 관측된 데이터의 패턴을 기반으로 예측, 분류하는 기법
➡️ 머신러닝 종류
- Supervised Leaning(지도 학습) : 문제 + 정답을 모두 알려주고 학습 시킴 → 예측, 분류
- Unsupervised Learning(비지도 학습) : 답을 알려주지 않고 학습 시킴 → 연관규칙, 군집
- Reinforcement Learning(강화 학습) : 보상을 통해 학습 강화 → 보상
➡️ 선형 회귀 분석
- 회귀 분석이란?
더보기
- 회귀 : 연속적인 `값(숫자)을 예측`하거나 변수 간의 관계를 분석하여 `경향성을 파악`하는 데 사용하는 머신러닝 기법
- 선형 회귀 : 직선으로 모델링, 독립변수에 따른 종속변수의 변화를 분석및 예측 (일차식)
- 다항 회귀 : 비선형 데이터 모델링, 독립변수에 다항식을 사용하여 종속변수 변화 분석및 예측(고차 다항식)
- 스플라인 회귀: 더 복잡함, 구간별 다른 다항식 사용
- 선형 회귀식 (머신러닝/딥러닝)
Y = wX + b
(w = 가중치 , b = 편향(bias))
➡️ 선형 회귀 평가 지표
- 📌 MSE(Mean Squared Erorr) : 에러 숫자 맞추기
- 에러(변동성)을 의미
- 이 값을(에러를) `최소화 하는 방향`으로 진행
- 계산식 : 에러 제곱 합의 평균으로 계산
- 📌 R Square( 선형 회귀만 평가되는 지표 ) : 평균대비 설명력
- R Square는 전체 모형에서 회귀선으로 설명할 수 있는 정도를 의미함
- 이 값을(설명력) `높이는 방향`으로 진행
- ex. R Square =0.7 → 설명력 70% : 해당 모델이 전체 데이터 변동의 70%를 설명할수 있음.
- 계산식 : 전체에서 SSR의 비중
- SSR : (예측값 - 평균값)^2 의 합
- SSE : (실제값-예측값)^2 의 합
- SST: (실제값 -평균값)^2 의 합
➡️ 선형 회귀 파이썬 모듈 & 함수
- `sklearn.linear_model.LinearRegression` : 선형회귀 모델 클래스
- `coef_`: 회귀 계수
- `intercept`: 편향(bias)
- `fit`: 데이터 학습/훈련
- `predict`: 데이터 예측 , 2차원 배열을 받음
- LinearRegression() : 선형회귀 모델 생성 / 2차원 배열을 받음
- `sklearn.metrics` : 선형회귀 평가 지표 클래스
- `mean_squared_error` :MSE 계산
- `r2_score` :R-square 계산
➡️ 단순 선형 회귀 실습
- X = total_bill , Y=tip
- 선형 회귀 모델 생성 및 훈련
- 예측
- 평가
#데이터 생성
tips_df = sns.load_dataset('tips')
tips_df.head(3)
# 값 분포 확인
sns.scatterplot(data=tips_df,x='total_bill',y= 'tip')
# X: total_bill , y=tip
# 1. 선형 회귀 모델 생성 및 학습
model_lr2 = LinearRegression() # 선형 회귀 모델 생성
X=tips_df[['total_bill']] #변수에 할당
y=tips_df[['tip']]
model_lr2.fit(X,y) #선형 회귀 모델 학습
#2. 회귀식 계산
w1_tip = model_lr2.coef_[0][0]
w0_tip = model_lr2.intercept_[0]
print(f'y={w1.round(2)}x + {w0.round(2)}')
print(f'즉,전체금액이 100달러 오를 때,팁은 {w1.round(2)*100} 달러 추가된다.')
#3. 예측값 생성
y_tip_true = tips_df['tip']
y_tip_pred = model_lr2.predict(X) #= model_lr2.predict(tips_df[['total_bill]])
#4. mse/r-square 계산
tip_mse = mean_squared_error(y_tip_true,y_tip_pred)
tip_r_squre = r2_score(y_tip_true,y_tip_pred)
print(f'데이터의 MSE는 {tip_mse.round(2)}이고, r-square 값은 {tip_r_squre.round(2)}이다. \n즉, 해당 모델은 약{tip_r_squre.round(2)*100}%의 설명력을 가진다')
# 선형 그래프 생성
# tips_df 에 예측값 컬럼 추가 생성 선행 필요
tips_df['pred'] = y_tip_pred
sns.scatterplot(data=tips_df,x='total_bill',y='tip')
sns.lineplot(data=tips_df,x='total_bill',y='pred',color='red')
➡️ 다중 선형 회귀 실습
- X1 = total_bill, X2 = sex Y=tip
- 범주형데이터 인코딩
- 모델 생성 및 훈련
- 예측
- 평가
# sex 컬럼 범주형-> 수치형 인코딩
#1. 함수 생성 (female =0 , male=1)
def get_sex(x):
if x=='Female':
return 0
else:
return 1
#2. sex 컬럼에 행단위 적용 :apply 함수
tips_df['sex_en'] = tips_df['sex'].apply(get_sex)
tips_df.head()
#모델 생성
model_lr3 = LinearRegression()
#학습
X=tips_df[['total_bill','sex_en']] #다중변수(추가만)
y=tips_df[['tip']]
model_lr3.fit(X,y)
#예측
model_lr3.predict(X)
#평가
y_tip2_true = tips_df['tip'] #위와 동일
y_tip2_pred = model_lr3.predict(X)
tip_mse2 = mean_squared_error(y_tip2_true,y_tip2_pred)
tip_r_squre2 = r2_score(y_tip2_true,y_tip2_pred)
➡️ 단순 vs 다중 선형 회귀 비교 (결과 해석)
- 단순 모델 대비 다중 선형 모델의 mse가 줄어들었고, r-square가 높아짐
- 즉, 성별 변수가 크게 유효하지 않을수 있음
- 머신러닝 변수로 설정 하기 전, 해당 변수가 머신러닝 모델에 유의미할지 먼저 파악하는것이 중요
#단순 선형 회귀 :x 변수 -전체 금액
#다중 선형 회귀 :x변수 - 전체 금액 & 성별
print('단순선형회귀',tip_mse)
print('다중선형회귀',tip_mse2)
print('단순선형회귀',tip_r_squre)
print('다중선형회귀',tip_r_squre2)
➡️ 선형 회귀의 가정(전제 조건)
- 선형성 (Linearity): 종속 변수(Y)와 독립 변수(X) 간에 `선형 관계가 존재`해야 함
- 등분산성 (Homoscedasticity): `오차의 분산`이 모든 수준의 독립 변수에 대해 `일정`해야함
- 흩어짐 정도가 일정해야함
- 정규성 (Normality): 오차 항은 `정규 분포를 따라야 함`
- 독립성 (Independence): X변수는 서로 독립적이어야 함
- 다중공선성 문제 발생할 수 있음
- 해결법 ) 상관관계가 높은 변수중 한개 선택 or 차원 축소 (PCA) 실행
➡️ 선형 회귀 분석의 한계
- X-Y간의 선형성 가정이 필요하다.
- 평가지표가 평균(mean)포함 하기에 `이상치에 민감`하다.
- 범주형 변수를 인코딩시 정보 손실이 일어난다. (ex. 0 1 인데 여성인지 남성인지 모름)
➡️ 선형 회귀 분석 개인 실습 ( tips 테이블에서 가장 높은 r-square 변수 조합 찾기)
- 범주형 데이터 인코딩
- 모델 생성 및 학습
- 예측 및 평가
- 결과 해석
- 결과
- 단순선형회귀(전체금액) mse : 1.04 r_square : 0.45661658635167657
- 다중선형회귀(금액&성별) mse : 1.04 r_square : 0.45669999534149974
- 다중선형회귀(all) mse : 1.01 r_square : 0.4687755602771142
- 전체 컬럼을 넣었을때 r-sqaure 값이46.9%로 가장 높았음
- 다만, total_bill 과 size 컬럼의 상관계수 0.6수준으로 양의 상관관계 파악 → `다중공선성 문제 해결`을 위해 상관관계가 높은 `size`를 제외할 수 도 있음
- 결과
#범주형 인코딩
def get_smoker(x):
if x=='Yes':
return 1
else:
return 0
def get_time(x):
if x=='Lunch':
return 0
else:
return 1
def get_day(x):
if x=='Thu':
return 1
elif x=='Fri':
return 2
elif x=='Sat':
return 3
else:
return 4
tips_df['smoker_en'] = tips_df['smoker'].apply(get_smoker)
tips_df['time_en'] = tips_df['time'].apply(get_time)
tips_df['day_en'] = tips_df['day'].apply(get_day)
# 모델 생성
model_lr4 = LinearRegression()
# 학습
X=tips_df[['total_bill','size','time_en','sex_en','day_en','smoker_en']]
model_lr4.fit(X,y)
#예측 및 평가
y_tip4_pred = model_lr4.predict(X)
tip_mse4 = mean_squared_error(y_tip_true,y_tip4_pred)
tip_r_squre4 = r2_score(y_tip_true,y_tip4_pred)
print(f'단순선형회귀(전체금액) mse : {tip_mse.round(2)} r_square : {tip_r_squre}')
print(f'다중선형회귀(금액&성별) mse : {tip_mse2.round(2)} r_square : {tip_r_squre2}')
print(f'다중선형회귀(all) mse : {tip_mse4.round(2)} r_square : {tip_r_squre4}')
'통계,검정,머신러닝' 카테고리의 다른 글
통계 기초 | 오류의 종류와 오류 보정법(+본페르니 보정 코드 ) (0) | 2025.01.14 |
---|---|
머신러닝 | 로지스틱 회귀 분석/분류 분석 (+sklearn 파이썬 실습) (1) | 2025.01.14 |
통계 기초 | 상관계수 (피어슨/스피어만/켄달 타우/상호정보 상관계수 / scipy & sklearn 모듈) (0) | 2025.01.10 |
통계 기초 | 회귀분석 ( 선형 회귀/다항 회귀/범주형 회귀 분석/스플라인 회귀) (0) | 2025.01.10 |
연속 확률 분포 | 정규분포/ 표준 정규 분포/ 긴 꼬리 분포/ 스튜던트T 분포/ 카이제곱 분포 (0) | 2025.01.10 |