본문 바로가기

R

[R] Classification - Logistic Regression을 사용한 classification

반응형

Logistic Regression을 사용한 classification의 큰 틀은 아래와 같다.

 

1. Load Data

  - read.csv()

  - load()

2. Data preperation and Cleaning

  - colSums(is.na())

  - dim() / str() / summary()

  - cut()

  - na.omit()

3. Making Model

  - glm()

4. Predict

  - predict()

5. Model evaluation

  - AUC,  etc.

 

 

여기에서, "classification"을 logistic "regression"으로 한다는 것이 이해가 안될 수도 있다.

확률은 모두가 알다시피 0~1의 값으로 도출된다.

 

lm()(linear regression)은 regression에만 적용할 수 있다. 근데 우리는 classification도 풀고 싶을 때가 있다. 그럴 때 lm은 적합하지 않다. y가 true일 확률을 알고 싶은데, 여기에 바로 lenear regression을 적용시킬 수 없다. 확률값은 0~1값 가져야 하는데 linear regression은 -무한대 ~ 무한대의 값을 추정하기 때문이다.기본적으로 linear model은 x, ^y값이 숫자여야 한다. 그런데 classification은 ^y가 TRUE/FALSE 일 때가 많다. 

 

여기에서 glm()(logistic regression)으로 확률을 구해서, threshold(임계값)을 설정한다면 0~1사이의 확률값을 TRUE/FALSE로 구분할 수 있다. 또한 threshold를 자유자재로 설정하기 편하다.

따라서 나는 Classification에 Logistic Regression을 사용하였다.

 

참고로, Logistic Regression을 Regression에도 적용가능하다. 확률은 0~1 사이 값이지만 확률의 로직값은 -무한대~무한대 값이기 때문이다. 이건 선형으로 쓸 수 있다. 즉, 선형회귀모델에 쓸 수 있다.

 

 

 

 

 

 

Classification 예제 코드는 아래와 같다.

아래는 스페인 기업들의 부도를 예측하는 코드이다.

 

#load dataframe and Data preperation and cleaning

train_df <- read.csv('bankruptcy_spain_train.csv')
test_df <- read.csv('bankruptcy_spain_test.csv')
str(train_df)
dim(train_df)
dim(test_df)
summary(train_df)
colSums(is.na(train_df))
train_df <- na.omit(train_df)
colSums(is.na(test_df))
train_df[is.na(train_df)] <- 0
test_df[is.na(test_df)] <- 0
train_df$AGE[train_df$AGE < 0] <- 0
test_df$AGE[test_df$AGE <0] <- 0
dim(test_df)

 

#making model
model <- glm(BANKRUPTCY ~ SIZE + NUMBER_EMPLOYEES + AGE + SOCIAL_CODE * LINKED_GROUP + 
               NUMBER_PARTNERS+  YEAR  + PROVINCE_CODE+ CHANGES_LOCATION + DEBT_STRUCTURE + DEBT_COST+ DEBT_PAYING_AVAILABILITY+ DEBT_RATIO +
               WORKING_CAPITAL+ WARRANTY + OPERATING_INCOME_MARGIN + RETURN_OPERATING_ASSETS + RETURN_EQUITY+ RETURN_ASSETS +
               STOCK_TURNOVER + ASSET_TURNOVER + RECEIVABLE_TURNOVER+ ASSET_ROTATION + FINANCIAL_SOLVENCY+ ACID_TEST +
               DELAY_ACCOUNTS + NUMBER_JUDICIAL_INCIDENCES_TOTAL*NUMBER_JUDICIAL_INCIDENCES_YEAR + 
               SPENT_JUDICIAL_INCIDENCES_TOTAL + SPENT_JUDICIAL_INCIDENCES_YEAR +
               NUMBER_SERIOUS_INCIDENCES+ AUDITED + AUDITORS_OPINION
             ,
             data = train_df, family=binomial(link='logit'))

#predict

#threshold - 0.38
train_df$pred <- predict(model, newdata = train_df, type = 'response')
prob_bankruptcy_test <- predict(model, newdata=test_df, type='response')
pred_bankruptcy_test <- as.vector(prob_bankruptcy_test > 0.38, mode = 'logical')
summary(model)

 

#AUC
calAUC <- function(predCol, targetCol){
  perf <- performance(prediction(predCol, targetCol), 'auc')
  as.numeric(perf@y.values)
}
calAUC(train_df$pred, train_df$BANKRUPTCY)

728x90
반응형