Optuna×XGBoost에서 레드wine_quality

14265 단어 Optunaxgboost

개시하다


XGBoost를 반을 나누는 것이 아니라 복귀에 쓰다.(말은 그렇지만 결과는 10가지 분류)
그래서 다양한 요소 중에서 레드와인을 골라내는 퀄리티의 모형을 만들었다.
결론적으로 정밀도는 그리 높지 않다.

운영 환경 및 라이브러리


이전 글 참조

이루어지다

  • 적절한 매개 변수로 진행(max depth,learning rate,round num)
  • 1의 매개 변수를optuna
  • 로 설정
  • 증가 매개 변수
  • XGBoost의 두 가지 회귀 알고리즘
    *선형 회귀
    * 로직 회귀
    다 해봤는데.
    또한 데이터 속성은 모두 사용한다.

    프리 프로세싱


    preprocess
    def preprocess(df):
        df[target_column] = df[target_column] /10
        return df
    
    논리 회귀를 사용하기 위해 Quality[0,10]를 [0,1]의 소수 처리로 한다.
    최대치로 나누려고 했는데 무한 소수에 도달했을 때 정밀도가 전혀 없어 10으로 나눴다.
    원시 데이터는 이미 모두 수치이기 때문에 수치 변환을 하지 않는다.
    모든 속성을 사용하여drop도 하지 않습니다.

    XGBoost의 학습


    train
    def train(df,max_depth,learning_rate,num_round,how_objective):
        train_x = df.drop(target_column,axis=1)
        train_y = df[target_column]
        dtrain = xgb.DMatrix(train_x,label=train_y)
        param = { 'max_depth':max_depth,'learning_rate':learning_rate,'objective':how_objective,'silent':1}
        bst = xgb.train(param,dtrain,num_round)
        return bst
    
    target_column은 목표 변수입니다

    optuna의 목적 함수 정의


    objective
    def objective(df, df_test, y, how_objective, trial):
        #目的関数
        max_depth = trial.suggest_int('max_depth',1,30)
        learning_rate = trial.suggest_uniform('learning_rate',0.0,1.0)
        round_num = trial.suggest_int('round_num',1,30)
        bst = train(df,max_depth,learning_rate,round_num,how_objective)
        answer = predict(bst,df_test).round().astype(int)
        score = accuracy_score(answer,y.astype(int))
        return 1.0 - score
    
    max_depth, learning_rate, round_num를 조정하다.

    main 함수


    main
    def main():
        global target_column
        df_original = pd.read_csv("/Users/pc1013/Desktop/first/XGBoost_optuna/df/winequality-red.csv")
        df = preprocess(df_original)
        (df_train, df_test) = train_test_split(df, test_size = 0.1, random_state = 666)
        y = df_test[target_column]*10
        df_test = df_test.drop(target_column,axis=1)
    
        how_objective = 'reg:logistic' #or 'reg:linear'
    
        '''
        学習と結果出力
        必要があればoptunaの前処理とチューニング
        '''
    

    실행 결과


    적당히 매개 변수를 만들다

    #ハイパーパラメータ
        max_depth = 6
        learning_rate = 0.1
        round_num = 10
    
    위에서부터 linear와logistic


    세 개의 매개 변수를 자동으로 조정하다


    위에서부터 linear와logistic


    완벽한 과장

    여러 매개변수 자동 조정


    위에서부터 linear와logistic


    개진


    데이터 사전 처리 수정

  • 기여도가 낮은 citric acid,free sulfur dioxide,sulphates
  • 를 데이터에서 집중적으로 삭제한다.

    optuna 변경

  • 시험횟수(n trial) 200회
    매개변수 범위
  • max_depth ≤ 30
  • round_num ≤ 30
  • learning_rate ≤ 1.0
  • gamma ≤ 10.0
  • min_childe_weigh ≤ 10.0
  • alpha ≤ 10.0
  • def preprocess(df):
        df = df.drop(['citric acid','free sulfur dioxide','fixed acidity','alcohol'],axis=1)
        df[target_column] = df[target_column] /10
        return df
    
    #ハイパーパラメータの範囲(objective関数内)
        max_depth = trial.suggest_int('max_depth',1,25)
        learning_rate = trial.suggest_uniform('learning_rate',0.0,1.0)
        round_num = trial.suggest_int('round_num',1,30)
        gamma = trial.suggest_uniform('gamma',0.0,10.0)
        colsample_bytree = trial.suggest_uniform('colsample_bytree',0.0,1.0)
        min_childe_weigh = trial.suggest_uniform('min_childe_weigh',0.0,10.0)
        alpha = trial.suggest_uniform('alpha',0.0,10.0)
    

    실행 결과 #2


    위에서부터 linear와logistic


    과도한 공부가 좋아졌어요...?(없음)

    총결산


    정밀도가 나오지 않다.
    자동화라고는 하지만 과도한 학습을 막기 위해서는 초파라미터의 범위를 조정해야 한다.

    좋은 웹페이지 즐겨찾기