당신은 주제를 찾고 있습니까 “파이썬 로지스틱 회귀분석 – [파이썬 실습] 로지스틱회귀 모델“? 다음 카테고리의 웹사이트 ppa.charoenmotorcycles.com 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.charoenmotorcycles.com/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 김성범[ 소장 / 인공지능공학연구소 ] 이(가) 작성한 기사에는 조회수 2,570회 및 좋아요 22개 개의 좋아요가 있습니다.
파이썬 로지스틱 회귀분석 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 [파이썬 실습] 로지스틱회귀 모델 – 파이썬 로지스틱 회귀분석 주제에 대한 세부정보를 참조하세요
파이썬 로지스틱 회귀분석 주제에 대한 자세한 내용은 여기를 참조하세요.
로지스틱회귀(Logistic Regression) – 파이썬 코드 예제
본 포스팅에서는 파이썬 라이브러리 scikit-learn을 통해 로지스틱회귀(Logistic Regression) 분석을 직접 수행하는 예제를 소개한다.
Source: hleecaster.com
Date Published: 2/4/2022
View: 5167
6.1 로지스틱 회귀분석 – 데이터 사이언스 스쿨
로지스틱(Logistic) 회귀분석은 회귀분석이라는 명칭과 달리 회귀분석 문제와 분류문제 모두에 사용할 수 있다. 로지스틱 회귀분석 모형에서는 종속변수가 이항분포를 …
Source: datascienceschool.net
Date Published: 10/18/2022
View: 972
[Sklearn] 파이썬 로지스틱 회귀분석 예제(사이킷런 유방암 …
파이썬 사이킷런 로지스틱 회귀분석 이번 글에서는 사이킷런의 유방암 데이터셋을 활용하여, 로지스틱 회귀 모델을 학습시켜보고, 성능 평가까지 진행 …
Source: jimmy-ai.tistory.com
Date Published: 10/1/2021
View: 2994
[Python]로지스틱회귀분석 실습 – SH의 학습노트
여태 단순/다중회귀분석과 다중공선성을 해결하기 위한 방법을 Python코드로 알아보았다. 이제 sigmo function을 이용한 분류/예측을 하는 로지스틱 …
Source: todayisbetterthanyesterday.tistory.com
Date Published: 8/21/2022
View: 3147
로지스틱 회귀분석을 이용한 데이터 분석 – Just Fighting
파이썬에서 로지스틱 회귀모형을 만들때는. 아래 이 코드를 사용하면 된다. from sklearn.linear_model import LogisticRegression X = 독립변수 y …
Source: yensr.tistory.com
Date Published: 3/5/2022
View: 7121
[머신러닝] [Python] 3. Logistic Regression (로지스틱 회귀)
살았는지 죽었는지 확인하는 컬럼이고 1은 생존, 0는 사망을 의미한다. 2. 데이터 전처리Permalink. 분석에 사용할 Feature 선택Permalink. 먼저 생존여부 …
Source: idkim97.github.io
Date Published: 2/19/2022
View: 552
[Python] 로지스틱 회귀(Logistic Regression)와 이진 교차 …
분석하고자 하는 대상(특징)이 2개 또는 그 이상의 집단으로 나누어져 있을 때, 개별 관측치들이 어느 집단에 분류될 수 있는지에 대해 분석하고 예측하는 …
Source: aliencoder.tistory.com
Date Published: 10/27/2021
View: 2295
파이썬 데이터분석 로지스틱회귀분석 – 정리하는 블로그
파이썬 데이터분석 로지스틱회귀분석. 자카리 2019. 2. 28. 15:23. 안녕하세요. 오늘은 로지스틱회귀분석을 통해 분류예측분석과 독립변수가 종속변수여부에 어떤 영향 …
Source: no17.tistory.com
Date Published: 6/30/2021
View: 2670
로지스틱 회귀 파이썬 연습 예제1 – 놀이공원 데이터
statsmodels라는 파이썬 패키지를 사용한다. # statsmodels package loading import statsmodels.api as sm # logistic regression feature = data[‘Offer …
Source: lucy-the-marketer.kr
Date Published: 5/10/2022
View: 9316
파이썬에서 로지스틱 회귀 만들기 – 블로그 – Quish
즉, 로지스틱 회귀 모델은 P(Y=1)를 X의 함수로 예측합니다. ad. 로지스틱 회귀 가정. 이진 로지스틱 회귀 분석에서는 종속 변수 …
Source: ko.quish.tv
Date Published: 11/13/2021
View: 6606
주제와 관련된 이미지 파이썬 로지스틱 회귀분석
주제와 관련된 더 많은 사진을 참조하십시오 [파이썬 실습] 로지스틱회귀 모델. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 파이썬 로지스틱 회귀분석
- Author: 김성범[ 소장 / 인공지능공학연구소 ]
- Views: 조회수 2,570회
- Likes: 좋아요 22개
- Date Published: 2021. 4. 1.
- Video Url link: https://www.youtube.com/watch?v=TLCakPDj7e8
6.1 로지스틱 회귀분석 — 데이터 사이언스 스쿨
Optimization terminated successfully. Current function value: 0.059493 Iterations 12 Logit Regression Results ============================================================================== Dep. Variable: species No. Observations: 100 Model: Logit Df Residuals: 95 Method: MLE Df Model: 4 Date: Sat, 06 Jun 2020 Pseudo R-squ.: 0.9142 Time: 10:01:37 Log-Likelihood: -5.9493 converged: True LL-Null: -69.315 Covariance Type: nonrobust LLR p-value: 1.947e-26 ================================================================================ coef std err z P>|z| [0.025 0.975] ——————————————————————————– Intercept -42.6378 25.708 -1.659 0.097 -93.024 7.748 sepal_length -2.4652 2.394 -1.030 0.303 -7.158 2.228 sepal_width -6.6809 4.480 -1.491 0.136 -15.461 2.099 petal_length 9.4294 4.737 1.990 0.047 0.145 18.714 petal_width 18.2861 9.743 1.877 0.061 -0.809 37.381 ================================================================================ Possibly complete quasi-separation: A fraction 0.60 of observations can be perfectly predicted. This might indicate that there is complete quasi-separation. In this case some parameters will not be identified.
[Sklearn] 파이썬 로지스틱 회귀분석 예제(사이킷런 유방암 데이터셋)
반응형
파이썬 사이킷런 로지스틱 회귀분석
이번 글에서는 사이킷런의 유방암 데이터셋을 활용하여,
로지스틱 회귀 모델을 학습시켜보고,
성능 평가까지 진행하는 예제를 간단히 살펴보도록 하겠습니다.
사이킷런 유방암 데이터셋 불러오기
유방암 데이터셋을 불러오고, 데이터프레임으로 만드는 예시 코드입니다.
총 30가지 종류의 feature가 있지만, 여기서는 대표적으로 4가지 feature만 사용하여
로지스틱 모델 학습을 진행해보도록 하겠습니다.
import pandas as pd from sklearn import datasets # 유방암 데이터셋 로드 data = datasets.load_breast_cancer() df = pd.DataFrame(data.data, columns = data.feature_names) # 일부 feature만 사용 df = df[[‘mean radius’, ‘mean texture’, ‘mean area’, ‘mean symmetry’]] # 1이면 양성 종양, 0이면 악성 종양 라벨 열 지정 df[‘target’] = data.target df
만들어진 데이터프레임은 다음과 같습니다.
총 569 행의 데이터가 존재하며,
악성 종양(target = 0)은 212개, 양성 종양(target = 1)은 357개가 존재합니다.
양쪽 클래스 라벨의 개수가 다소 불일치하는 특징을 가지고 있어
원래는 균일하게 샘플링하는 과정 등이 필요하지만,
여기서는 feature selection이나 균등 샘플링 등 전처리 과정은 다루지 않도록 하겠습니다.
이제 4가지 선별된 feature의 값을 기준으로 target이 0일지 1일지를 맞추어보는
로지스틱 회귀 모델을 학습해보겠습니다.
파이썬 로지스틱 회귀분석 모델 학습 : LogisticRegression
우선, 성능 평가를 위하여 train / test 데이터셋 분리를 먼저 진행하겠습니다.
테스트 데이터 셋의 비율은 20%로 하였습니다.
from sklearn.model_selection import train_test_split # train, test 셋 분리 X = df[[‘mean radius’, ‘mean texture’, ‘mean area’, ‘mean symmetry’]] y = df[‘target’] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
이제, train 데이터 셋을 기준으로, 로지스틱 회귀분석 모델을 학습하도록 하겠습니다.
여기서는 특별히 하이퍼 파라미터를 따로 설정하지는 않아보도록 하겠습니다.
from sklearn.linear_model import LogisticRegression # 로지스틱 회귀 모델 학습 model = LogisticRegression(penalty = ‘l2’) model.fit(X_train, y_train)
반응형
로지스틱 회귀분석 대표 하이퍼 파라미터 종류
사이킷런 로지스틱 회귀분석 함수인 LogisticRegression의 세부적인 사항을 결정하는
하이퍼 파라미터 종류 몇 가지를 소개하도록 하겠습니다.
하이퍼 파라미터 설정 여부에 따라 성능 및 학습 시간이 크게 달라질 수 있습니다.
penalty : 설정 가능 값 : ‘l1’, ‘l2’, ‘elasticnet’, ‘none’ , 기본 값 : ‘l2’
1차, 2차, 1차+2차 혼합, 미규제 중에서 복잡한 모델에 대한 규제 방법을 선택
C : penalty에 대한 계수 설정, 기본 값은 1.0, 높을 수록 복잡한 모델에 대한 규제 강화
solver : 설정 가능 값 : ‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’ 기본 값 : ‘lbfgs’
로지스틱 회귀는 비선형 방정식이라 근사 알고리즘으로 접근하는데, 알고리즘의 종류 선택
특정 solver는 일부 penalty 방식을 지원하지 않을 수도 있음
random_state : 실행 시마다 결과를 고정하고 싶다면 임의의 정수로 설정
근사 알고리즘의 초기 상태가 실행 시마다 달라질 수 있어서 생기는 원리
로지스틱 회귀분석 성능 평가
위에서 학습된 모델을 기준으로, test set 데이터에 대하여 target을 예측해보고,
실제 class와 일치하는 비율인 정확도를 통하여 성능 평가를 진행해보겠습니다.
from sklearn.metrics import accuracy_score # 로지스틱 모델 학습 성능 비교 y_pred = model.predict(X_test) # 예측 결과 라벨 # 정확도 측정 accuracy_score(y_pred, y_test) # 0.9298245614035088
여기서는 약 93% 정도의 정확도가 측정되었습니다.
feature 종류 변경이나 하이퍼 파라미터의 값 조절 등의 과정이 이루어진다면,
더 높은 정확도에 도전도 가능합니다.
반응형
[Python]로지스틱회귀분석 실습
실습에 사용될 데이터 : 개인대출 데이터
Personal Loan.csv 0.10MB
—–target
Personal Loan ( 0 or 1 의 값을 갖는 변수이다. )
—–feature
Experience 경력
Income 수입
Famliy 가족단위
CCAvg 월 카드사용량
Education 교육수준 (1: undergrad; 2, Graduate; 3; Advance )
Mortgage 가계대출
Securities account 유가증권계좌유무
CD account 양도예금증서 계좌 유무
Online 온라인계좌유무
CreidtCard 신용카드유무
여태 단순/다중회귀분석과 다중공선성을 해결하기 위한 방법을 Python코드로 알아보았다.
이제 sigmoid function을 이용한 분류/예측을 하는 로지스틱 회귀분석을 실습하려고 한다.
로지스틱 회귀분석에 대한 상세한 정의와 원리를 알고 싶다면, 내가 봤을 때 상세하게 보았던 블로그의 링크를 남겨놓겠다
https://nittaku.tistory.com/478
< 간단한 설명 >
간단하게 로지스틱모델을 요약하자면 sigmoid function을 사용하는 분류/예측 모델이다. 보통 임계값(cut-off)를 설정하여 0 or 1(이진형)로 값을 변환시킨다. 이는 말로 풀어설명하자면 발생할 확률/발생하지 않을 확률을 구하는 것이다. 이를 사용하여 나타낸 지표 중 하나가 승산비(Odds – 발생할 확률/발생하지 않을 확률)이다.
여기서는 Python을 통한 로지스틱회귀분석의 실습을 위해,
1. 데이터를 로드/간단한 전처리
2. 로지스틱 회귀모델을 사용하여 예측
3. ROC Curve를 통해 모델의 성능확인
을 하는 과정을 진행할 것이다.
로지스틱 회귀분석
# 필요한 Library import numpy as np import pandas as pd from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix from sklearn.metrics import accuracy_score, roc_auc_score, roc_curve import statsmodels.api as sm import matplotlib.pyplot as plt import time # Personal Loan 데이터 불러오기 ploan = pd.read_csv(“./Personal Loan.csv”) # 사용하지 않을 변수 제거 ID, zip code ploan_processed = ploan.dropna().drop[“ID”,”ZIP code”], axis=1, inplace = False) # 회귀모델에서 b0를 위한 상수항 추가 ploan_processed = sm.add_constant(ploan_processed,has_constant = “add”) ploan_processed.head()
ploan_processed.head()
설명변수 X와 타겟변수 Y/학습과 평가 데이터를 분리
# 대출여부는 1 or 0으로 결정된다. 즉 target이 1/0의 값을 갖기에 # 로지스틱 회귀모형이 적합하다. feature_columns = ploan_processed.columns.difference([“Personal Loan”]) X = ploan_processed[feature_columns] y = ploan_processed[“Personal Loan”] train_x, test_X ,train_y, test_y = train_test_split(X, y, stratify=y,train_size=0.7,test_size=0.3,random_state=1) print(train_x.shape, test_x.shape, train_y.shape, test_y.shape)
로지스틱 회귀모형 모델링 y = F(x)
# 로지스틱 모형 적합 model = sm.Logit(train_y, train_x) results = model.fit(method = “newton”) # 다변수함수에 뉴턴방법을 적용한 로지스틱 회귀모형
모델적합이 완료되었다는 결과
results.summary()
로지스틱 회귀모델 summary, 제목에 logit regression이라고 명시된다.
results.params
results.params
모델적합으로 인해 위의 회귀계수가 출력되었다. 이는 아직 로지스틱의 log형태가 취해진 결과이기에 바로 확률로 해석하는 오류를 범해서는 안된다. 그렇기에 np.exp(results.params)의 결과를 확인할 필요가 있다.
np.exp(results.params)
np.exp(results.params)
– 나이가 한 살 많을수록 대출할 확률이 1.024배 높다.
– 수입이 1단위 높을수록 대출할 확률이 1.05배 높다.
– 가족 구성원수가 1명 많을수록 대출할 확률이 2.13배 높다.
이와 같은 방법을 통해서 직관적인 해석을 진행할 수 있다. 다음 y_hat을 예측해보자.
pred_y = results.predict(test_x) pred_y
pred_y 결과
위의 결과는 0~1사이의 logit을 나타낸 결과이다. Target 데이터는 0 또는 1의 이진형 변수인데 예측값은 다르게 나왔다. 이는 1이될 확률을 나타내는 결과이다. 그렇기에 우리는 이 logit에 임계값을 설정하여 임계값 이상은 =1 / 임계값 이하는 0으로 분류해줄 필요가 있다.
# 임계값 함수 def cut_off(y, threshold) : Y = y.copy() # 대문자 Y를 새로운 변수로 하여 기존의 y값에 영향이 가지 않도록 한다. Y[Y>threshold] = 1 Y[Y
로지스틱 회귀분석을 이용한 데이터 분석
728×90
로지스틱 회귀분석은 반응변수 가
“성공”, “실패”로 나타나는 이항변수인 경우 사용하는 분석법이다.
로지스틱 회귀모형은 아래 식과 같이 표현된다.
파이썬에서 로지스틱 회귀모형을 만들때는
아래 이 코드를 사용하면 된다.
from sklearn.linear_model import LogisticRegression X = 독립변수 y = 종속변수 X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X,y) model = LogisticRegression() model.fit(X_train, y_train)
< 사용 예시 >
사용한 데이터는 아래 사진과 같다.
이 데이터를 가공해 로지스틱 회귀분석에 사용할 수 있도록 했다.
먼저 계약건수가 1이상이면 1, 아니면 0으로 변수 값을 임의로 변경했다.
변경한 데이터는 아래와 같다.
종속변수는 ‘계약건수_0’으로 이번달 계약여부를 의미한다.
독립변수로는 계약건수_0을 제외한 모든 변수이다.
‘계약건수_(번호)’는 1-5개월 전의 계약여부를 나타내는 변수이며,
명목형 변수인 ‘계약방법’과 ‘우수제품여부’의 더미변수를 생성했다.
더미변수를 만드는 방법은 이 코드를 사용하면 된다.
pd.get_dummies()
#예시 model_data = pd.get_dummies(model_data.iloc[:,3:])
*** 22/05/06 추가
drop_first를 사용하면 첫번째 컬럼은 삭제된다.
model_data = pd.get_dummies(model_data.iloc[:,3:], drop_first=True)
***
로지스틱 회귀분석을 해보자.
# 로지스틱 회귀분석 from sklearn.linear_model import LogisticRegression X = model_data2.iloc[:,1:] y = model_data2[“계약건수_0”] X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X,y) model2 = LogisticRegression() model2.fit(X_train, y_train)
# 테스트 데이터를 이용한 정확도 model2.score(X_test, y_test)
# coeffitient 값 coef = pd.DataFrame({“feature_names”:X.columns, “coefficient”:model2.coef_[0]}) coef
# 새로운 테스트데이터 testdata = pd.DataFrame([[1,1,1,1,0,0,1,0,0,1,0]]) print(model2.predict(testdata)) print(model2.predict_proba(testdata))
새로운 테스트 데이터의 예측값은 1, 즉 계약이 있을 것이라고 예측되었으며,
계약이 없을 확률은 20%, 계약이 있을 확률은 79.6% 로 예상되었다.
최종 모델과 해석이 궁금하다면 ▼
2022.02.16 – [Statistics/Python] – 로지스틱 회귀분석을 이용한 데이터 분석 2
728×90
[머신러닝] [Python] 3. Logistic Regression (로지스틱 회귀)
이번 포스팅에서는 Categorical 변수를 예측하는 모델인 Logistic Regression ( 로지스틱 회귀)에 대해 살펴보겠습니다. 포스팅에서 사용된 자료에 대해서는 가천대학교 소프트웨어학과 김원 교수님의 강의를 기반으로 작성되었음을 밝힙니다.
Linear Regression ( 선형 회귀 )
Logistic Regression에 대한 설명에 앞서 기본적인 이해를 위해 선형 회귀에 대해서 간단하게 알아보겠습니다.
시험 공부하는 시간을 늘리면 늘릴 수록 성적이 잘 나옵니다. 하루에 걷는 횟수를 늘릴 수록, 몸무게는 줄어듭니다. 집의 평수가 클수록, 집의 매매 가격은 비싼 경향이 있습니다. 이는 수학적으로 생각해보면 어떤 요인의 수치에 따라서 특정 요인의 수치가 영향을 받고있다고 말할 수 있습니다. 조금 더 수학적인 표현을 써보면 어떤 변수의 값에 따라서 특정 변수의 값이 영향을 받고 있다고 볼 수 있습니다. 다른 변수의 값을 변하게 하는 변수를 x, 변수 x에 의해서 값이 종속적으로 변하는 변수 y라고 해봅시다.
이때 변수 x의 값은 독립적으로 변할 수 있는 것에 반해, y값은 계속해서 x의 값에 의해서, 종속적으로 결정되므로 x를 독립 변수, y를 종속 변수라고도 합니다. 선형 회귀는 한 개 이상의 독립 변수 x와 y의 선형 관계를 모델링합니다. 만약, 독립 변수 x가 1개라면 단순 선형 회귀라고 합니다.
생각해보니 집의 매매가격은 단순히 집의 평수가 크다고 결정되는 것이 아니라, 집의 층수, 방의 개수, 역세권인지 아닌지 등 여러가지 요소에 영향을 많이 받는것 같습니다. 이제 이러한 다수의 요소를 가지고 집의 매매 가격을 예측해 보고 싶습니다. y(집의 매매가격)는 여전히 1개이지만 x(층수, 방개수, 역세권 등)는 여러개가 되었습니다. 이를 Multiple Linear Regression (다중 선형 회귀)라고 부릅니다.
Logistic Regression ( 로지스틱 회귀)
Logistic Regression은 데이터가 어떤 범주에 속할 확률을 0에서 1사이의 값으로 예측하고 그 확률에 따라 가능성이 더 높은 범주에 속하는 것으로 분류해주는 지도 학습 알고리즘이다.
스펨 메일 분류기 같은 예시를 생각하면 쉬운데, 어떤 메일을 받았을 때 그 메일이 스팸일 확률이 0.5이상이면 스팸으로 분류하고, 메일이 스팸일 확률이 0.5보다 낮으면 일반 메일로 분류하는 것이다. 이렇게 데이터가 2개의 범주 중 하나에 속하도록 결정하는 것을 Binary Classification (2진 분류)라고 한다.
로지스틱 회귀 역시 X와 Y의 관계식으로 설명 할 수 있는데, X는 Binary(양분된), Categorical(범주형), Continuous(연속형) 한 데이터 모두를 가질 수 있지만, Y는 Binary한 데이터만을 가질 수 있다.
예시를 보며 자세히 살펴보자.
X로 Age가 주어졌고 Y로는 심장병 유무가 주어진 데이터셋이다.
이를 Linear Regression으로 나타내면 아래 그림과 같다.
한눈에 보기에도 이상하다. Y가 Binary한 데이터로 주어졌기 때문에 Linear Regression으로 표현하면 정확도가 떨어지는 문제가 발생한다. 이를 해결하기 위해 데이터셋을 일부 수정한 뒤 Logistic Regression으로 나타내 보겠다.
X로 주어진 Age를 나이대별로 묶은 뒤 심장병에 걸린 사람수를 나타낸 데이터셋이다. 이를 Logistic Regression으로 나타내면 아래 그림과 같다.
Y값은 0~1사이의 값으로 표현되며 y<0.5일때는 0으로 치환되고 y>=0.5일때는 1로 치환되는 결과를 보여준다. 위의 그래프처럼 나타내는 것을 Sigmoid Function (시그모이드 함수) 이라고 부른다.
이처럼 Y가 Binary한 데이터로 주어질때는 Linear Regression을 사용하는 것 보다는 Logistic Regression을 사용하는 것이 훨씬 정확도가 높다.
Logit(로짓) – log + odds
Logistic Regression을 구현하는 것은 어렵지 않다. 파이썬에 있는 scikit-learn 라이브러리를 사용하면 코드 몇줄로 바로 구현할 수 있다. 그러나 그 작동 원리를 알고 구현하는 것과 모른채 blackbox식으로 구현하는 것은 엄연히 다르다. Logistic Regression의 작동 원리를 공부하기 위해 선행되어 알아야만 하는 몇가지 Keyword를 소개하겠다.
Odds
Odds는 어떤 사건이 발생할 확률을 발생하지 않을 확률로 나눈 값을 의미한다. 어떤 사건이 일어날 확률을 p라고 했을때 Odds값은 p / (1-p) 이다.
예를 들어 p가 0.2라면 Odds = 0.2 / (1 – 0.8) = 0.25 이다.
Odds Ratio
Odds Ratio는 두개의 Odds의 비율을 나타내는 값이다.
예를들어 Odds1 = 0.25 이고 Odds2 = 0.30이면 Odds Ratio = 0.25 / 0.30 = 0.833이다.
Logit
사실상 Logit을 설명하기 위해 앞서 Odds와 Odds Ratio를 소개했다고 봐도 무방하다.
확률 p의 Logit은 다음과 같이 정의된다.
즉, Odds에 자연로그를 씌운 형태로 Logit이라는 말이 Log + Odds에서 나온말이다.
예를들어, p=0.5라고 하면 Odds = 0.5 / 0.5 = 1, Logit = ln(1) = 0 이된다.
Solver Algorithms for Logistic Regression
파이썬의 Scikit-Learn에서는 다섯개의 알고리즘으로 Logic Regression을 해결한다. 각각의 알고리즘이 어떤식으로 동작하는지는 내용이 너무 방대하므로 설명하지 않겠고 그냥 이런게 있구나 하고 넘어가면 좋을 것 같다.
newton-cg
lbfgs
liblinear
sag
saga
Logistic Regression Python Code
이제 로지스틱 회귀를 파이썬으로 직접 구현하는 연습을 해보자.
1. 데이터 불러오기
먼저 seaborn에 내재된 타이타닉 데이터셋을 불러오도록 하자.
import seaborn as sns passengers = sns . load_dataset ( ‘titanic’ ) print ( passengers . shape ) print ( passengers . head ())
총 891명의 데이터가 있고 총 15개의 컬럼이 있는걸 확인했다.
우리의 Target 데이터는 survived 이다. 살았는지 죽었는지 확인하는 컬럼이고 1은 생존, 0는 사망을 의미한다.
2. 데이터 전처리
분석에 사용할 Feature 선택
먼저 생존여부에 큰 영향을 미쳤을 것으로 예상되는 컬럼을 sex, age, pclass로 지정했다. 여성, 어린이, 1/2/3등석 순으로 살아남을 확률이 높다고 가정해본 것이다.
문자열을 숫자로 변환
sex는 male과 female로 설정되있으므로 이를 숫자 데이터 1과 0으로 바꿔주자. 여성이 살아남을 확률이 높을것으로 예상하므로 남성을 0, 여성을 1이라고 바꿔주자.
passengers [ ‘sex’ ] = passengers [ ‘sex’ ]. map ({ ‘female’ : 1 , ‘male’ : 0 })
결측치 채워주기
데이터를 살펴보면 age가 비어있는 경우가 있다. 이는 age의 평균치로 대체하겠다.
passengers [ ‘age’ ]. fillna ( value = passengers [ ‘age’ ]. mean (), inplace = True )
Feature 분리하기
pclass의 경우 1등석에 탔는지, 2등석에 탔는지 각각의 feature로 만들어주기 위해 컬럼을 새로 생성해 분류하겠다.
passengers [ ‘FirstClass’ ] = passengers [ ‘pclass’ ]. apply ( lambda x : 1 if x == 1 else 0 ) passengers [ ‘SecondClass’ ] = passengers [ ‘pclass’ ]. apply ( lambda x : 1 if x == 2 else 0 )
features = passengers [[ ‘sex’ , ‘age’ , ‘FirstClass’ , ‘SecondClass’ ]] survival = passengers [ ‘survived’ ]
3. Train/Test set 분리하기
from sklearn.model_selection import train_test_split train_features , test_features , train_labels , test_labels = train_test_split ( features , survival )
4. 데이터 정규화(Scaling) 하기
StandardScaler를 사용해 데이터를 정규화 하였다.
from sklearn.preprocessing import StandardScaler scaler = StandardScaler () train_features = scaler . fit_transform ( train_features ) test_features = scaler . transform ( test_features )
5. 모델 생성 및 평가하기
from sklearn.linear_model import LogisticRegression model = LogisticRegression () model . fit ( train_features , train_labels )
model을 생성해 LogisticRegression 함수를 넣어주면 끝이다.
이제 학습세트로 정확도를 바로 알아보자.
print ( model . score ( train_features , train_labels ))
결과 :
0.7919161676646707
79%의 정확도를 가진다고 나온다.
Test Set에서도 정확도를 확인해보자.
print ( model . score ( test_features , test_labels ))
결과 :
0.766816143498
76%의 정확도를 가진다고 나온다.
이제 각 Feature들의 계수(Coefficients)를 확인해볼 차례이다. 어떤 Feature가 생존에 큰 영향을 주는지 확인해 볼 수 있다.
print ( model . coef_ )
결과 :
[[ 1.21512352 -0.34590989 0.99346516 0.49466482]]sex, age, firstclass, secondclass 순으로 넣었으므로 그순서대로 확인해주면 된다. 성별은 1에 가까우므로 여자이고, 일등석 탑승 여부가 중요하다는 걸 알 수 있다. 반면에 나이는 음수가 나오는데 이는 나이가 많을수록 생존 확률이 낮아진다는 의미로 해석할 수 있다.
5. 예측하기
이번에는 새로운 임의의 데이터를 넣어서 예측해보자.
Jack = np . array ([ 0.0 , 20.0 , 0.0 , 0.0 ]) Rose = np . array ([ 1.0 , 17.0 , 1.0 , 0.0 ]) ME = np . array ([ 0.0 , 32.0 , 1.0 , 0.0 ]) sample_passengers = np . array ([ Jack , Rose , ME ])
이제 스케일링을 다시해주자.
sample_passengers = scaler . transform ( sample_passengers )
마지막으로 예측을 해보자.
print ( model . predict ( sample_passengers )) print ( model . predict_proba ( sample_passengers ))
[0 1 0] [[0.88995985 0.11004015] [0.05240318 0.94759682] [0.51644668 0.48355332]]Jack과 나는 죽고 Rose만 산다..
[Python] 로지스틱 회귀(Logistic Regression)와 이진 교차 엔트로피(Binary Cross Entropy)의 이해와 구현
반응형
Fig 1. 선형 회귀와 로지스틱 회귀
로지스틱 회귀(Logistic Regression)는 종속 변수(y)가 범주형(categorical) 변수인 경우(binary)에도 다중 선형회귀(MLR)를 적용하기 위해 고안된 것이다. 분석하고자 하는 대상(특징)이 2개 또는 그 이상의 집단으로 나누어져 있을 때, 개별 관측치들이 어느 집단에 분류될 수 있는지에 대해 분석하고 예측하는 모델을 개발하는 통계적 기법이다. 이름만 회귀이지 사실 분류 알고리즘이다.
예를 들어 독립 변수인 혈압은 숫자 그 자체로 의미를 지니는 변수이지만, 암 발생 여부는 그렇다 아니다와 같이 이분법으로 나누게 된다. 발병(1)과 정상(0) 사이에 중간 범주가 없을뿐더러 심지어 정상을 1, 발병을 0으로 바꾸어도 큰 상관이 없다. 종속변수의 숫자는 큰 의미를 가지지 않는다는 뜻이다.
따라서 회귀식의 결과값이 0, 1로만 도출될 때, 이에 근사하는 직선 혹은 모델을 만드는 것이 힘들다. 이러한 베르누이 분포를 따르는 이진 데이터를 분류할 때 가장 많이 활용되는 것이 로지스틱 회귀이다. 물론 다중 클래스 분류 문제로도 확장은 가능하다.
Fig 2. 범주형 종속 변수에 대한 선형회귀
위와 같은 문제점을 해결하기 위해 종속 변수를 확률 변수로 치환하는 방법을 적용한다. 이를 통해 (0, 1)을 0≤P(Y=1│X)≤1로 나타낼 수 있다. 하지만 이 역시 p(x)= \( wx+b \)의 모델은 회귀선에 의해 음수값을 추정하거나, 경우에 따라 1을 초과하는 추정값이 발생할 수도 있다.
Fig 3. 0~1 범위 외의 추정값
이는 확률값 P를 -∞부터 ∞까지 확장하여 해결할 수 있고, 따라서 임의의 사건이 발생하지 않을 확률 대비 일어날 확률의 비율을 뜻하는 오즈(Odds)를 이용한다. 오즈는 직역하면 가능성이다.
$$ p(x)=wx+b $$
$$ odds=\frac{p(x)}{1-p(x)} $$
이를 통해 계산되는 y의 결과값은 [0, ∞]이다. 여기에 로그를 취하여 로짓(logit) 변환을 수행한다.
$$ logit(p)=log(odds)=z $$
이 과정들을 수행하면 최종적으로 아래와 같은 로지스틱 회귀 가설이 완성된다.
$$ logitstic(z)=μ(z)=\frac{1}{1+e^{-z}}=\frac{1}{1+e^{-(wx+b)}} $$
이렇게 범위가 무한한 입력값들을 시그모이드(로지스틱) 함수를 이용해 결과값을 [0,1]의 범위로 압축하였다.
이런 형태의 이항 분류(binary classification)에 적절한 함수로 시그모이드(sigmoid)함수가 있다. 그래프의 모양은 S자 형태로 중심축 (x=0)을 중심으로 좌측은 0으로 수렴하고 우측은 1로 수렴한다.
Fig 4. Sigmoid 함수
이제 z값은 사건이 발생할 확률을 의미하게 되었고 여기에 0~1 사이의 값을 가지는 임계값을 설정하여 사건이 발생할 확률이 어느 이상이어야 결과(y)를 1로 할지 결정한 뒤, 이를 최적화하는 학습 계수들을 학습하면 된다.
z=0 일 때, μ = 0.5
일 때, z>0 일 때, μ > 0.5이면 \( \hat y \)=1
일 때, z<0 일 때, μ < 0.5 이면 \( \hat y \) = 0 즉, z가 분류 모형의 판별 함수(decision function)의 역할을 한다. 로지스틱 회귀분석에서는 판별 함수 수식으로 선형 함수를 사용한다. 이렇게 z를 이용해 y가 0 또는 1이 되는 것을 정하는 기준인 결정 경계(Decision boundary)를 정한다. Fig 5. 결정 경계 다음은 비용(cost) 함수이다. 이는 w, b의 값을 찾기 위한 함수이다. 일반적으로 경사 하강법(Gradient Descent)을 사용하기에 적합한 함수 모양으로 만들어야 한다. 일반적인 Regression의 비용 함수는 \( \sum(예측값-실제값)^2 \)으로 계산하는 최소 제곱합(MSE)과 같이 2차 함수의 형태로 만들어 경사 하강법을 적용한다. 아래는 일반 회귀 모델의 비용 함수이다. $$ cost = \frac{\sum_{i=1}^{n}(\hat{y}_i-y_i)^2}{n} $$ Fig 6. 선형 회귀 모델 손실 함수 여기서 \( \hat{y} \)는 예측값 \( y \)는 원본 데이터 값이다. 하지만 로지스틱 회귀의 비용(손실) 함수는 달라야 한다. 자연상수 e에 의해 MSE는 2차 함수의 일반적인 모양을 띄지 않아 지역 최소(local minimum) 문제를 야기하기 때문이다. 이는 실제 최소 지점이 아님에도 다른 골짜기 부분을 최소 지점이라 생각하는 문제이다. 이를 상쇄하기 위해 log를 씌워주는 과정이 추가된다. Fig 7. 지역 최소 그러므로 로지스틱 회귀는 아래 수식을 손실 함수로 사용한다. 이 손실 함수가 이진 교차 엔트로피(Binary Cross Entropy)이다. $$ cost=\frac{1}{n}\sum_{i=1}^{n}{(-y_ilog(wx_i+b)-(1-y_i)log(1-wx_i+b)} $$ 이 손실함수는 최대 우도법(maximum likelihood estimation) 에서 유래되었다. 로그 우도함수(log-likelihood function)를 최대로 하는 회귀계수는 동시에 우도를 최대화하며 그 역도 성립한다. 손실 함수를 계산했다면 다른 회귀 모델처럼 이 비용 함수의 값을 최소화 해야한다. 이를 위한 가장 대표적인 방식이 경사 하강법(Gradient Descent)이다. 경사 하강법은 옵티마이저(optimizer) 중 하나인데 글이 너무 길어지므로 옵티마이저의 존재만 인지하고 넘어간다. 결과적으로 \(w=w-(\frac{∂L}{∂w}) \)와 \(b=b-(\frac{∂L}{∂b}) \)와 같이 각각 편미분을 가중치와 절편을 업데이트하는데 이 과정은 일반 선형 회귀와 동일하다. 어차피 지금 증명을 한 것도 아니고 수식과 관련된 부분은 잘 모르겠으면 그냥 넘기면 된다. 개인적으론 데이터 분석 업무를 하며 여러 수식을 마주하면, 해당 과정이 어떠한 의미를 지니는지만 제대로 파악하고 파이썬을 이용해 관련 라이브러리를 활용하여 넘어가는 편이다. 다음은 python을 이용한 로지스틱 회귀 구현이다. Fig 8. 로지스틱 회귀 import numpy as np import matplotlib.pyplot as plt def sigmoid(x): return 1 / (1 + np.e ** (-x)) def logistic_regression(data, learning_rate=0.01, epochs=1000): w = 0.0 b = 0.0 for i in range(1, epochs+1): for x, y in data: w_difference = x*(sigmoid(w*x+b)-y) b_difference = sigmoid(w*x+b)-y w -= learning_rate*w_difference b -= learning_rate*b_difference if i%10==0: print('epoch =', i, ', w =', round(w, 3), ', b =', round(b, 3)) print('epoch =', i, ', w =', round(w, 3), ', b =', round(b, 3)) return w, b n = 20 x_data = np.linspace(0, n, n, dtype=int).reshape(-1, 1) y_data = np.array([1 for i in range(n)]).reshape(-1, 1) y_data[:int(n/2)] = 0 data = np.append(x_data, y_data, axis=1) w, b = logistic_regression(data=data) plt.scatter(x_data, y_data) plt.plot(x_data, sigmoid(w*x_data+b)) plt.show() 데이터는 20개 learning rate는 0.01, epochs는 1000번으로 지정하고 학습을 수행하였다. w=0.829 , b=-7.282으로 산출되었다. 어떤 과정으로 로지스틱 회귀가 수행되는지 간단하게 알아볼 수 있게만 구현하였다. 따라서 지금의 데이터는 선형적으로 임시 생성하였기 때문에 결과에 큰 의미는 없다. 다음은 sklearn의 LogisticRegression 함수를 이용해 와인 등급을 맞추는 로지스틱 회귀 분석이다. 와인 등급은 임의로 0, 1, 2 세가지이므로 이진 분류가 아닌 다중 분류(multi classification)로의 확장이다. 사용되는 데이터는 sklearn에서 제공해주는 테스트 데이터 셋인데 이 와인 데이터에는 아래와 같은 수치가 있다. ['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium', 'total_phenols', 'flavanoids', 'nonflavanoid_phenols', 'proanthocyanins', 'color_intensity', 'hue', 'od280/od315_of_diluted_wines', 'proline'] 위 수치들을 이용해 로지스틱 회귀 분석을 수행한다. LogisticRegression 함수의 하이퍼 파라미터(Hyper Parameter)는 간략하게 아래와 같다. penalty : 1차, 2차, 1차+2차 혼합, 미규제 중에서 복잡한 모델에 대한 규제 방법을 선택 'l1', 'l2', 'elasticnet', 'none'가 있고 default는 'l2'이다. 'l1', 'l2', 'elasticnet', 'none'가 있고 default는 'l2'이다. C : penalty에 대한 계수 설정, 기본 값은 1.0, 높을수록 복잡한 모델에 대한 규제 강화 solver : solver : 로지스틱 회귀는 비선형 방정식이라 근사 알고리즘으로 접근하는데, 알고리즘의 종류 선택 특정 solver는 일부 penalty 방식을 지원하지 않을 수도 있음 ‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’가 있고 default는 'lbfgs' 특정 solver는 일부 penalty 방식을 지원하지 않을 수도 있음 ‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’가 있고 default는 'lbfgs' random_state : 근사 알고리즘의 초기 상태가 실행 시마다 달라질 수 있기 때문에 실행 마다 결과를 고정하기 위해 임의의 정수를 설정하여 사용 가능 근사 알고리즘의 초기 상태가 실행 시마다 달라질 수 있기 때문에 실행 마다 결과를 고정하기 위해 임의의 정수를 설정하여 사용 가능 max_iter : solver에 의해 진행되는 수렴을 위한 반복의 최대 횟수를 지정할 수 있는데 데이터와 solver에 따라 수렴이 오래 걸리는 경우가 있음 더 있지만 이정도만 설명하고 넘어간다. 아래는 python 소스코드이다. import pandas as pd from sklearn import datasets # https://scikit-learn.org/stable/datasets/toy_dataset.html from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score wine_data = datasets.load_wine() print(wine_data.feature_names) # train, test 셋 분리 x = pd.DataFrame(wine_data.data, columns=wine_data.feature_names) y = wine_data.target x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, shuffle=True) # 로지스틱 회귀 모델 학습 model = LogisticRegression(penalty='l2', max_iter=100) model.fit(x_train, y_train) for i, coef in enumerate(model.coef_): res = sum(coef*x_test.iloc[0]) + model.intercept_[i] print(i, "등급일 가능성 : ", res) # 0 등급 가능성 : -2.3850845830146885 # 1 등급일 가능성 : -4.111530470738077 # 2 등급일 가능성 : 6.496615054227784 # 로지스틱 모델 학습 성능 비교 y_pred = model.predict(x_test) # 예측 결과 라벨 print("등급 : ", y_pred[0]) # 등급 : 2 # 정확도 측정 print(round(accuracy_score(y_pred, y_test), 3)*100, "%") # 97.2 % 0, 1, 2등급이 될 가능성이 각각 w(coef_)와 b(intercept_)에 의해 도출되고 해당 회귀 식에서 2등급일 때가 가장 높다. 여기서 수치가 0~1사이가 아닌건 정규화(Normalization)를 수행하지 않았기 때문이다. 어쨋든 x_test의 첫 행의 데이터를 가진 와인은 2등급으로 "분류"된다. 해당 모델은 약 97.2%의 정확도로 분류를 해낸다. 하지만 위 코드 대로라면 아래의 경고가 나온다. ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED LIMIT. max_iter를 높게 설정해주면 나오지 않지만 사실 이전에 전처리를 통해 데이터 정규화(Normalization)부터 수행해주어야 한다. 일단 이번에는 정규화 과정 없이 로지스틱 회귀만 구현해보고 넘어간다. 정리하자면 로지스틱 회귀는 활성화 함수로 Sigmoid 함수를 사용해 종속 변수를 확률로 나타낸다는 것이다. 이 확률이 특정 임계값(일반적으로 0.5)을 넘으면 1 아니면 0인 이진 분류를 수행한다. 대상이 여러개인 다중 분류로 확장하면 각 클래스 별 확률을 확인하고 가장 높은 확률의 클래스로 분류한다. 참고 자료 https://ratsgo.github.io/machine%20learning/2017/04/02/logistic/ https://velog.io/@gayeon/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-Logistic-Regression-with-Scikit-Learn https://hleecaster.com/ml-logistic-regression-example/ https://yamalab.tistory.com/79 https://bcho.tistory.com/1142 https://towardsdatascience.com/optimization-loss-function-under-the-hood-part-ii-d20a239cde11 https://yoon1seok.tistory.com/34 소스 코드 https://github.com/sehoon787/Personal_myBlog/blob/main/Data%20Science/Statistics/blog_statistics_30.py 반응형
파이썬 데이터분석 로지스틱회귀분석
안녕하세요.
오늘은 로지스틱회귀분석을 통해 분류예측분석과 독립변수가 종속변수여부에 어떤 영향을 미치고 있는지 알아보도록 하겠습니다.
개요
이변량 종속변수(집단1 또는 0)인 경우에는 일반적인 선형회귀분석이 적합하지 않다. 이변량 종속변수라는 특성이 있어도 사용할 수 있는 분석이 로지스틱회귀분석이다. 로지스틱회귀분석이란 양적인 독립변수들과 범주형 혹은 명목형인 이변량 종속변수(집단1 또는 0)에 대해 속할 범주를 추정하는 분류예측을 위한 분석을 말한다. 예를 들어, 합격과 불합격 중 합격일 확률이 있다. 불합격 집단과 비교해 그런 결과가 나오게 된 이유가 무엇인가, 그 요인이 얼마나 영향을 주었는가를 파악하는 분석이다
. 두개의 집단으로 분류하는 경우 로지스틱 회귀분석을 이항 로지스틱 회귀분석, 3개 이상의 다수 집단으로 분류하기 위한 로지스틱 회귀분석을 다항 로지스틱회귀분석 이라고한다. 일반적으로 로지스틱회귀분석이라고하면 이항로지스틱회귀분석을 의미한다. 최대우도법을 이용해서 계수를 추정한다.
로지스틱 회귀분석의 개념
이항로지스틱 회귀분석이란 종속변수의 범주 수가 2개일 경우를 말한다. 예를 들어, 종속변수가 결혼여부(기혼, 미혼)일 경우에는 이항로지스틱 회귀분석이 적합할 것이다. 일반적인 로지스틱 회귀모형은 다음과 같다.
로지스틱 회귀분석은 선형함수가 아닌 로짓함수를 사용하여 진행한다. 그렇기 때문에 로지스틱 회귀분석의 모형은 목표집단에 속할 확률과 그렇지 않을 확률의 비율에 자연로그를 취한 값을 출력함으로써 분류예측을 수행한다. 로지스틱 회귀분석의 독립변수와 종속변수와의 관계는 비선형 S자의 형태를 띈다. S자 이기때문에 선형회귀곡선의 해석처럼 일정한 변화는 알 수 없다. S자라는 특성 때문에 로지스틱 회귀분석은 로지스틱 회귀곡선 상에서 분류 기준 값(cut-off value)을 설정하고 목표집단에 속할 확률이 분류기준값보다 큰 경우 집단1(목표집단), 분류 기준값보다 작은경우 집단0으로 분류하는 분석이다.
확률, 오즈, 로짓의 개념
로지스틱 회귀분석이 어떻게 로짓함수를 사용하여 분석을 진행하게 됐는지 다음 일련의 개념들을 살펴보도록 하자.
먼저, 확률이다. 종속변수가 범주형일 경우에 대학교 합격여부를 합격과 불합격으로 나눌 수 있다. 합격과 불합격이 확률상으로는 1과 0 두가지만 존재한다는 뜻이다. 즉, 구간이 0~1사이에 존재하며 다음의 식으로 표현할 수 있다.
이 말인 즉슨, 수능성적이 높아질수록 대학교 합격이 얼마나 달라질지 하나의 선만으로는 파악이 불가능하다는 뜻이다. 만약 수능점수별로 대학교 합격을 비율로 그려본다면S자 모형이 나타날 것이다. 이 그래프는 종속변수의 범주형 형태를 확률 값으로 나타낸 그래프일 것이다. S자 이며 수능점수 증가에 따라 대학 합격 가능성을 설명 또는 예측이 가능한 그래프이다. 그러나 이러한 곡선 관계는 3차식이라는 문제가 있다. 3차식은 이해하기 매우 복잡하고 모델의 일반화가 어렵다. 따라서 우리는 이러한 관계식을 더 쉽게 해석 할 수 있게 간결하게 만들어야 할 필요성이 있다. 이를 해결할 수 있는 방법이 오즈이다. 오즈에 대해서 알아보도록 하자.
종속변수를 확률로 변환하여 사용하는 경우에는 문제가 발생할 수 있기 때문에 오즈의 개념이 생겼다. 종속변수를 구간별 비율 또는 확률로 삼아서는 올바른 추정결과를 얻기가 어렵기 때문이다. 오즈는 자료 변환과정을 말한다. 확률은 전체대비 발생건수인 반면에 오즈는 발생하지 않는 건수 대비 발생건수를 말한다. 즉, 오즈는 다음의 식을 갖는다.
따라서 오즈의 구간은 0부터 무한대까지이며 음수가 나타나지 않는다. 이 또한 확률과 마찬가지로 비선형적 관계이기 때문에 간단하고 명확한 모델을 얻기가 힘들다는 문제가 있다. 그렇기 때문에 나타난 개념이 오즈비이다.
오즈비는 다른 집단 간에 발생할 확률의 비를 의미한다. 즉, 독립변수가 분류 결정에 미치는 영향의 정도를 계량화 하는데 사용한다. 로지스틱회귀분석에서는 오즈비로 계산을 하는데 그 이유는 다음과 같다. 첫번째, 수리적 관점에서 비율 혹은 확률은 0과 1사이의 값만 존재하지만 오즈로 계산하게되면 0에서 무한대 값이된다. 종속변수의 범위가 마이너스 무한대에서 무한대로 실수 전체 구간으로 확대됨으로써 회귀모델로 추정하는 것이 가능해진다. 두번째, 더욱 현실적인 결과로 해석된다는 장점이 있다. 로지스틱 회귀분석의 목적은 종속변수의 두 범주 중 어떤 특정 범주에 속할 확률 또는 가능성을 파악하는 것이다. 그런 결과가 나오게 된 이유가 무엇인지 얼마나 영향을 주었는지 등을 파악할 수 있다. 오즈비가 1보다 크면 독립변수가 종속변수에 양의 방향으로 영향을 미친다는 뜻을 의미한다. 따라서, 다른 집단과의 비교값인 오즈비가 더욱 타당한의미를 가진다. 확률과 오즈에서 나타나는 문제 모두 해결 가능함에 따라 1차식의 관계가 도출될 수 있고 선형관계로 모델 추정이 쉽게 때문에 로지스틱 회귀분석에서는 오즈비를 사용한다.
오즈로 구한 종속변수도 회귀모델에 적용하기에는 완전치 않다. 그 이유는 구간이 0과 무한대 사이이기때문에 음수가 존재하지 않고 비선형적 관계로 나타나기 때문이다. 따라서, 오즈에 자연로그를 취하여 자료를 변환해야한다. 로그변환을 하게 되면 자료가 선형적으로 안정화되면서 음수와 양수 전체 구간에 무한대가지 존재하게 된다. 이것이 로짓이다.
로지스틱 회귀분석 실습
N대학교의 대학원 입학처는 본교 대학원에 입학 하는 학생이 어떠한 특성을 가지는지 파악하고 대학원에 입학할 가능성이 있는 수험생을 예측하고자한다. 대학원입시점수와 학점을 이용해서 합격여부에 어떤 영향이 있는지, 어떤고객이 합격확률이 높은지 확인해보자.
두가지로 분류하는 이항로지스틱 회귀분석을 실습하기위해 데이터를 불러온다.
import pandas as pd import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split data = pd . read_csv ( ‘/Users/lee/Desktop/admit.csv’ , engine = ‘python’ , encoding = ‘CP949’ ) data . head ()
Out[19]: 합격여부 입시점수 학점 0 0 380 3.61 1 1 660 3.67 2 1 800 4.00 3 1 640 3.19 4 0 520 2.93
독립변수와 종속변수를 지정해주고 훈련용 데이터와 검증용 데이터를 7:3으로 분할해준다.
x = data [[ ‘입시점수’ , ‘학점’ ]] #변수 지정 y = data [[ ‘합격여부’ ]] x_train , x_test , y_train , y_test = train_test_split ( x , y , test_size = 0.3 , random_state = 0 )
from sklearn.linear_model import LogisticRegression log = LogisticRegression() #로지스틱 회귀분석 시행 log.fit(x_train, y_train) #모델의 정확도 확인 print(‘학습용 데이터셋 정확도 : %.2f’ % log1.score(x_train, y_train)) print(‘검증용 데이터셋 정확도 : %.2f’ % log1.score(x_test, y_test))
학습용 데이터셋 정확도 : 0.68 검증용 데이터셋 정확도 : 0.68
로지스틱 회귀분석을 사용하기 위한 기본 구조는 LogisticRegression(C=1.0, class_weight=None, random_state=None)이다. C값의 기본값은 1.0이다. 오류 강도를 정하는 매개 변수이다. 작은 C값은 제약이 큰 모델을 만들고 각 데이터 포인트의 영향력이 작아지게한다. 즉, 데이터가 다른 경계면에 분류되었음에도 별다른 제약없이 경계가 그려지며 C값이 커지면 각 포인트들이 결정 경계에 큰 영향을 준다. (C값을 변경하고 싶으면 LogisticRegression(C=100) 이렇게 사용할 수 있다.) Class_weight은 가중치를 말하는데 기본값은 1이다. Random_state는 난수 생성 프로그램을 사용할 때 사용한다. 기본값은 없다. 우리가 사용한 코드에는 모든파라미터 값을 기본으로 넣은 LogisticRegression()으로 모델을 만들었다. 학습용 데이터셋 정확도가 0.68로 나오고 검증용 데이터셋 정확도 또한 0.68로나왔다. 조금 더 자세한 평가를 위해 classification_report 모듈을 이용하였다. 이 모듈은 모형 성능평가를 위한 모듈로 정밀도(precision), 재현율(recall),F1-score, support를 구해준다.
from sklearn.metrics import classification_report y_pred = log . predict ( x_test ) print ( classification_report ( y_test , y_pred )) precision recall f1-score support 0 0.68 1.00 0.81 82 1 0.00 0.00 0.00 38 avg / total 0.47 0.68 0.55 120 이 모델의 정밀도의 수치는 0.47, 재현율의 수치는 0.68로 나타났다. 이제 모델의 회귀계수와 오즈비를 구해 독립변수가 분류 결정에 미치는 영향의 정도를 알아보기 위해 다른 방식의 로지스틱회귀분석을 진행해보자. logit이란 변수에 합격여부를 종속변수로 하는 데이터를 넣고, 앞서 넣은 독립변수 x값도 입력한 뒤 적합 시켜준다. import statsmodels.api as sm logit = sm . Logit ( data [[ ‘합격여부’ ]], x ) #로지스틱 회귀분석 시행 result = logit . fit () Optimization terminated successfully. Current function value: 0.629448 Iterations 5 result . summary2 () Out[25]: Model: Logit No. Iterations: 5.0000 Dependent Variable: 합격여부 Pseudo R-squared: -0.007 Date: 2019-02-28 13:31 AIC: 507.5584 No. Observations: 400 BIC: 515.5414 Df Model: 1 Log-Likelihood: -251.78 Df Residuals: 398 LL-Null: -249.99 Converged: 1.0000 Scale: 1.0000 Coef. Std.Err. z P>|z| [0.025 0.975] 입시점수 0.0016 0.0010 1.5825 0.1135 -0.0004 0.0035 학점 -0.4823 0.1752 -2.7522 0.0059 -0.8257 -0.1388
각 회귀계수가 합격여부에 어떻게 영향을 미치는지 확인해보자. 먼저, 유의확률을 본다. 학점 변수만 유의수준 99%에서 종속변수에 영향을 주는 유의한 변수임을 알 수 있다. 입시점수를 제외하고 계속해서 해석을 진행한다. 편회귀계수값의 부호를 통해 종속변수에 미치는 영향의 방향을 파악할 수 있다. 편회귀계수의 값이 양수라면 합격여부가 ‘1’일 확률이 높아진다는 뜻이다. 반대로 음수라면 합격여부의 값이 ‘0’일 확률이 높아진다는 뜻이다. 따라서 모형의 회귀계수 분석결과는 다음과 같다. 학점이 낮을수록 합격확률이 높다. 통계량에 나와있는 편회귀계수의 값 자체만으로는 각 변수들이 종속변수에 얼마나 영향을 주는지는 파악할 수 없다. 종속변수에 미치는 정도는 오즈비를 통해 파악할 수 있다. 다음과 같은 코드를 작성해서 오즈비를 구해보자.
np . exp ( result . params ) Out[26]: 입시점수 1.001563 학점 0.617389 dtype: float64 오즈비가 1을 기준으로 큰지 작은지를 파악하여 종속변수에 미치는 영향의 방향을 파악할 수 있다. 독립변수가 두개 이상 있을 때는 다른 독립변수를 일정한 값으로 고정한 경우의 오즈비로 해석된다. 아무런 관계없을 때 오즈비는 1이다. 1에서 멀리 떨어질수록 종속변수와의 관계가 강하다는 뜻이다. 즉, 종속변수 여부에 큰 영향을 준다는 뜻이다. 오즈비는 1을 기준으로 영향을 판단하므로, 오즈비가 10인 경우와 0.1인 경우는 종속변수에 영향을 주는 강도가 같다. 입시점수 변수의 경우, 극도로 1에 가까운 값으로 나타난다. 따라서, 입시점수는 합격여부에 별다른 영향을 주지않았음(관계 없음)을 알 수 있다. 반면, 학점의 경우는 각 오즈비가 0.61로 1과 떨어져있으므로 합격여부에 영향을 미쳤음을 알 수 있다. 독립변수가 수치형일 경우 또 다르게 오즈비해석을 할 수 있다. 학점이 1단위 증가하면 합격할 확률이 0.61배 증가한다는 뜻으로도 해석할 수 있다. 따라서, 대학원입학에는 입시점수보다 학점이 중요한 것을 알 수 있었다.
로지스틱 회귀 파이썬 연습 예제1 – 놀이공원 데이터
지난 글에서 로지스틱 회귀에 대해 알아보았다. 파이썬 예제로 연습을 해보자. 연습할 데이터는 어떤 놀이 공원의 구매 데이터이다. (소스 코드와 데이터는 제 깃헙에 공개되어 있습니다.)
어떤 채널(우편-Post, 현장-Offline, 이메일-Email)을 통해 티켓이 판매되었는지, 판매될 때(Pass/NoPass) 추가적인 번들 옵션(Bundle/NoBundle)이 제공되었는지의 여부가 기록된 간단한 데이터셋이다. 마케팅 매니저로서 번들을 제공하는 것이 실질적으로 판매량에 영향을 미치는지 알고 싶다. ‘판매 여부’라는 종속변수는 Pass/NoPass의 이산적 카테고리 데이터이므로 로지스틱 회귀를 사용한다.
■ Q1. 프로모션이 판매 여부에 영향이 미칠까?
먼저 보기 쉽게 텍스트 데이터를 0, 1의 숫자로 인코딩하자. astype(str)를 통해 데이터 타입을 문자열로 다시금 확인/지정해주고 map()을 통해 Pass/Bundle에 1값을, NoPass/NoBundle에 0값을 넣어주었다 (astype을 쓰지 않으면 NaN으로 매핑된다).
data[‘Ticket’] = data[‘Ticket’].astype(str).map({‘Pass’:1,’NoPass’:0}) data[‘Offer’] = data[‘Offer’].astype(str).map({‘Bundle’:1,’NoBundle’:0}) data.head()
이제 로지스틱 회귀를 적용하면 된다. statsmodels라는 파이썬 패키지를 사용한다.
# statsmodels package loading import statsmodels.api as sm # logistic regression feature = data[‘Offer’] output = data[‘Ticket’] model = sm.formula.glm(“output ~ feature”, data, family = sm.families.Binomial()).fit() print(model.summary())
요런 결과를 보면 일단 p값을 확인해서 독립 변수가 통계적으로 유의미한지 확인해야한다. 유의수준이 0.05라고 할 때 p값이 0.05보다 작으므로 통계적으로 유의미하다는 것을 확인할 수 있고, 계수값이 0.3888로 번들이 제공 되었을 때 판매여부에 양(+)의 영향을 준다는 것이 확인되었다.
오즈비(Odds ratio)를 구해 좀 더 명확히 해석해보자.
# odds ratio np.exp(model.params) # Given an offer, the likelihood of purchase increases by 1.47x
오즈비를 exp(계수값)으로 구한 이유는 다음의 수식을 참고하면 된다. θ와 η의 관계에 대해 자세히 보고 싶다면 이전 글을 참고하면 좋겠다.
odds(θ) = \frac{θ}{(1-θ)} = \frac{\frac{1}{1+exp(-η)}}{1-(\frac{1}{1+exp(-η)})} = \frac{\frac{1}{1+exp(-η)}}{(\frac{1+exp(-η)-1}{1+exp(-η)})} = \frac{1}{exp(-η)} = exp(η)
다시 오즈의 개념을 살펴보자. 오즈는 성공할 확률과 실패할 확률의 비이다. 오즈의 결정 경계(decision threshold)는 1이다. 즉, 오즈비를 해석하자면 번들을 제공했을 때의 오즈비가 1.475196으로 1보다 크므로 번들을 제공함에 따라 티켓 판매 여부에 증가함을 의미한다(정확히는 1.475196배 늘어난다).
■ Q2. 판매 채널별로 프로모션이 판매 여부에 영향이 미칠까?
프로모션이 판매 여부에 영향을 주는 것은 확인했고, 이제 판매 채널별로 프로모션과 판매 여부의 관계를 알아보고 싶다. groupby()를 이용해서 간단히 데이터를 다시 살펴보자.
숫자만 보았을 때는 티켓은 현장 판매 때 가장 많이 팔렸고, 이메일은 그다지 효과가 없어보인다. 로지스틱 회귀로 자세히 살펴볼 필요가 있다.
model2 = sm.formula.glm(“data[‘Ticket’] ~ data[‘Offer’]+data[‘Channel’]”, data, family = sm.families.Binomial()).fit() print(model2.summary()) # odds ratio np.exp(model2.params) # decision boundary = 1.
일단 p값은 0으로 모든 종속 변수가 통계적으로 유의미하다. 종속 변수를 보면 현장 판매, 우편 판매만 있다. 채널은 분명 3개인데 이메일 판매는 어디갔을까? 이메일 판매가 모델 요약에 나타나지 않은 이유는 이메일을 기준(baseline)으로 삼았기 때문이다. 즉, 현장 판매가 이메일 판매보다 41배 가량 판매 여부에 더 효과적이고, 우편 판매 역시 이메일 판매보다 8.8배 더 효과적이다.
그런데 첫 번째 문제에서와 다르게 프로모션을 했을 때 오히려 음(-)의 관계가 나타났음을 확인할 수 있다. 문제를 더 면밀히 살펴볼 이유가 생겼다.
■ Q3. 교호작용(interaction effect)이 있을까?
모자이크 플롯을 그려보면, 우편 판매와 이메일 판매의 경우 NoPass 비중이 더 높은 반면 현장 판매의 경우 Pass의 비중이 더 높다는 것을 알 수 있다. 또한, 티켓을 산 사람들 중의 번들의 제공 여부 비중을 따져서 보면, 우편의 경우 NoBundle의 비중이 오히려 더 높고, 이메일의 경우 Bunlde의 비중이 높다는 것을 알 수 있다. 이러한 사항들은 각각의 채널별로 번들의 효과가 다르다는 것을 암시하며, 교호 작용이 발생하고 있음을 보여준다.
교호작용이란, 하나의 독립 변수가 또 다른 독립 변수에 영향을 주는 현상을 말한다. 우리의 주요 가정 중 하나는 독립 변수끼리 독립적이어야 한다는 것인데 교호작용이 있다면 문제가 생겼다는 것이다!
model3 = sm.formula.glm(“data[‘Ticket’] ~ data[‘Offer’]*data[‘Channel’]”, data, family = sm.families.Binomial()).fit() print(model3.summary()) # odds ratio np.exp(model3.params) # decision boundary = 1.
번들 제공이라는 독립 변수와 판매 채널이라는 독립 변수의 교호작용을 추가하여 다시 모델링을 해보자.
이제 direct effect와 interaction effect가 모두 나온 요약 결과를 볼 수 있다. 여기서도 이메일 채널이 기준으로 위의 결과를 해석하자면
현장 판매가 이메일 판매보다 약 104배 가량 판매 여부에 더 효과적이다.
우편 판매의 이메일 판매보다 약 23배 가량 판매 여부에 더 효과적이다.
번들을 제공할 때의 판매 여부는 그렇지 않을 때보다 약 8배 높다
그러나, 현장 판매할 때 번들을 제공하는 것은 이메일 판매할 때 번들을 제공하는 것보다 효과적이지 않다.
마찬가지로 우편 판매할 때 번들을 제공하는 것은 이메일 판매할 때 번들을 제공하는 것보다 효과적이지 않다.
결론적으로 마케팅 매니저는 각각의 채널에 쓸 예산을 정할 때 합리적인 근거와 현장/우편 판매 시 번들 제공 여부를 재고해볼 수 있는 근거가 생겼다 🙂
주의: 본 예제는 로지스틱 회귀의 이해와 마케팅에서의 활용 방법에 대한 이해를 돕기 위한 간단한 예제입니다. train/test data split 등 실제 로지스틱 회귀를 적용할 때 필요한 데이터 전처리에 대해 다루지 않았으므로 참고바랍니다.
파이썬에서 로지스틱 회귀 만들기
원래 Susan Li가 발행한 https://towardsdatascience.com
로지스틱 회귀 이다 기계 학습 범주형 종속 변수의 확률을 예측하는 데 사용되는 분류 알고리즘입니다. 로지스틱 회귀에서 종속 변수는 1(예, 성공 등) 또는 0(아니오, 실패 등)으로 코딩된 데이터를 포함하는 이진 변수입니다. 즉, 로지스틱 회귀 모델은 P(Y=1)를 X의 함수로 예측합니다.
로지스틱 회귀 가정
이진 로지스틱 회귀 분석에서는 종속 변수가 이진이어야 합니다.
이진 회귀의 경우 종속 변수의 요인 수준 1이 원하는 결과를 나타내야 합니다.
의미 있는 변수만 포함해야 합니다.
독립변수는 서로 독립적이어야 합니다. 즉, 모델은 다중 공선성이 거의 또는 전혀 없어야 합니다.
독립 변수는 로그 승산과 선형적으로 관련되어 있습니다.
로지스틱 회귀에는 상당히 큰 샘플 크기가 필요합니다.
위의 가정을 염두에 두고 데이터 세트를 살펴보겠습니다.
데이터
데이터 세트는 UCI 머신 러닝 리포지토리 , 포르투갈 은행 기관의 직접 마케팅 캠페인(전화 통화)과 관련이 있습니다. 분류 목표는 고객이 정기 예금(변수 y)에 가입(1/0)할지 여부를 예측하는 것입니다. 데이터세트는 다음에서 다운로드할 수 있습니다. 여기 .
import pandas as pd import numpy as np from sklearn import preprocessing
import matplotlib.pyplot as plt plt.rc(font, size=14) from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split import seaborn as sns sns.set(style=white) 오프라인으로 표시되는 형제 프린터 sns.set(style=whitegrid, color_codes=True)
데이터 세트는 은행 고객의 정보를 제공합니다. 여기에는 41,188개의 레코드와 21개의 필드가 포함됩니다.
그림 1
입력 변수
나이(숫자) 직업 : 직업의 종류 (카테고리: 관리, 블루칼라, 기업가, 가사도우미, 경영, 퇴직, 자영업, 서비스, 학생, 기술자, 실업자, 불명) 결혼 : 결혼 여부 (카테고리 : 이혼, 기혼, 미혼, 불명) 교육(카테고리: basic.4y, basic.6y, basic.9y, high.school, 문맹자, professional.course, 대학.degree, unknown) 기본: 기본 신용이 있습니까? (범주: 아니오, 예, 알 수 없음) 주택: 주택 융자가 있습니까? (범주: 아니오, 예, 알 수 없음) 대출: 개인 대출이 있습니까? (범주: 아니오, 예, 알 수 없음) 연락처: 연락 통신 유형 (범주: 셀룰러, 전화) 월: 해당 연도의 마지막 접촉 월(카테고리: 1월, 2월, 3월, …, 11월, 12월) day_of_week: 요일의 마지막 연락 요일(카테고리: 월, 화, 수, 목, 금) 지속 시간: 마지막 접촉 지속 시간(초)(숫자). 중요 참고 사항: 이 속성은 출력 대상에 큰 영향을 미칩니다(예: duration=0이면 y=’no’). 호출이 수행되기 전의 지속 시간은 알 수 없으며 호출이 끝난 후에도 y는 분명히 알려져 있습니다. 따라서 이 입력은 벤치마크 목적으로만 포함되어야 하며 의도가 현실적인 예측 모델을 가지려는 경우에는 삭제되어야 합니다. 캠페인: 이 캠페인 동안 및 이 클라이언트에 대해 수행된 컨택 수(숫자, 마지막 컨택 포함) pdays: 이전 캠페인에서 클라이언트가 마지막으로 연락된 후 경과한 일 수(숫자, 999는 클라이언트가 이전에 연락되지 않았음을 의미함) 이전: 이 캠페인 이전에 이 클라이언트에 대해 수행된 컨택 수(숫자) poutcome: 이전 마케팅 캠페인의 결과(카테고리: 실패, 존재하지 않음, 성공) emp.var.rate: 고용 변동률 — (숫자) cons.price.idx: 소비자 물가 지수 — (숫자) cons.conf.idx: 소비자 신뢰 지수 — (숫자) euribor3m: euribor 3개월 요금 — (숫자) nr.Employee: 직원 수 — (숫자)
예측 변수(원하는 목표):
y — 고객이 정기 예금에 가입했습니까? (이진법: 1, 예를 의미, 0은 아니오를 의미)
데이터 세트의 교육 열에는 많은 범주가 있으며 더 나은 모델링을 위해 범주를 줄여야 합니다. 교육 열에는 다음 범주가 있습니다.
그림 2
Let us group basic.4y, basic.9y and basic.6y together and call them basic.
data[‘education’]=np.where(data[‘education’] ==‘basic.9y’, ‘Basic’, data[‘education’])
data[‘education’]=np.where(data[‘education’] ==‘basic.6y’, ‘Basic’, data[‘education’])
data[‘education’]=np.where(data[‘education’] ==‘basic.4y’, ‘Basic’, data[‘education’])
그룹화 후 열은 다음과 같습니다.
그림 3
데이터 탐색
그림 4
count_no_sub = len(data[data[‘y’]==0])
count_sub = len(data[data[‘y’]==1])
pct_of_no_sub = count_no_sub/(count_no_sub+count_sub)
print(percentage of no subscription is, pct_of_no_sub 100)
pct_of_sub = count_sub/(count_no_sub+count_sub)
print(percentage of subscription, pct_of_sub 100)
구독하지 않은 비율은 88.73458288821988입니다.
구독 비율 11.265417111780131
우리 클래스는 불균형하고 구독 인스턴스에 대한 구독 없음 비율은 89:11입니다. 클래스의 균형을 맞추기 전에 좀 더 탐색해 보겠습니다.
그림 5
관찰 :
정기예금을 구매한 고객의 평균 연령이 그렇지 않은 고객보다 높습니다.
pdays(고객이 마지막으로 연락한 이후의 일수)는 구매한 고객의 경우 당연히 더 낮습니다. pdays가 낮을수록 마지막 통화에 대한 기억이 더 좋아지므로 판매 가능성이 높아집니다.
놀랍게도 정기예금을 구매한 고객의 캠페인(현재 캠페인 중 통화 또는 컨택 횟수)이 더 적습니다.
데이터를 더 자세히 이해하기 위해 교육 및 결혼 여부와 같은 다른 범주형 변수에 대한 범주형 평균을 계산할 수 있습니다.
그림 6
그림 7
시각화
%matplotlib inline pd.crosstab(data.job,data.y).plot(kind=‘bar’) plt.title(‘Purchase Frequency for Job Title’) plt.xlabel(‘Job’) plt.ylabel(‘Frequency of Purchase’) plt.savefig(‘purchase_fre_job’)
그림 8
보증금 구매 빈도는 직책에 따라 크게 달라집니다. 따라서 직위는 결과 변수의 좋은 예측 변수가 될 수 있습니다.
table=pd.crosstab(data.marital,data.y)
table.div(table.sum(1).astype(float), axis=0).plot(kind=‘bar’, stacked=True)
plt.title(‘Stacked Bar Chart of Marital Status vs Purchase’)
plt.xlabel(‘Marital Status’)
plt.ylabel(‘Proportion of Customers’)
plt.savefig(‘mariral_vs_pur_stack’)
그림 9
결혼 상태는 결과 변수에 대한 강력한 예측 변수로 보이지 않습니다.
table=pd.crosstab(data.education,data.y)
table.div(table.sum(1).astype(float), axis=0).plot(kind=‘bar’, stacked=True)
plt.title(‘Stacked Bar Chart of Education vs Purchase’)
plt.xlabel(‘Education’)
plt.ylabel(‘Proportion of Customers’)
plt.savefig(‘edu_vs_pur_stack’)
그림 10
교육은 결과 변수의 좋은 예측 변수인 것 같습니다.
pd.crosstab(data.day_of_week,data.y).plot(kind=‘bar’)
plt.title(‘Purchase Frequency for Day of Week’)
plt.xlabel(‘Day of Week’)
plt.ylabel(‘Frequency of Purchase’)
plt.savefig(‘pur_dayofweek_bar’)
그림 11
요일은 결과를 잘 예측하지 못할 수 있습니다.
pd.crosstab(data.month,data.y).plot(kind=‘bar’)
plt.title(‘Purchase Frequency for Month’)
plt.xlabel(‘Month’)
plt.ylabel(‘Frequency of Purchase’)
plt.savefig(‘pur_fre_month_bar’)
그림 12
월은 결과 변수의 좋은 예측 변수가 될 수 있습니다.
data.age.hist()
plt.title(‘Histogram of Age’)
plt.xlabel(‘Age’)
plt.ylabel(‘Frequency’)
plt.savefig(‘hist_age’)
그림 13
이 데이터 세트에 있는 은행 고객의 대부분은 30~40세입니다.
pd.crosstab(data.poutcome,data.y).plot(kind=‘bar’)
plt.title(‘Purchase Frequency for Poutcome’)
plt.xlabel(‘Poutcome’)
plt.ylabel(‘Frequency of Purchase’)
plt.savefig(‘pur_fre_pout_bar’)
그림 14
Poutcome은 결과 변수의 좋은 예측 변수인 것 같습니다.
더미 변수 생성
즉, 0과 1의 두 값만 있는 변수입니다.
cat_vars=[‘job’,‘marital’,‘education’,‘default’,‘housing’,‘loan’,‘contact’,‘month’,‘day_of_week’,‘poutcome’]
for var in cat_vars:
cat_list=‘var’+‘_’+var
cat_list = pd.get_dummies(data[var], prefix=var)
data1=data.join(cat_list)
data=data1cat_vars=[‘job’,‘marital’,‘education’,‘default’,‘housing’,‘loan’,‘contact’,‘month’,‘day_of_week’,‘poutcome’]
data_vars=data.columns.values.tolist()
to_keep=[i for i in data_vars if i not in cat_vars]
최종 데이터 열은 다음과 같습니다.
data_final=data[to_keep]
data_final.columns.values
그림 15
SMOTE를 사용한 오버샘플링
교육 데이터가 생성되면 SMOTE 알고리즘 (합성 소수자 오버샘플링 기법). 높은 수준에서 SMOTE:
복사본을 만드는 대신 마이너 클래스(구독 없음)에서 합성 샘플을 만드는 방식으로 작동합니다. k-가장 가까운 이웃 중 하나를 무작위로 선택하고 이를 사용하여 유사하지만 무작위로 조정된 새로운 관찰을 생성합니다.
시행할 예정입니다 파이썬에서 SMOTE .
X = data_final.loc[:, data_final.columns != ‘y’]
y = data_final.loc[:, data_final.columns == ‘y’]from imblearn.over_sampling import SMOTEos = SMOTE(random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
columns = X_train.columnsos_data_X,os_data_y=os.fit_sample(X_train, y_train)
os_data_X = pd.DataFrame(data=os_data_X,columns=columns )
os_data_y= pd.DataFrame(data=os_data_y,columns=[‘y’]) print(‘length of oversampled data is ‘,len(os_data_X))
print(Number of no subscription in oversampled data,len(os_data_y[os_data_y[‘y’]==0]))
print(Number of subscription,len(os_data_y[os_data_y[‘y’]==1]))
print(‘Proportion of no subscription data in oversampled data is ‘,len(os_data_y[os_data_y[‘y’]==0])/len(os_data_X))
print(‘Proportion of subscription data in oversampled data is ‘,len(os_data_y[os_data_y[‘y’]==1])/len(os_data_X))
그림 16
이제 우리는 완벽한 균형 데이터를 가지고 있습니다! 훈련 데이터에 대해서만 오버샘플링하면 테스트 데이터의 정보가 합성 관찰을 생성하는 데 사용되지 않기 때문에 훈련 데이터에 대해서만 오버샘플링했다는 것을 눈치채셨을 것입니다. 모델 훈련.
재귀 기능 제거
RFE(재귀적 기능 제거) 반복적으로 모델을 구성하고 최고 또는 최악의 기능을 선택하고 기능을 따로 설정한 다음 나머지 기능에 대해 프로세스를 반복한다는 아이디어를 기반으로 합니다. 이 프로세스는 데이터세트의 모든 기능이 소진될 때까지 적용됩니다. RFE의 목표는 점점 더 작은 기능 집합을 재귀적으로 고려하여 기능을 선택하는 것입니다.
data_final_vars=data_final.columns.values.tolist() y=[‘y’] X=[i for i in data_final_vars if i not in y]from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegressionlogreg = LogisticRegression()rfe = RFE(logreg, 20) rfe = rfe.fit(os_data_X, os_data_y.values.ravel()) print(rfe.support_) print(rfe.ranking_)
그림 16
RFE는 다음 기능을 선택하는 데 도움이 되었습니다. poutcome_success.
cols=[‘euribor3m’, ‘job_blue-collar’, ‘job_housemaid’, ‘marital_unknown’, ‘education_illiterate’, ‘default_no’, ‘default_unknown’, ‘contact_cellular’, ‘contact_telephone’, ‘month_apr’, ‘month_aug’, ‘month_dec’, ‘month_jul’, ‘month_jun’, ‘month_mar’, ‘month_may’, ‘month_nov’, ‘month_oct’, poutcome_failure, poutcome_success] X=os_data_X[cols] y=os_data_y[‘y’]
모델 구현
import statsmodels.api as sm logit_model=sm.Logit(y,X) result=logit_model.fit() print(result.summary2())
그림 17
4개의 변수를 제외하고 대부분의 변수에 대한 p-값은 0.05보다 작으므로 제거합니다.
cols=[‘euribor3m’, ‘job_blue-collar’, ‘job_housemaid’, ‘marital_unknown’, ‘education_illiterate’,
‘month_apr’, ‘month_aug’, ‘month_dec’, ‘month_jul’, ‘month_jun’, ‘month_mar’,
‘month_may’, ‘month_nov’, ‘month_oct’, poutcome_failure, poutcome_success]
X=os_data_X[cols]
y=os_data_y[‘y’]logit_model=sm.Logit(y,X)
result=logit_model.fit()
print(result.summary2())
그림 18
로지스틱 회귀 모델 피팅
from sklearn.linear_model import LogisticRegression
from sklearn import metricsX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
그림 19
테스트 세트 결과 예측 및 정확도 계산
y_pred = logreg.predict(X_test)
print(‘Accuracy of logistic regression classifier on test set: {:.2f}’.format(logreg.score(X_test, y_test)))
테스트 세트에 대한 로지스틱 회귀 분류기의 정확도: 0.74
혼란 매트릭스
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_test, y_pred)
print(confusion_matrix)
[[6124 1542] [2505 5170]]결과는 우리에게 6124 + 5170 정확한 예측과 2505 + 1542 잘못된 예측.
계산 정밀도, 재현율, F-측정 및 지원
에서 인용 사이킷 런 :
정밀도는 비율 tp / (tp + fp)입니다. 여기서 tp는 참 긍정의 수이고 fp는 거짓 긍정의 수입니다. 정밀도는 직관적으로 분류기가 샘플이 음수인 경우 양성으로 레이블을 지정하지 않는 능력입니다.
재현율은 tp / (tp + fn) 비율입니다. 여기서 tp는 참 긍정의 수이고 fn은 거짓 부정의 수입니다. 리콜은 직관적으로 분류기가 모든 양성 샘플을 찾는 능력입니다.
F-베타 점수는 F-베타 점수가 1에서 가장 좋은 값에 도달하고 0에서 가장 나쁜 점수에 도달하는 정밀도와 재현율의 가중 조화 평균으로 해석될 수 있습니다.
F-베타 점수는 베타 계수만큼 정밀도보다 재현율에 더 많은 가중치를 부여합니다. 베타 = 1.0은 재현율과 정밀도가 동등하게 중요함을 의미합니다.
지원은 y_test에서 각 클래스의 발생 횟수입니다.
from sklearn.metrics import classification_report print(classification_report(y_test, y_pred))
그림 20
해석 : 전체 테스트 세트 중 프로모션 정기예금의 74%가 고객이 선호하는 정기예금이었습니다. 전체 테스트 세트 중 고객이 선호하는 정기 예금의 74%가 승격되었습니다.
ROC 곡선
from sklearn.metrics import roc_auc_score from sklearn.metrics import roc_curve logit_roc_auc = roc_auc_score(y_test, logreg.predict(X_test)) fpr, tpr, thresholds = roc_curve(y_test, logreg.predict_proba(X_test)[:,1]) plt.figure() plt.plot(fpr, tpr, label=‘Logistic Regression (area = %0.2f)’ % logit_roc_auc) plt.plot([0, 1], [0, 1],‘r–’) plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel(‘False Positive Rate’) plt.ylabel(‘True Positive Rate’) plt.title(‘Receiver operating characteristic’) plt.legend(loc=lower right) plt.savefig(‘Log_ROC’) plt.show()
그림 21
수신기 작동 특성(ROC) 곡선은 이진 분류기와 함께 사용되는 또 다른 일반적인 도구입니다. 점선은 순전히 무작위 분류기의 ROC 곡선을 나타냅니다. 좋은 분류기는 가능한 한 해당 선에서 멀리 떨어져 있습니다(왼쪽 위 모서리 쪽으로).
이 게시물을 만드는 데 사용된 Jupyter 노트북을 사용할 수 있습니다. 여기 . 위의 사항에 대한 피드백이나 질문을 받게 되어 기쁘게 생각합니다.
읽어 주셔서 감사합니다 ❤
이 게시물이 마음에 들면 모든 프로그래밍 친구와 공유하십시오!
우리를 따라 오세요 페이스북 | 트위터
추가 읽기
☞ 머신 러닝 A-Z™: 데이터 과학의 Python 및 R 실습
☞ 데이터 과학 및 기계 학습을 위한 Python Bootcamp
☞ Python을 사용한 머신 러닝, 데이터 과학 및 딥 러닝
☞ Deep Learning A-Z™: 실습 인공 신경망
☞ 인공 지능 A-Z™: AI 구축 방법 배우기
☞ Python의 완전한 기계 학습 프로젝트 둘러보기
☞ 머신러닝: 제로에서 히어로로 가는 방법
☞ 개발자를 위한 상위 18개 기계 학습 플랫폼
☞ 파이썬 프로그래밍과 기계 학습에 관한 10가지 놀라운 기사
☞ 100개 이상의 기본 머신러닝 인터뷰 질문과 답변
#파이썬 #머신러닝
키워드에 대한 정보 파이썬 로지스틱 회귀분석
다음은 Bing에서 파이썬 로지스틱 회귀분석 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 [파이썬 실습] 로지스틱회귀 모델
- 동영상
- 공유
- 카메라폰
- 동영상폰
- 무료
- 올리기
YouTube에서 파이썬 로지스틱 회귀분석 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 [파이썬 실습] 로지스틱회귀 모델 | 파이썬 로지스틱 회귀분석, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.