Python / / 2022. 10. 24. 17:50

Python - Regression 회귀 분석

회귀분석이란?  독립변수 X의 분포를 분석한 후, 종속변수 Y의 값을 예측하는 것입니다.
 
다양하게 분포된 가 존재할 때, 의 분포를 알아내는 것 
 
즉, X = [ 1,2,3,4,5] 일 경우, Y의 나이 예측 한다고 하면 
 
Y['year'] = X_predict 
 

 

평균 함수 : 관심의 대상이 되는 모집단의 대표값을 말한다.

 
  -> E(Y|X=x)

 

  식에서 기대값은 X 값이 ‘이미 정해졌을때’라는 조건부 기대값으로 볼 수 있다.
  (회귀 분석에선, 독립변수가 있어야 종속변수 Y값을 예측할 수 있다)
 
 이를 수식으로 본다면,
 -> E(Y|X=x)=β0+β1x

 

*모수 : 모집단 분포 특성을 규정 짓는 척도. 관심의 대상이 되는 모집단의 대표값 

 

 

분산함수 :

 회귀분석에서 사용하는 모델은 x값이 얼마든 분산에는 영향을 주지 않고,
 X값에 대한 분산은 항상 동일하다.  

  - > Var(Y|X=x)=σ2

 

통계적 오차(statistical error)

회귀분석에서 중요한 요소는 오차(error), 여기서 말하는 에러는 통계적 오차(statistical error)이다. 왜냐하면 우리가 예상한 종속변수 y값은 실제로 예측된 y값과 차이가 날 수 있기 때문입니다. 즉, \E(Y|X=xi) 가 다를 수 있다.

 

이를 수식으로 나타내면

 

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import LabelEncoder
'''
Regression 회귀 분석

 

원리 : 평균으로 집단의 데이터가 수렴한다 .

 

독립 변인이 종속변인에 영향을 미치는지 알아보고자 하는 분석 방법

 

y = wx
w = weight 가중치



에러제곱의 합 : Square Error
에러제곱의 합의 평균 : Mean Square Error

 

Mean Square Error = Cost function Rss(w)

 

Cost function, Rss(w)의 최솟값을 찾는 것
Rss(W) = 학습

 

W를 찾는게 중요하다

 

 
'''
warnings.filterwarnings('ignore')

 

df = pd.read_csv('./titanic/train.csv')
df_kg = pd.read_csv('./titanic/test.csv')
df1 = df.copy()
df1.set_index('PassengerId', inplace=True)
df_kg.set_index('PassengerId', inplace=True)
df1.drop(['Name'], axis=1, inplace=True)
df_kg.drop(['Name'], axis=1, inplace=True)

 

df_kg.Cabin.astype(str)

 

# 결측치 처리
df1.Cabin.fillna('N', inplace=True)
df1.Embarked.fillna('S', inplace=True)
df1.Age.fillna(df1.Age.median(), inplace=True)
df_kg.Cabin.fillna('N', inplace=True)
df_kg.Fare.fillna(df1.Fare.median(), inplace=True)
df_kg.Age.fillna(df1.Age.median(), inplace=True)

 

df1.Cabin = df1.Cabin.apply(lambda x:x[0])
df_kg.Cabin = df_kg.Cabin.apply(lambda x:x[0])



# 인코딩
og_columns = df1.columns[(df1.dtypes=='O')|(df1.dtypes=='category')|(df1.dtypes=='bool')]
for i in og_columns:
    globals()[f'df1_{i}_encoder'] = LabelEncoder()
    globals()[f'df1_{i}_encoder'].fit(df1[i])
    globals()[f'df_kg_{i}_encoder'] = LabelEncoder()
    globals()[f'df_kg_{i}_encoder'].fit(df_kg[i])
    df1[i] = globals()[f'df1_{i}_encoder'].transform(df1[i])
    df_kg[i] = globals()[f'df_kg_{i}_encoder'].transform(df_kg[i])

 

# X, y 분리
X = df1.drop('Fare', axis=1)
y = df1.Fare
print(df1)
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=19)
# train, test 분리



from sklearn.linear_model import LinearRegression

 

m = LinearRegression()
m.fit(X_train,y_train)
lr_pred = m.predict(X_test)
# print(mean_squared_error(y_test,lr_pred))

 

# # #예측 결과 확인




# fit_intercept : 모형에 상수항 (절편)이 있는가 없는가를 결정하는 인수 (default : True)
# normalize : 매개변수 무시 여부
# copy_X : X의 복사 여부
# n_jobs : 계산에 사용할 작업 수

 

'''보스턴 주택 가격 예측'''

 

boston = pd.read_csv('./boston_data.csv')

 

X=boston[['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax','ptratio', 'black', 'lstat']]
y=boston[['medv']]

 

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=19)

 

m = LinearRegression()
m.fit(X_train,y_train)
lr_pred = m.predict(X_test)
print(mean_squared_error(y_test,lr_pred))
sns.heatmap(X.corr(),annot=True,cmap ='Pastel2')
plt.show()
'''
다중 공선성

 

산포도 & 상관계수 확인
-> 너무 높은 상관계수 (약0.9이상) 다중 공선성 의심

 

Tolerance 확인
-> 한개의 독립변수를 종속변수로 나머지 독립변수를 독립변수로 하는 회귀분석 실시
-> R^2가 1이라면 독립변수 간에 심각한 상관관계가 있음을 의미

 

tolerance = 1 - R^2 . Tolerance가 0에 가까워질수록 상관성이 매우 높다 .

 

'''

 

tol_X = X.iloc[:,:-1]
tol_y = X.iloc[:,-1]
from sklearn.metrics import r2_score

 

'''
ERROR = bias + variance + c



'''
from sklearn.decomposition import PCA
from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
alphas = [100, 10, 1, 0.1, 0.01, 0.001, 0.0001]
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
poly = PolynomialFeatures(5)
X_poly = poly.fit_transform(X_pca)
X_trn, X_val, y_trn, y_val = train_test_split(X_poly, y, test_size=0.2, random_state=19)
for alpha in alphas:
    bt_lr_model = Ridge(alpha=alpha, normalize=True, random_state=19)
    bt_lr_model.fit(X_trn, y_trn)
    bt_lr_pred = bt_lr_model.predict(X_val)
    val_mse = round(mean_squared_error(y_val, bt_lr_pred), 3)
    trn_r2 = round(bt_lr_model.score(X_trn, y_trn), 3)
    val_r2 = round(bt_lr_model.score(X_val, y_val), 3)




  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유