<jupyter_start><jupyter_text>랜덤 포레스트, XGBoost, 인공신경망 - 의사결정 트리에서 파생된 모델로 앙상블 학습기법을 적용한 모델이다.- 앙상블 학습기법이란 새로운 데이터에 대해서 여러 개의 트리로 학습을 수행한 후 학습 결과들을 종합해서 예측하는 모델이다.- 기존의 의사결정 트리 방식에 비해서 많은 데이터를 이용하여 학습을 수행하기 때문에 비교적 예측력이 뛰어나고, 과적합 문제를 해결할 수 있다. - 과적합 문제? 학습 데이터 셋에서는 높은 정확도가 나타나지만 새로운 데이터에서는 정확도가 떨어지는 현상을 의미한다. - 랜덤 포레스트 모델은 기본적으로 raw data를 대상으로 복원추출 방식으로 데이터의 양을 증가시킨 후 모델을 생성하기 때문에 데이터의 양이 부족해서 발생하는 과적합 문제를 해결할 수 있다. - 구성된 학습데이터를 이용하여 학습한 결과를 종합하여 예측 모델을 생성한다. 즉, 각각의 분류모델에서 예측된 결과를 토대로 투표방식으로 최적의 예측치를 선택하게 된다. --- - 랜덤 포레스트 학습데이터 구성방법  - 표본에서 일부분만 복원추출 방법으로 랜덤하게 샘플링하는 방식인 부트스트랩 표본 방식으로 학습데이터를 추출하여 트리를 생성한다.   - 입력 변수 중에서 일부 변수만 적용하여 트리의 자식 노드를 분류한다.<jupyter_code>install.packages('randomForest')
library(randomForest)
data(iris)

model = randomForest(Species~. , data = iris)
model<jupyter_output>Warning message:
"package 'randomForest' is not available for this version of R

A version of this package for your version of R might be available elsewhere,
see the ideas at
https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages"
randomForest 4.6-14

Type rfNews() to see new features/changes/bug fixes.<jupyter_text>- Number of trees: 500 $\to$  학습데이터로 500개의 포레스트가 복원 추출방식으로 생성되었다는 의미.- No. of variables tried at each split: 2 $\to$ 두 개의 변수를 이용하여 트리의 자식 노드가 분류되었다는 의미이다.<jupyter_code>model2 = randomForest(Species~., data= iris, ntree = 300, mtry = 4, na.action = na.omit)
model2<jupyter_output><empty_output><jupyter_text>- 랜덤 포레스트의 수를 300개, 자식 노드를 분류하는 변수를 4개로 지정하여 모델을 생성.- na.action 속성은 결측치가 있는 경우 처리할 방법을 지정하는 속성이다. 여기서는 na.omit() 생략 함수를 이용하여 결측치를 제거한다.<jupyter_code># 중요 변수를 생성하여 랜덤포레스트 모델 생성
model3 = randomForest(Species~., data = iris, importance = T, na.action = na.omit)

# 중요 변수 보기
importance(model3)<jupyter_output><empty_output><jupyter_text>- importance 속성은 분류모델을 생성하는 과정에서 입력 변수 중 가장 중요한 변수가 어떤 변수인지를 알려주는 역할을 한다. - MeanDeceaseAccuracy는 분류정확도를 개선하는 데 기여한 변수를 수치로 제공- MeanDecreaseGini는 노드 불순도(불확실성)를 개선하는 데 기여한 변수를 수치로 제공- 따라서 iris의 꽃의 종류를 분류하는 데 있어 4개의 x 변수 중에서 가장 크게 기여하는 변수(즉, 중요변수)는 Petal.Length로 나타난다.<jupyter_code># 중요 변수 시각화
varImpPlot(model3)<jupyter_output><empty_output><jupyter_text>- 참고)   - 엔트로피 = 불확실성 척도    - 엔트로피가 작으면 불확실성이 낮아진다. 즉, 불확실성이 낮아지면 그만큼 분류정확도가 향상된다고 볼 수 있다.     - 예를 들어, 앞면과 뒷면이 나올 확률이 동일한 경우 엔트로피 결과는 1이라면, 앞면이 나올 확률이 더 높은 경우엔 엔트로피는 0.88로 낮아진다. 이유는 앞면이 나올 확률이 높아졌기 때문에 그만큼 불확실성이 낮아진 것이다.  - 최적의 파라미터(ntree, mtry) 찾기<jupyter_code># 속성값 생성
ntree = c(400, 500, 600) # 랜덤 포레스트 수
mtry = c(2:4) # 자식 노드를 분류하는 변수의 수
param = data.frame(n = ntree, m = mtry)
param
# 이중 for() 함수를 이용하여 모델 생성
for(i in param$n){
    cat('ntree=', i, '\n')
    for(j in param$m){
        cat('mtry=',j,'\n')
        model_iris = randomForest(Species~., data = iris, ntree = i, mtry = j, na.action = na.omit)
        print(model_iris)}}<jupyter_output>ntree= 400 
