재형이의 성장통 일지
  • 제조 데이터의 분류기 실습
    2024년 03월 14일 05시 35분 22초에 업로드 된 글입니다.
    작성자: 재형이
    반응형
     

     

    • 실습 위주라 블로그에 정리하기가 애매하군

     

     

     

     

     

     


     

     

     

     

     

     

     

    제조 데이터의 분류기 실습

    1. 데이터 로드

    • numpy와 pandas는 데이터를 로드하고 형식에 맞게 변형
    • matplotlib.pyplot과 seaborn은 데이터 시각화를 위해 사용
    # 라이브러리 & 데이터 로드
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    df = pd.read_csv('exercise1.csv')
    
    df.head()

    실제 데이터
    dh.head() 출력 화면

    • df.shape로 데이터 프레임의 형태를 파악할 수 있다
    • 총 1000개의 행과 7개의 열로 이루어져있다는 것을 확인할 수 있다
    df.shape
    # (1000, 7)
    • target은 0과 1로 구분되어있게 구성했다. 진짜 그러한지 확인해보고 각각 0과 1은 몇개씩 있는지 확인해보자
    df['target'].unique()
    # array([0, 1])
    
    df['target'].value_counts()
    # 0    588
    # 1    412
    # Name: target, dtype: int64

    2. 데이터 탐색

    • 각 데이터들의 갯수, 평균, 분포 등을 확인
    # 데이터 탐색
    df.describe()

    • 차트로 시각화를 해보자
    # 데이터 시각화
    nrows, ncols = 2, 3
    fig, axs = plt.subplots(nrows=nrows, ncols=ncols)
    fig.set_size_inches(10,6)
    
    for i in range(nrows):
        for j in range(ncols):
            attr = i * ncols + j
            sns.histplot(x=df.columns[attr], data=df, hue = 'target', ax=axs[i][j])

    3. 데이터 분할 : trainset. testset

    • 머신러닝 모델을 학습하고 그 결과를 검증하기 위해서는 원래의 데이터를 Training, Validation, Testing의 용도로 나누어 다뤄야 한다. 그렇지 않고 Training에 사용한 데이터를 검증용으로 사용하면 시험문제를 알고 있는 상태에서 공부를 하고 그 지식을 바탕으로 시험을 치루는 꼴이므로 제대로 된 검증이 이루어지지 않기 때문이다
    • train_test_split

    4. 모델 인스턴스 생성

    • DecisionTreeClassifier, RandomForestClassifier, GradientBoostingClassifier, XGBClassifier, LGBMClassifier 모델들을 사용할 것이다

    5. 모델 학습

    • .fit(X, y)
    • X(독립변수, feature)를 y(종속변수, target)에 맞춘다

    6. 모델 평가

    • 모델을 평가하기 위한 지표는 다양하지만 여기서는 기본적인 평가 지표 중 하나인 accuracy를 사용
    • classifier : accuracy
    • accuracy_score()
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.ensemble import GradientBoostingClassifier
    from xgboost import XGBClassifier
    from lightgbm import LGBMClassifier
    
    # 3. 데이터 분할 
    X = df.iloc[:, :6]
    y = df['target']
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42, stratify = y)
    
    # 4. 모델 인스턴스 생성
    dt_cls = DecisionTreeClassifier(random_state=42)
    rf_cls = RandomForestClassifier(random_state=42)
    gb_cls = GradientBoostingClassifier(random_state=42)
    xgb_cls = XGBClassifier(random_state=42)
    lgb_cls = LGBMClassifier(random_state=42)
    
    # 5. 모델 학습
    dt_cls.fit(X_train, y_train)
    rf_cls.fit(X_train, y_train)
    gb_cls.fit(X_train, y_train)
    xgb_cls.fit(X_train, y_train)
    lgb_cls.fit(X_train, y_train)
    
    # 6. 모델 평가
    y_pred_dt = dt_cls.predict(X_test)
    y_pred_rf = rf_cls.predict(X_test)
    y_pred_gb = gb_cls.predict(X_test)
    y_pred_xgb = xgb_cls.predict(X_test)
    y_pred_lgb = lgb_cls.predict(X_test)
    
    print('DecisionTree accuracy:{}'.format(accuracy_score(y_test, y_pred_dt)))
    print('RandomForest accuracy:{}'.format(accuracy_score(y_test, y_pred_rf)))
    print('GB accuracy:{}'.format(accuracy_score(y_test, y_pred_gb)))
    print('XGB accuracy:{}'.format(accuracy_score(y_test, y_pred_xgb)))
    print('LGB accuracy:{}'.format(accuracy_score(y_test, y_pred_lgb)))
    
    # DecisionTree accuracy:0.8
    # RandomForest accuracy:0.91
    # GB accuracy:0.915
    # XGB accuracy:0.89
    # LGB accuracy:0.905
    • 다양한 분류기 사용 :
      1. DecisionTreeClassifier
      2. RandomForestClassifier
      3. GradientBoostingClassifier
      4. XGBClassifier
      5. LGBMClassifier

    SVC 모델 성능 개선해보기

    • 0.72의 굉장히 낮은 accuracy score를 보여주고 있다
    from sklearn.svm import SVC
    svc = SVC()
    svc.fit(X_train, y_train)
    y_pred = svc.predict(X_test)
    accuracy_score(y_test, y_pred)
    
    # 0.72
    • 현재 우리가 사용하고 있는 Train 데이터 세트를 살펴보자

    • 컬럼 a1과 a2만 봐도 a1은 굉장히 범위가 큰 반면에 a2는 상당히 작은 범위에서 데이터들이 몰려있다는 것을 알 수 있다
    • SVC 모델은 데이터들 간의 거리를 기준으로 판별하기 때문에 스케일이 비슷하게 분포가 되어있어야 더 좋은 결과를 가져올 수 있다

    from sklearn.preprocessing import StandardScaler
    
    sc = StandardScaler()
    X_scale = sc.fit_transform(X)
    
    X_train, X_test, y_train, y_test = train_test_split(X_scale, y, test_size = 0.2, random_state = 42, stratify = y)
    
    svc = SVC()
    svc.fit(X_train, y_train)
    y_pred = svc.predict(X_test)
    accuracy_score(y_test, y_pred)
    
    # 0.92
    • 데이터 전처리(데이터 분석을 위해 수집한 데이터를 분석에 적합한 형태로 가공하는 과정)의 중요성!!!

     

     

     

     

     

     

     


     

     

     

     

     

     

     

    반응형
    댓글