본문 바로가기
코알라UNIV

10주차 데이터로 꽃의 종류를 구분해보자

by 인듯아닌듯 2019. 12. 23.

Decision Tree 모델의 단점은 주어진데이터에 너무 과도하게 맞춘다는데에 있다.

이러한 현상을 Overfitting 됬다고 한다.

지난 주차에 train 데이터에 대해서 .score을 내면 상당히 높은 값이 나오지만, 실제 valid or test 데이터에 대해서 .score을 하면 점수가 많이 떨어지는 것을 확인 할 수 있었다. Overfitting 때문이다.

 

물론 데이터가 많을 수록 이러한 overfitting은 자체적으로 보안되지만, 제한된 데이터(자원)이 있는 경우가 문제이다.

Decision Tree의 이러한 overfitting 하는 단점을 보안하기 위해 만들어진 방법이 ensemble(앙상블)기법이다.

마치 현상에 대한 예측 결과를 여러명의 전문가에게 묻고 그 의견을 종합하는 것이 더 좋은 예측 결과를 낳을 수 있듯이 여러개의 DecisonTree 모형을 만든 후 그 결과를 취합하는 것이다.


stage 1

stage 1에서는 같은 데이터라도 decisionTree를 형성할 때마다 모형이 조금씩 달라져서, valid data에 대해 .score을 했을 때 그 점수가 변하는 것을 보았고, 따라서 여러개의 decisionTree를 형성한 후에 나오는 값의 평균을 결과로 가지는
"수제 decison Tree ensemble"을 실습해보았다.


- data에서 train 과 valid 데이터를 나누는 방법

1. slicing

x_valid=x_train[0:100]

x_trian=x_train[100:]

 

2. train_test_spilt 라이브러리

sklearn 안에 있는 train_test_split module

input_data는 x_train ,x_test 로 split됬고 target_data는 y_train, y_test로 split됬다. 랜덤하게 list로 값을 나누어주며, 데이터의 갯수는 0.75 : 0.25로 나누어준다. 수치는 train_size = 0.8 <=> test_size=0.2 두가지 방식의 하이퍼파라미터에의해 변경해 줄 수 있다.


stage 3

앙상블 기법을 갖추고 있는 것이 RandomForest 모델이다.

코알라에서 준 자료로 실습해보았다. 하는 방법은 DecisonTree처럼 간단하다.

  train valid
DecisionTreeClassifier 0.94 0.78
RandomForestClassifier 1 0.94

실제 의미가 있는 valid data에서 16%의 정확도 상승을 보여주었다.

 

RandomForest의 하이퍼파라미터에는 자주 쓰이는 2가지가 있다.

  overfitting ↓
n_estimators 값이 클수록(default= 100)
max_depth 값이 작을 수록(default =∞)

stage 4

randomforest를 이용하여, 모델을 만든 후에 입력값에 따른 결과를 출력해주는 형태를 만들어보았다.

마치 개인의 선호도를 넣으면 맞춤형 음식이나 옷 같은 정보를 추천해주는 프로그램 같았다.

 

우리 스터디는 stage4를 각자 관심분야에서 진행해보았다.

나는 동물에 관심이 있어서, 동물의 여러가지 특성과 그 동물을 좋아하면 1 , 좋아하지 않으면 0을 기입하여 csv파일로 저장하고

dataframe으로 load하여, FeatureEngineering(전처리)과 machineLearning(RandomForest)를 진행해보았다.

 

이전에 배운 내용을 써먹기위해 빈칸을 뚫었다. 아래 코드를 통해 채워넣어보자

채ㅝ!

실제로 해보니, 가장 귀찮은 FeatureEngineering 이다. 문자열을 숫자로 바꾼다는 것이 생각보다 귀찮았다.

숫자로 변환하기위해 딕셔너리(다른 프로그램이언어에서는 'object'라고도 하더라..)를 만들고, mapping을 진행해보았다.

짜잔~

그 이후에는 정보를 list에 담아서 [ , , , , , ] predict로 건내주면, 내가 해당 성질을 가지고 있는 동물을 좋아할지 안좋아할지 알려준다.ㅋㅋ


+df.describe() -> 각 column에 대한 갯수, 평균 , 표준오차 등을 낱낱히 알려준다.

밑에 나오는 'Box plot의 수치값' 을 표로 나타낸 것 과 같다.

+Box Plot 의미