-
Logistic Regression(로지스틱 회귀분석) 예제(날씨 데이터) - train_test_split(과적합 방지), 머신러닝의 포용성(inclusion, tolerance)Python 데이터 분석 2022. 11. 17. 17:12
# 날씨정보 데이터로 이항분류 : 내일 비가 올지? import statsmodels.formula.api as smf import numpy as np import pandas as pd import statsmodels.api as sm from sklearn.model_selection import train_test_split data = pd.read_csv('../testdata/weather.csv') print(data.head(2), data.shape) # (366, 12) data2 = pd.DataFrame() data2 = data.drop(['Date','RainToday'], axis = 1) data2['RainTomorrow'] = data2['RainTomorrow'].map({'Yes':1, 'No':0}) # Dummy print(data2.head(2)) print(data2['RainTomorrow'].unique()) # [1 0] # RainTomorrow : 종속변수, 그 외는 독립변수 # train / test split == 7 : 3 train, test = train_test_split(data2, test_size = 0.3, random_state=42) # random_state 숫자가 랜덤으로 뽑히기 때문에 고정 print(train.shape, test.shape) # (256, 10) (110, 10) col_select = '+'.join(train.columns.difference(['RainTomorrow'])) # RainTomorrow 뺀 나머지 칼럼을 엮어준다. my_formula = 'RainTomorrow ~ ' + col_select print(my_formula) # model = smf.glm(formula = my_formula, data = train, family = sm.families.Binomial()).fit() model = smf.logit(formula = my_formula, data = train, family = sm.families.Binomial()).fit() print(model.summary()) # P>|z| 값이 0.05를 월등히 넘어가면 뺄지 고민해야 된다. # print(model.params) # coef 값만 호출할 수 있다. print('예측값 :', np.around(model.predict(test)[:10].values)) print('예측값 :', np.rint(model.predict(test)[:10].values)) # rint는 around함수랑 비슷함 print('실제값 :', test['RainTomorrow'][:10].values) # 정확도 conf_mat = model.pred_table() # logit이 아닌 glm일 경우 = AttributeError: 'GLMResults' object has no attribute 'pred_table' print('conf_mat : \n', conf_mat) print('분류 정확도 :', (conf_mat[0][0] + conf_mat[1][1]) / len(train)) from sklearn.metrics import accuracy_score pred = model.predict(test) print('분류 정확도 :', accuracy_score(test['RainTomorrow'], np.around(pred))) # 실제값, 예측값 <console> Date MinTemp MaxTemp Rainfall ... Cloud Temp RainToday RainTomorrow 0 2016-11-01 8.0 24.3 0.0 ... 7 23.6 No Yes 1 2016-11-02 14.0 26.9 3.6 ... 3 25.7 Yes Yes [2 rows x 12 columns] (366, 12) MinTemp MaxTemp Rainfall Sunshine ... Pressure Cloud Temp RainTomorrow 0 8.0 24.3 0.0 6.3 ... 1015.0 7 23.6 1 1 14.0 26.9 3.6 9.7 ... 1008.4 3 25.7 1 [2 rows x 10 columns] [1 0] (256, 10) (110, 10) RainTomorrow ~ Cloud+Humidity+MaxTemp+MinTemp+Pressure+Rainfall+Sunshine+Temp+WindSpeed C:\anaconda3\lib\site-packages\statsmodels\base\model.py:127: ValueWarning: unknown kwargs ['family'] warnings.warn(msg, ValueWarning) Optimization terminated successfully. Current function value: 0.288251 Iterations 8 C:\anaconda3\lib\site-packages\statsmodels\base\model.py:127: ValueWarning: unknown kwargs ['family'] warnings.warn(msg, ValueWarning) Logit Regression Results ============================================================================== Dep. Variable: RainTomorrow No. Observations: 253 Model: Logit Df Residuals: 243 Method: MLE Df Model: 9 Date: Thu, 17 Nov 2022 Pseudo R-squ.: 0.3995 Time: 17:01:06 Log-Likelihood: -72.927 converged: True LL-Null: -121.45 Covariance Type: nonrobust LLR p-value: 6.232e-17 ============================================================================== coef std err z P>|z| [0.025 0.975] ------------------------------------------------------------------------------ Intercept 219.3889 53.366 4.111 0.000 114.794 323.984 Cloud 0.0616 0.118 0.523 0.601 -0.169 0.293 Humidity 0.0554 0.028 1.966 0.049 0.000 0.111 MaxTemp 0.1746 0.269 0.649 0.516 -0.353 0.702 MinTemp -0.1360 0.077 -1.758 0.079 -0.288 0.016 Pressure -0.2216 0.052 -4.276 0.000 -0.323 -0.120 Rainfall -0.1362 0.078 -1.737 0.082 -0.290 0.018 Sunshine -0.3197 0.117 -2.727 0.006 -0.550 -0.090 Temp 0.0428 0.272 0.157 0.875 -0.489 0.575 WindSpeed 0.0038 0.032 0.119 0.906 -0.059 0.066 ============================================================================== 예측값 : [0. 0. 0. 0. 0. 0. 1. 1. 0. 0.] 예측값 : [0. 0. 0. 0. 0. 0. 1. 1. 0. 0.] 실제값 : [0 0 0 0 0 0 1 1 0 0] conf_mat : [[197. 9.] [ 21. 26.]] 분류 정확도 : 0.87109375 분류 정확도 : 0.8727272727272727
정확도 검사를 하기 위해서는 logit()함수를 사용해야된다. glm()함수는 안 된다.
머신러닝의 포용성(inclusion, tolerance)
통계 및 추론 모델로 새로운 값을 예측(정량, 정성)
y = w * 2 + 0 수학에서는 100%의 답을 원한다.
통계에서는 4의 주변값이 나올 수 있도록 학습을 한다.
예를 들어 개 이미지 분류를 하는 경우 꼬리가 없는 개도 정확하게 분류되도록 하는 것이 머신러닝의 목적이다.
포용성이 있는 모델이라 함은 데이터 분류 인식률이 80%, 90% 등인 것이 100% 인 경우보다 더 효과적이다.'Python 데이터 분석' 카테고리의 다른 글
Logistic Regression(로지스틱 회귀분석) 예제(당뇨 데이터), 로지스틱 회귀분석 후 저장 후 불러쓰기 (0) 2022.11.18 Logistic Regression(로지스틱 회귀분석) 예제(외식 데이터) (0) 2022.11.17 Python 데이터분석 기초 54 - Logistic Regression(로지스틱 회귀분석) (0) 2022.11.17 다중회귀모델 예제(degree) (0) 2022.11.17 Python 데이터분석 기초 53 - 다항회귀모델, 차원확대, 차원축소 (0) 2022.11.17