mtry= 2 

Call:
 randomForest(formula = Species ~ ., data = iris, ntree = i, mtry = j,      na.action = na.omit) 
               Type of random forest: classification
                     Number of trees: 400
No. of variables tried at each split: 2

        OOB estimate of  error rate: 4.67%
Confusion matrix:
           setosa versicolor virginica class.error
setosa         50          0         0        0.00
versicolor      0         47         3        0.06
virginica       0          4        46        0.08
mtry= 3 

Call:
 randomForest(formula = Species ~ ., data = iris, ntree = i, mtry = j,      na.action = na.omit) 
               Type of random forest: classification
                     Number of trees: 400
No. of variables tried at each split: 3

        OOB estimate of  error rate: 4.67%
Confusion matrix:
           setosa versicolor virginica class.error
setosa         50          0         0        0.00
versicolor      0         47         3        0.06
virginica[...]<jupyter_text>- 이중 for() 함수는 트리 3개와 변수 3이 곱해져서 전체 9회를 반복.- 9개의 모델이 생성된 결과에서 오차 비율(OOB)을 비교하여 최적의 트리와 변수를 결정한다.  --- - xgboost  - 랜덤 포레스트와 같은 앙상블 학습 기법으로 모델을 생성하는 분류모델이다.   - 부스팅 방식으로 기반으로 만들어진 모델이기 때문에 분류하기 어려운 특정 영역에 초점을 두고 정확도를 높이는 알고리즘으로 구현되었다.  - 따라서 높은 정확도가 가장 큰 강점이다.   - 배깅 방식과 동일하게 복원 추출방식으로 첫 번째 학습 데이터 셋을 생성하는 방법은 동일하지만, 두 번째부터는 학습된 트리 모델의 결과를 바탕으로 정확도가 낮은 영역에 높은 가중치를 적용하여 해당 영역을 학습 데이터 셋으로 구성되게 한다.     - 결론적으로 기계학습이 안 되는 데이터 셋을 집중적으로 학습하여 트리 모델의 정확도를 높이는 방식이다.     - 이상치에 취약할 수 있다.<jupyter_code>install.packages('xgboost')
library(xgboost)

# ifelse함수를 이용하여 y변수를 재정의하기
iris_label = ifelse(iris$Species == 'setosa', 0 , ifelse(iris$Species == 'versicolor',1,2))
table(iris_label)
head(iris,3) # 칼럼추가 전

# 칼럼 추가 후
iris$label = iris_label
head(iris,3)
# data set 생성
idx = sample(nrow(iris),  0.7*nrow(iris))
train = iris[idx,]
test = iris[-idx,]

# matrix 객체 변환
train_mat = as.matrix(train[-c(5:6)]) # 다섯번째와 여섯번째는 정답레이블이기 때문에 제외
# 정답 레이블 따로 추출
train_lab = train$label
# xgb.DMatrix로 객체 변환
dtrain = xgb.DMatrix(data = train_mat, label = train_lab)
dtrain

# model 생성 - xgboost matrix 객체를 이용
xgb_model = xgboost(data = dtrain, max_depth = 2, eta = 1, nthread = 2,nrounds = 2,
                   objective = 'multi:softmax',
                   num_class = 3,
                   verbose = 0)
xgb_model<jupyter_output><empty_output><jupyter_text>- xgboost 전용 xg.DMatrix() 함수를 이용하여 학습 데이터 셋을 생성한다.<jupyter_code># testset 생성
test_mat = as.matrix(test[-c(5:6)])
test_lab = test$label

# model prediction
pred_iris = predict(xgb_model, test_mat)
pred_iris<jupyter_output><empty_output><jupyter_text>- 트리 모델을 평가하기 위해서 검정 데이터 셋을 생성하고 predict() 함수를 이용하여 트리 모델에 검정 데이터 셋을 적용하여 예측치를 생성한다.<jupyter_code># confusion matrix 혼돈 매트릭스
table(pred_iris, test_lab)
# 모델 성능평가
(18 + 11 + 14)/length(test_lab)<jupyter_output><empty_output><jupyter_text>- 다른 모델에 비해서 분류정확도가 매우 높게 나타난 것을 확인할 수 있다.<jupyter_code># model의 중요 변수와 영향력 보기
importance_matrix = xgb.importance(colnames(train_mat), model = xgb_model)
importance_matrix

# 중요변수 시각화
xgb.plot.importance(importance_matrix)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09269949066213921, 'fraction_numerical': 0.020543293718166385, 'mean_word_length': 3.0655624568668047, 'pattern_counts': {'":': 0, '<': 35, '<?xml version=': 0, '>': 35, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 3, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '47035', 'license': 'Apache-2.0', 'n_tokens_mistral': 3707, 'n_tokens_neox': 4502, 'n_words': 790, 'path': '_notebooks/2022-03-02-r.ipynb', 'repo_name': 'rhkrehtjd/INTROr', 'size': '5890'}