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)
'R' 카테고리의 다른 글
[R] k, M 변환 (0) | 2021.07.16 |
---|---|
[R] 숫자 콤마(,) 제거 - gsub() (2) | 2021.07.15 |
[R] RMSE, R2, RSS, SStot, AUC, accuracy, precision, recall, F1 score 구하는 방법 (0) | 2021.07.12 |
[R] Regression - lm()를 사용한 linear regression (0) | 2021.07.10 |
[R] MAC read.csv encoding error 해결방법 (0) | 2021.07.06 |