질문&답변
1. Kaggle House Prices 예제에서 R2 와 Coefficent 값 질문
1. 하지만 log 변환한 값으로 lr, ridge, lasso 세가지를 돌렸을 때는 하기와 같이 lr 의 경우는 coef 값이 제대로 나오지 않고 , lasso 의 경우는 대부분 0.0 값이 나오는데 , 또 code 가 잘못된 것인지 , 아니면 이렇게 값이 이상하게 나올 경우는 하이퍼파라미터 튜닝을 통해서 성능을 올려야할 케이스에 해당이 될까요 ? => 이거는 작성하신 코드를 보지 않고는 알 수가 없을 것 같습니다 . 여기에 작성한 전체 코드를 올려봐 주십시요 . 그리고 log 변환을 했다는 것이 타겟값을 했다는 건지 피처값을 했다는 것지요 ? --> 네 , Object feature는 Drop 하고, Object 타입이 아닌 feature 에 대해서만 하기와 같이 col_x_names 에 넣어 Standard Scaling 을 하였고 , Target 값인 SalePrice 에 대해서만 log1p 로 로그 변환하였습니다 . 2. lr 의 경우도 , 일부가 coef 값이 0.0 으로 나오는데 , lr 도 하이퍼파라미터튜닝과 같이 성능을 높일 수 있는 방법이 있을까요 ? =>LinearRegression 클래스는 하이퍼파라미터라 할만한 초기화 값이 없습니다만 , 굳이 찾자면 , fit_intercept( 절편 반영 여부 ) 정도 될 것 같습니다 . LinearRegression 은 보다는 Ridge, Lasso 사용을 권장드립니다 . --> 네 설명 감사합니다 !! 3. 추가로 log1p 한 이후 Model 완료 후 다시 expm1() 함수로 복원할 때 코드도 어떻게 쓰는 것이 맞는지 알려주신다면 너무 감사하겠습니다 . => 분류 실습 2: 신용카드 사기 예측 실습 - 03 강의의 8 분 50 초 정도의 내용을 확인해 보시면 좋을 것 같습니다 . 만약에 해당 내용을 보셨는데도 이해가 안되셨다면 어느 부분이 이해가 안되신건지 좀 더 자세하게 기재 부탁드립니다 . --> 네 , 제가 해당 강의는 아직 못들었는데 , 이해 안되면 문의 드리겠습니다 . 이렇게 일일이 설명 자세히 해주셔서 너무 감사합니다 !! import warnings warnings.filterwarnings('ignore') import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline house_df_org = pd.read_csv('house_price.csv') house_df = house_df_org.copy() house_df.head(3) #Object feature drop house_df.drop(['MSZoning', 'LotFrontage', 'Street','Alley','LotShape','LandContour','Utilities', 'LotConfig','LandSlope', 'Neighborhood', 'Condition1', 'Condition2','BldgType','HouseStyle', 'RoofStyle','RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType','ExterQual','ExterCond', 'Foundation','BsmtQual', 'BsmtCond', 'BsmtExposure', 'BsmtFinType1','BsmtFinType2', 'Heating', 'HeatingQC', 'CentralAir','Electrical','KitchenQual','Functional','FireplaceQu','GarageType', 'GarageFinish', 'GarageQual','GarageCond', 'PavedDrive','PoolQC','Fence','MiscFeature', 'SaleType','SaleCondition','Id'], axis=1 , inplace=True) # Null 값 평균값으로 대체 house_df.fillna(house_df.mean(),inplace=True) col_x_names = ['MSSubClass','LotArea','OverallQual','OverallCond','YearBuilt','YearRemodAdd', 'MasVnrArea','BsmtFinSF1','BsmtFinSF2','BsmtUnfSF','TotalBsmtSF','1stFlrSF','2ndFlrSF', 'LowQualFinSF','GrLivArea','BsmtFullBath','BsmtHalfBath','FullBath','HalfBath','BedroomAbvGr', 'KitchenAbvGr','TotRmsAbvGrd','Fireplaces','GarageYrBlt','GarageCars','GarageArea', 'WoodDeckSF','OpenPorchSF','EnclosedPorch','3SsnPorch','ScreenPorch','PoolArea','MiscVal', 'MoSold','YrSold'] # Feature 별로 range차이가 크기 때문에 StandardScaler 처리 해줌 from sklearn.preprocessing import StandardScaler import pandas as pd col_x_names = ['MSSubClass','LotArea','OverallQual','OverallCond','YearBuilt','YearRemodAdd', 'MasVnrArea','BsmtFinSF1','BsmtFinSF2','BsmtUnfSF','TotalBsmtSF','1stFlrSF','2ndFlrSF', 'LowQualFinSF','GrLivArea','BsmtFullBath','BsmtHalfBath','FullBath','HalfBath','BedroomAbvGr', 'KitchenAbvGr','TotRmsAbvGrd','Fireplaces','GarageYrBlt','GarageCars','GarageArea', 'WoodDeckSF','OpenPorchSF','EnclosedPorch','3SsnPorch','ScreenPorch','PoolArea','MiscVal', 'MoSold','YrSold'] scaler = StandardScaler() house_scaled_x = house_df[col_x_names] scaler.fit(house_scaled_x) house_scaled_x = scaler.transform(house_scaled_x) #transform()시 scale 변환된 데이터 셋이 numpy ndarry로 반환되어 이를 DataFrame으로 변환 house_scaled_x = pd.DataFrame(data=house_scaled_x, columns=col_x_names) print('mean of features') print(house_scaled_x.mean()) print('\n variance of features') print(house_scaled_x.var()) house_scaled_x # 로그변환 original_SalePrice = house_df['SalePrice'] house_df['SalePrice'] = np.log1p(house_df['SalePrice']) # R2 확인 from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.metrics import mean_squared_error, r2_score y_target = house_df['SalePrice'] X_data = house_scaled_x X_train, X_test, y_train, y_test = train_test_split(X_data, y_target, test_size=0.2, random_state=156) #선형회귀 OLS 로 학습/예측/평가 수행 lr_reg = LinearRegression() lr_reg.fit(X_train, y_train) y_preds = lr_reg.predict(X_test) mse = mean_squared_error(y_test, y_preds) rmse = np.sqrt(mse) print('lr Variance score : {0: .7f}'.format(r2_score(y_test, y_preds))) ridge_reg = Ridge() ridge_reg.fit(X_train, y_train) y_preds = ridge_reg.predict(X_test) mse = mean_squared_error(y_test, y_preds) rmse = np.sqrt(mse) print('ridge Variance score : {0: .7f}'.format(r2_score(y_test, y_preds))) lasso_reg = Lasso() lasso_reg.fit(X_train, y_train) y_preds = lasso_reg.predict(X_test) mse = mean_squared_error(y_test, y_preds) rmse = np.sqrt(mse) print('lasso_reg Variance score : {0: .7f}'.format(r2_score(y_test, y_preds))) # RMSE from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.metrics import mean_squared_error, r2_score # 학습이 완료된 모델을 인자로 받아서 테스트 데이터로 예측하고 RMSE를 계산 def get_rmse(model): y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) rmse = np.sqrt(mse) print(model.__class__.__name__, 'RMSE:',np.round(rmse, 7)) return rmse #여러 모델들을 list 형태로 인자로 받아서 개별 모델들의 RMSE 를 list 로 반환 def get_rmses(models): rmses = [] for model in models: rmse = get_rmse(model) rmses.append(rmse) return rmses from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.metrics import mean_squared_error, r2_score y_target = house_df['SalePrice'] X_data = house_scaled_x X_train, X_test, y_train, y_test = train_test_split(X_data, y_target, test_size=0.2, random_state=156) #선형회귀 OLS 로 학습/예측/평가 수행 lr_reg = LinearRegression() lr_reg.fit(X_train, y_train) ridge_reg = Ridge() ridge_reg.fit(X_train, y_train) lasso_reg = Lasso() lasso_reg.fit(X_train, y_train) models = [lr_reg, ridge_reg, lasso_reg] get_rmses(models) # Coef 확인 coef = pd.Series(lr_reg.coef_, index=house_scaled_x.columns) coef_high = coef.sort_values(ascending=False).head(20) coef_high coef = pd.Series(ridge_reg.coef_, index=house_scaled_x.columns) coef_high = coef.sort_values(ascending=False).head(20) coef_high coef = pd.Series(lasso_reg.coef_, index=house_scaled_x.columns) coef_high = coef.sort_values(ascending=False).head(20) coef_high #Coef 그래프 def get_top_bottom_coef(model): #coef_속성을 기반으로 Series 객체를 생성. index는 컬럼명 coef = pd.Series(model.coef_, index=house_scaled_x.columns) # +상위 10개, -하위 10개 coefficient 를 추출하여 반환. coef_high = coef.sort_values(ascending=False).head(10) coef_low = coef.sort_values(ascending=False).tail(10) return coef_high, coef_low def visualize_coefficient(models): # 3개 회귀 모델의 시각화를 위해 3개의 컬럼을 가지는 subplot 생성 fig, axs = plt.subplots(figsize=(24, 10), nrows=1, ncols=3) fig.tight_layout() #입력인자로 받은 list 객체인 models 에서 차례로 model을 추출하여 회귀 계수 시각화 for i_num, model in enumerate(models): #상위 10개, 하위 10개 회귀 계수를 구하고 이를 판다스 concat 으로 결합 coef_high, coef_low = get_top_bottom_coef(model) coef_concat = pd.concat([coef_high, coef_low]) #순차적으로 ax subplot 에 barchar로 표현, 한화면에 표현하기 위해 tick label 위치와 font 크기 조정 axs[i_num].set_title(model.__class__.__name__+'Coeffiecents', size=25) axs[i_num].tick_params(axis="y", direction="in", pad=-120) for label in (axs[i_num].get_xticklabels() + axs[i_num].get_yticklabels()): label.set_fontsize(22) sns.barplot(x=coef_concat.values, y=coef_concat.index , ax=axs[i_num]) # 앞 예제에서 학습한 lr_reg, ridge_reg, lasso_reg 모델의 회귀 계수 시각화. models = [lr_reg, ridge_reg, lasso_reg] visualize_coefficient(models)
- 좋아요수
- 0
- 댓글수
- 3
- 조회수
- 294





