회귀분석이란? 독립변수 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)
'Python' 카테고리의 다른 글
차트 유사도 패턴 검출 (0) | 2024.12.26 |
---|---|
Python - Regression(Ridge, LASSO, ELASTICNET) (0) | 2022.10.25 |
Python - 다중공선성 , 차원축소 , 군집 (0) | 2022.10.24 |
Python - 모델 Stacking (0) | 2022.10.22 |
Python - XGB, HGBM 파라미터 튜닝 , 캐글 점수 (0) | 2022.10.21 |