Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

BASEMENT

로지스틱 회귀분석 본문

Programming/Machine Learning

로지스틱 회귀분석

2_34 2020. 9. 27. 17:21

로지스틱 회귀분석

 

1. 정의

 

- 독립변수의 선형 결합을 이용하여 사건의 발생 가능성을 예측할 때 사용하는 통계 기법

- 새로운 관측치가 있을 때 이를 기존의 범주 중 하나로 분류하는 것이 목적

ex) 제품이 불량인지 양품인지 분류

     고객이 이탈 고객인지 잔류 고객인지 분류

 

- 범주형 반응변수

- 이진변수 (반응 변수값 0 or 1) : y값은 0~1사이의 확률값

- 멀티변수 (반응 변수값 1 or 2 or 3 이상)

 

 

2. 과정

 

- 각 집단에 속하는 확률의 추정치를 예측. 이진분류의 경우 집단 1에 속하는 확률 P(Y=1)

- 추정확률 -> 분류 기준 값(cut-off) 적용 -> 특정 범주로 분류

 

- 순입력 함수의 값을 Sigmoid 함수에 대입

P(Y=1) >= 0.5 -> 집단 1로 분류

P(Y=1) < 0.5 -> 집단 0으로 분류

=> cutoff값 (여기서 0.5)는 사용자가 지정함

 

 

3. Odds (오즈)

 

- 실패(0)에 대한 성공(1)의 비율

- logit 변환 : Odds에 log를 씌운 것. 일반 회귀식으로는 0 또는 1을 예측할 수 없으므로 y값을 Odds 비로 변환하여 예측함

-> y값이 0~1사이가 됨

 

* 로지스틱 회귀분석 *

1) coef계수를 보고 음수이면 제외

2) p-value값 확인 -> 0에 가까울수록 중요한 변수. 1에 가까우면 coef가 양수여도 제외함

3) Odds ratio 보고 확률 판별 -> Odds 비율이 높을수록 확률이 높음

 

4. 로지스틱 회귀분석 사용

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(feautres, labels)
  • model.coef_ : 계수
  • model.intercept_ : 절편. 새로운 속성을 넣었을 때 그 레이블에 속하는지 아닌지 1또는 0으로 구성된 벡터 반환
  • model.predict(features) 
  • model.predict_proba(features) : 해당 레이블로 분류될 확률값을 알고 싶은경우 0~1사이의 값으로 돌려줌

 

5. 로지스틱 회귀분석 예제

 

1) 

from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import numpy as np
import pandas as pd

x_data = np.array([
    [2,1],
    [3,2],
    [3,4],
    [5,5],
    [7,5],
    [2,5],
    [8,9],
    [9,10],
    [6,12],
    [9,2],
    [6,10],
    [2,4]
])
y_data = np.array([0,0,1,1,1,0,1,1,1,1,1,0])

labels = ['fail', 'pass']

x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.2, random_state=2)
# LogisticRegression

model = LogisticRegression()
model.fit(x_train, y_train)

y_pred = model.predict(x_test)
print("before_accuracy", metrics.accuracy_score(y_test, y_pred))
# classification_report

from sklearn.metrics import classification_report

model = LogisticRegression()
model.fit(x_train, y_train)

y_pred = model.predict(x_test)
print("before_accuracy", metrics.accuracy_score(y_test, y_pred))

print(classification_report(y_test, y_pred, target_names=['class 0', 'class 1']))

 

2) breat_cancer 데이터

from sklearn import datasets

cancer = datasets.load_breast_cancer()

model = LogisticRegression()

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.25, random_state=42)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
print("before_accuracy", metrics.accuracy_score(y_test, y_pred))

# classification_report
print(classification_report(y_test, y_pred, target_names=['class 0', 'class1']))
y_test = y_test.tolist()
print(y_test.count(1))
# scaler - StandardScaler 적용

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
data_scaled = scaler.fit_transform(cancer.data)

X_train, X_test, y_train, y_test = train_test_split(data_scaled, cancer.target, test_size = 0.3, random_state=42)

model = LogisticRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
print("StandardScaler_accuracy", metrics.accuracy_score(y_test, y_pred))

 

3) wine 품질분석 데이터 (csv파일)

import pandas as pd
import numpy as np
import statsmodels.api as sm
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

wine_data = pd.read_csv("winequality-white.csv", delimiter=';', dtype=float)
wine_data.head(10)
x_data = wine_data.iloc[:,0:-1]		# 나머지 열
y_data = wine_data.iloc[:,-1]		# 마지막 열(quality)

# Score 값이 0보다 작으면 0, 8보다 크거나 같으면 1로 값 변경
y_data = np.array([1 if i>=8 else 0 for i in y_data])
x_data.head(5)
# train, test 데이터 나누기

train_x, test_x, train_y, test_y = train_test_split(x_data, y_data, test_size=0.3, random_state=42)

from sklearn.metrics import classification

log_reg = LogisticRegression()
log_reg.fit(train_x, train_y)

y_true, y_pred = test_y, log_reg.predict(test_x)

print(classification_report(y_true, y_pred))
# 변수에 대해 표로 확인 

import statsmodels.api as sm

logit = sm.Logit(train_y, train_x).fit()
logit.summary()
print(np.exp(logit.params))

# Odds ratio : 1을 기준으로 높은 값이 영향력 있음.
# density의 odds ratio값이 가장 높으므로 density가 낮을 수록 좋은 품질의 와인이 될 확률이 높음

 

'Programming > Machine Learning' 카테고리의 다른 글

KNN 알고리즘  (0) 2020.09.27
모델 성능 평가 척도, ROC 커브  (0) 2020.09.27
Sklearn과 선형회귀분석  (0) 2020.09.27
데이터 전처리  (0) 2020.09.27
머신러닝 개요  (0) 2020.08.16
Comments