【SIGNATE】책의 지식만으로 SIGNATE의 연습 문제에 도전해 보았다

서적 「[제2판] Python 기계 학습 프로그래밍 달인 데이터 사이언티스트에 의한 이론과 실천」으로부터 얻은 지식을 바탕으로,
SIGNATE 연습 문제에 도전해 보았습니다.

개발 환경


  • MacOS Catalina 10.15.3
  • Anaconda Navigator 1.9.7
  • Python 3.7
  • Jupiter Notebook 6.0.1

  • 이번 도전한 연습 문제



    【연습 문제】자동차 평가
  • 6개의 자동차의 속성 데이터로부터 평가치(unacc, acc, good, vgood)를 예측한다
  • 속성 데이터(특징량)는 다음 6개



  • 속성 이름
    설명


    구매
    자동차 판매 가격(vhigh, high, med, low)

    maint
    정비대(vhigh, high, med, low)

    doors
    문 수(2, 3, 4, 5, more.)

    사람
    정원 (2, 4, more.)

    lug_boot
    트렁크 크기(small, med, big.)

    safety
    안전성(low, med, high)


    문제를 풀어 보았습니다.



    우선 데이터 세트의 내용을 확인


    # データセットを読み込むためにpandasをインポートする
    import pandas as pd
    
    # pandasのread_csvメソッドを用いてトレーニングデータ(train.tsv)を読み込む
    # トレーニングデータはサイトからダウンロード済み
    train_data = pd.read_csv('./train.tsv', delimiter='\t')
    
    # トレーニングデータを表示
    train_data
    



    특징량의 문자열 데이터는 수치로 변환할 수 있고 책에 쓰여 있었으므로, 데이터의 문자열을 수치로 변환한다
    ※이번 사용한 데이터 세트에 포함되는 특징량은 모두 순서 특징량으로 분류되는 것이므로, 단순히 문자열을 순서대로 수치로 변환했다
    # 各特徴量の変換用の辞書を設定する
    buying_mapping = {'vhigh': 4, 'high': 3, 'med': 2, 'low': 1}
    maint_mapping = {'vhigh': 4, 'high': 3, 'med': 2, 'low': 1}
    doors_mapping = {'5more': 5, '4': 4, '3': 3, '2': 2}
    persons_mapping = {'more': 6, '4': 4, '2': 2}
    lug_boot_mapping = {'big': 3, 'med': 2, 'small': 1}
    safety_mapping = {'high': 3, 'med': 2, 'low': 1}
    
    # クラスラベル(class)の変換用の辞書を設定する
    class_mapping = {'vgood': 4, 'good': 3, 'acc': 2, 'unacc': 1}
    
    # トレーニングデータの各特徴量を変換する
    train_data['buying'] = train_data['buying'].map(buying_mapping)
    train_data['maint'] = train_data['maint'].map(maint_mapping)
    train_data['doors'] = train_data['doors'].map(doors_mapping)
    train_data['persons'] = train_data['persons'].map(persons_mapping)
    train_data['lug_boot'] = train_data['lug_boot'].map(lug_boot_mapping)
    train_data['safety'] = train_data['safety'].map(safety_mapping)
    
    # トレーニングデータのクラスラベル(class)を変換する
    train_data['class'] = train_data['class'].map(class_mapping)
    
    # 変換後のトレーニングデータを表示
    train_data
    



    전환 완료

    교육 데이터를 특징 량과 클래스 라벨로 나누기
    # pandasのilocメソッドを用いてトレーニングデータを特徴量(train_data_X)とクラスラベル(train_data_Y)に分離する
    # idは学習に用いないため別に保管する
    train_data_X = train_data.iloc[:,2:]
    train_data_Y = train_data.iloc[:,1:2]
    train_data_id = train_data.iloc[:,0:1]
    

    마지막으로 교육 데이터를 학습 데이터와 검증 데이터로 나눕니다.
    from sklearn.model_selection import train_test_split
    
    # トレーニングデータを学習用データ(learning_data)と検証用データ(learning_data)に分割する
    learning_data_X, validation_data_X, learning_data_Y, validation_data_Y = train_test_split(
        train_data_X, train_data_Y, test_size=0.3, random_state=1, stratify=train_data_Y)
    

    이제 학습을 준비 할 수있었습니다.

    우선 물류 회귀로 시도했습니다.



    로지스틱 회귀가 가장 간단했기 때문에 우선 로지스틱 회귀로 시도했습니다.

    특징량은 스케일링 미끄러짐과 책에 쓰여 있었으므로, 우선은 특징량의 표준화를 실시한다
    from sklearn.preprocessing import StandardScaler
    
    stdsc = StandardScaler()
    
    stdsc.fit(learning_data_X)
    
    # トレーニングデータの特徴量の標準化を行う
    learning_data_X_std = stdsc.transform(learning_data_X)
    validation_data_X_std = stdsc.transform(validation_data_X)
    

    표준화 전의 데이터(learning_data_X)는 이런 느낌

    표준화 후의 데이터(learning_data_X_std)는 이런 느낌


    데이터를 보더라도 잘 모르겠지만 표준화 할 수있는 것 같습니다.

    학습 데이터를 사용하여 로지스틱 회귀 클래스 학습
    from sklearn.linear_model import LogisticRegression
    
    lr = LogisticRegression(C=100.0, random_state=1)
    
    # 標準化した学習用データを用いてロジスティック回帰クラスを学習する
    lr.fit(learning_data_X_std, learning_data_Y)
    

    마지막으로 검증 데이터를 이용하여 예측
    score = lr.score(validation_data_X_std, validation_data_Y)
    score
    



    이번에 만든 모델의 점수는 79.23%
    덧붙여서, SIGNATE에서는 이 문제에 대한 모델의 랭킹을 공표하고 있어 현시점에서의 1위는 100%, 100위로 96.875%
    (이번에 만든 모델, 절망적으로 정밀도 나쁘네..)

    책을 조금 읽었을 뿐이라면 아직 안돼. 정진하지 않으면.



    이번 로지스틱 회귀의 모델은 하이퍼파라미터(C)의 최적화도 정규화항의 최적화도 실시하고 있지 않습니다
    (C=1.0으로 계산하면 score가 77.69%로 떨어졌으므로 어쩌면 기적적으로 네 느낌의 파라미터를 선택했을지도 모릅니다만)

    아직도 개량의 여지가 있으므로, 향후 이 모델을 개량해 나갈 것입니다
    (일단 90%의 점수가 나올 때까지 노력하겠습니까?)

    좋은 웹페이지 즐겨찾기