ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 패스트캠퍼스 환급챌린지 32일차 미션 (3월 3일) : 딥러닝·인공지능 Signature 초격차 패키지 Online. 강의 후기
    패스트캠퍼스 챌린지 2024. 3. 3. 19:12

     

    자, 오늘은 

     

    CH02-02. 제조 데이터의 분류기 실습 - 02.주요 코드 미리보기

    &

    CH02-03. 제조 데이터의 분류기 실습 - 03. 실습&CH03-01. 자전거 대여량 예측 모델 실습 - 01.문제 정의 및 데이터의 이해

     

     

     

     

    CH02-02. 제조 데이터의 분류기 실습 - 02. 주요 코드 미리보기

    어제 강의와 이어서 마저 코드를 살펴보자

     

    from sklearn.model_selection import train_test_split
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.metrics import accuracy_score



    #1. 데이터 분할
    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)

    #2. 모델 인스턴스 생성
    model = DecisionTreeClassifier(random_state = 42)

    #3. 모델 학습
    model.fit(X_train, y_train)

    #4. 모델 평가
    y_pred = model.predict(X_test)
    accuracy_score(y_test, y_pred)

     

     

    코드를 살펴보면,

     

    데이터 분할을 위해 train_test_split을 사용하고, 

    DecisionTreeClassifier을 이용해 모델을 만들고,

    나중에 평가는 Accuracy_score을 사용할 것이다.

     

    임포트를 한 후에, 데이터 분할을 한다.

    우리가 사용하는 데이터 프레임은 총 7개의 컬럼과 1000개의 인스턴스가 있는데, feature로 사용할 값을

    X에 할당한다. [:, :6] 0~5까지 컬럼

    이렇게 종속변수 독립변수 할당한 후 , train, test 셋으로 나눈다.

     

    그래서 위에서 임포트한 트레인 테스트 스프릴릿은 분할할 인자를 넣어주고, 어떤 비율로 넣어줄수 있다.

    test_size 0.2 20%를 쓰겠다는 말이고, random_state =42 는 

     

    이 코드를 한번 시키고 다음번에 또 시킬 때 랜덤하게 값이 바뀔건데, 언제든지 동일한 데이터를 쓰고 싶다! 라고 할 때

    이 랜덤 스테이트 값을 설정해주는게 좋다.

    statify는 분류기를 만드때 전체 카테고리가 균일하게 분류될 수 있게 설정해주는 옵션값이다.

    (트레인 값은 다 0, 테스트는 1 이런 것을 막기 위해 stratify를 한다.)

     

    즉, 0의 값에서 20퍼센트, 80퍼센트 나누고, 1인 값의 20퍼센트, 80퍼센트 나누는 것이다.

     

    random_state = 의사결정으로 나무를 계속 만드는데 동일한 형태로 만들어 주기위해 숫자를 넣는 것이다.?...

     

    model은 fit으로(x를 y로 핏하라)

     

    그러면 실제값과 예측값이 얼만큼 일치하는지 볼 수 있는데, 위의 코드를 실행해보면 0.8이라는 값이 출력된다.

     

    → 사이킨런을 사용해서 만드는 전체 코드다

     

     

    이번엔, 다른 방식으로 코드를 구현해보자.

     

    from sklearn.ensemble import RandomForestClassifier
    from sklearn.ensemble import GradientBoostingClassifier
    from xgboost import XGBClassifier
    from lightgbm import LGBMClassifier

    # 앙상블을 하면 과적합을 조금 막을 수 있다!, 더 성능이 좋다고 한다

    #1. 데이터 분할
    #2. 모델 인스턴스 생성
    #3. 모델 학습
    #4. 모델 평가

    #2. 모델 인스턴스 생성
    model = DecisionTreeClassifier(random_state = 42)

    #3. 모델 학습
    model.fit(X_train, y_train)

    #4. 모델 평가
    y_pred = model.predict(X_test)
    accuracy_score(y_test, y_pred)

     

     

     from sklearn.ensemble import RandomForestClassifier
    from sklearn.ensemble import GradientBoostingClassifier
    from xgboost import XGBClassifier
    from lightgbm import LGBMClassifier

    # 앙상블을 하면 과적합을 조금 막을 수 있다!, 더 성능이 좋다고 한다

    #1. 데이터 분할
    #2. 모델 인스턴스 생성
    #3. 모델 학습
    #4. 모델 평가

    #2. 모델 인스턴스 생성
    rf_cls = RandomForestClassifier(random_state = 42)
    gb_cls = GradientBoostingClassifier(random_state = 42)
    xgb_cls = XGBClassifier(random_state = 42)
    lgb_cls = LGBMClassifier(random_state = 42)

    #3. 모델 학습
    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)

    #4. 모델 평가
    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('RandomForest accuracy:{}'.format(accuracy_score(y_test, y_pred_rf)))
    print('RandomForest accuracy:{}'.format(accuracy_score(y_test, y_pred_gb)))
    print('RandomForest accuracy:{}'.format(accuracy_score(y_test, y_pred_xgb)))
    print('RandomForest accuracy:{}'.format(accuracy_score(y_test, y_pred_lgb)))

     

     

    2가지 모델이 조금 더 좋은걸 알 수 있다.

     

    CH02-03. 제조 데이터의 분류기 실습 - 03.실습

    아직 어렵지만 분류기 실습을 좀 더 해보자.

     

     

    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로 나왔다.

    굉장히 좋은 모델이라고 하는데 별로인가? 이 모델을 가지고 성능 개선을 한번 해보자.

     

    SVC란 뭐였는가? 0 또는 1을 판단하는 모델이다.

     

    두 부분을 구별하는 최적의 모델을 찾는 일이 었는데 이 두 데이터간의 최적의 바운더리를 찾기 위해서는 

     

    내부 연산으로 사용하는ㄴ 것이 각각의 거리를 가장 멀찌감치 떨어트릴 수 있도록 선을 찾는 거였으니

     

    지금 A1 값을 볼 때 컬럼만큼 스케일이 다르다. 

     

    거리기반의 모델 연산을 수행할 때 스케일이 다른 데이터를 다룰 때 전처리 없이 사용할 때는 좋은 결과를 기대할 수 없다.

     

    (a1, a2 컬럼이 스케이리이 너무 다르다)

     

    from sklearn.preprocessing import StandardScaler

    sc = StandardScaler()
        # 스케일링을 적용할 때 주의할 점은 Test/Train 이 고루 섞이게 하기 위해 fittransform을 통해 한꺼번에 변환하고 쪼개도록 하자
    sc.fit_transform(X)
    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라는 값이 나왔다.

     

    SVC과 같은 모델을 쓸 때는 스케일링을 전처리 해주는 것이 굉장히 중요하다!

     

     

    CH03-01. 자전거 대여량 예측 모델 실습 - 01. 문제정의 및 데이터의 이해

    이번시간에 살펴볼 내용은 머신러닝의 Regressor다.

     

     

    캐글에서 가져온 데이터셋을 한번 살펴보면 날씨, 온도, 체감온도, 습도, 풍량 등 컬럼들이 여러가지가 있다.

     

    결국 총 렌탈수를 예측하는 모델을 만들어 보자!

     

     

    각각의 컬럼에 어떤데이터가 있는지 봐보자.

    날짜, 계절, 홀리데이, 등등이 있고, 마지막 열에 count로 자전거 대여 카운트도 볼 수 있다.

     

     

    분포를 한번에 봐보자. 이전에 본 것 처럼 저 값들은 최소 최대 등을 볼 수 있다.

    마지막 컬럼을 보면 가장 적을 때는 1대만 대여가 됨을 알 수 있고, 가장 많이 대여 되었을 때는 977대가 대여됨을 

    알 수 있다.

     

     

    어제와 마찬가지로 값들의 형태를 한번 살펴보자.

     

     

    heatmap 보면 카운트(자전거대여량)과 상관관계가 높은걸 보는것이다. 숫자가 높으면 높을 수록 색상이

    연해짐을 알 수 있는데, 이 카운트와 나머지 변수간의 상관관계를 알아보고자 하면

     

    날씨, registered가 중요한 값을 가지는 것을 알 수 있다.

     

    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LinearRegression
    from sklearn.metrics import mean_squared_log_error

    Y = df['count']
    X = df.drop(['datetime', 'count'], axis =1, inplace=False)

    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=42)

    lr_model = LinearRegression()
    lr_model.fit(X_train, y_train)
    y_pred = lr_model.predict(X_test)

    mean_squared_log_error(y_test, y_pred)

     

    데이트타임과 카운트타임은 사용하지 않고,(드롭)

     

    데이터와 카운트 제외하고 나머지는 X에 할당된다. Y는 카운트 컬럼만 할당한다.

     

    30% 테스트셋, 70% 트레인 셋으로 하고 랜덤스테이트는 42로 한다.

     

    4개의 변수에 각각 역할에 맞는 값들이 배정된다.

    LinearRegressor(선형분류기) 모델을 만들고 트레인셋을 통해 피트를 하고,

     

    적절한 w 값을 다 찾아낸 다음에, test 값에 넣어서 y_pred 값에 넣어보자.

     

    테스트, 프레딕션의 차이를 나타내기 위해 mean_squared_log_error로 한번 찾아보자.

     

     

    이 두변수가 자전거 대여량에 가장 큰 영향력을 끼치는 것을알 수 있다.

     

    가만보면 데이터프레임의 헤드를 아까 출력해봤는데, 카운트에 주요한 역할을 하는게 위의 2가지라고 했는데,

     

    이 캐쥬얼은 비회원이 빌린 자전거 대여량, 레지스터드는 회원가입의 자전거 대여량인데....

     

    결국 두 값은 독립변수 x로 사용할 수가 없다...(윽...)

     

    당연히 카운트값과 상관관계가 높을 수 밖에 없는 값이라 전처리할 때 배제해야한다..

     

    다음 시간에는 데이트타임 값을 사용해서 한번 데이트타임에 대해 한번 다시 알아보고 결정해보자.

     

     

    32일차 끝.

     

     

     

    본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

    https://bit.ly/48sS29N

Designed by Tistory.