n213[정규화 회귀모델, 릿지,라쏘]

도도요닝·2022년 9월 8일
0
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.linear_model import LinearRegression, Ridge, Lasso
import warnings
warnings.filterwarnings(action='ignore')
#결측치 확인
df.isna().sum()[df.isna().sum() !=0]/len(df)
  • [] len(df)를 나눠주는 이유는 ..?
# 고유한 값이 너무 많은 컬럼도 예측에 도움이 되지 않으니 확인하고 삭제해주겠습니다. 
df.nunique()[df.nunique()/len(df)>0.7]
cols = ['Id', 'LotArea']
df.drop(cols, axis=1, inplace=True)
#타겟분포확인
# 왼쪽으로 치우쳐진 분포입니다. 주택 판매 가격이 400000을 넘지 않는 샘플만 다시 추출하도록 하겠습니다.
df = df[df['SalePrice']<400000]
sns.histplot(df['SalePrice'], bins=50)
# 수치형 컬럼과 타겟간의 상관관계를 확인해보겠습니다. 상관관계가 높은 상위 10개 컬럼만 보도록하겠습니다. 
# target = SalePrice
df.corr()['SalePrice'].sort_values(ascending=False).head(11)

Modeling

from sklearn.model_selection import train_test_split
X = df.drop('SalePrice', axis=1)
y = df['SalePrice']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

모델링에 필요한 두 가지 전처리

  1. Scaling scaler = StandardScaler()
  2. Encoding
# 결측치를 먼저 평균으로 모두 채워주겠습니다. 
X_trian.fillna(X_train.mean(), inplace=True)
X_test.fillna(X_test.mean(), inplace=True)
#수치형 변수만 스케일링
#dtype으로 수치형 변수 판별하기 
numeric_feats = X_train.dtypes[X_train.dtypes != "object"].index
scaler = StandardScaler()
X_train[numeric_feats] = scaler.fit_transform(X_train[numeric_feats])
X_test[numeric_feats] = scaler.transform(X_test[numeric_feats])
# .T가 행과 열 위치 바꿈
X_train[numeric_feats].describe().T[['mean','std']]

One-Hot encoding

from category_encoders import OneHotEncoder
ohe = OneHotEncoder()

X_train_ohe = ohe.fit_transform(X_train)
X_test_ohe = ohe.fit_transform(X_test)
(X_train_ohe.dtypes == 'object').sum()
mszoning_cols = [x for x in X_train_ohe.columns if 'MSZoning' in x]
X_train_ohe[mszoning_cols].head(3)

#범주형 특성이 어떻게 변환이 되었는지 확인
ohe.category_mapping

기준모델 : 평균이용

from sklearn.metrics import r2_score, mean_absolute_error

baseline = [y_train.mean()]*len(y_train)
baseline_r2 = r2_score(y_train, baseline)
baseline_mae = mean_absolute_error(y_train, baseline)

다중선형회귀 OLS

def print_score(model, X_train, y_train, X_test, y_test) :
    train_score = np.round(model.score(X_train, y_train) , 3)
    val_score = np.round(np.mean(cross_val_score(model, X_train, y_train, scoring='r2', cv=3).round(3)),3)
    test_score = np.round(model.score(X_test, y_test),3)
    
    return train_score, val_score, test_score
from sklearn.model_selection import cross_val_score

# 선형회귀를 ols라는 객체에 저장합니다. 
ols = LinearRegression()

# 모델 학습
ols.fit(X_train_ohe, y_train)

# 성능 비교
ols_train, ols_val, ols_test = print_score(ols,X_train_ohe, y_train, X_test_ohe, y_test)

ridge regression 모델 만들기

for alpha in [0.01, 0.1, 1.0, 1, 100.0, 1000.0, 10000.0]:
	print(f"Ridge Regression, alpha={alpha}")
    
    #모델학습
    ridge = Ridge(alpha=alpha)
    ridge.fit(X_train_ohe, y_train)
    
    #성능확인()#print_score 위에서 만들었던 함수
    print_score(ridge,X_train_ohe, y_train, X_test_ohe, y_test)
    
    #coefficients 계수
    #절대값 상위 40개의 회귀계수만 불러오기 
    coefficients = pd.Series(ridge.coef_, X_train_ohe.columns)
    idx = np.abs(coefficients).head(40).index

sklearn에서 내장된 교차검증 알고리즘 ridgeCV

0개의 댓글