-
패스트캠퍼스 환급챌린지 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_splitfrom sklearn.tree import DecisionTreeClassifierfrom 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 RandomForestClassifierfrom sklearn.ensemble import GradientBoostingClassifierfrom xgboost import XGBClassifierfrom 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 RandomForestClassifierfrom sklearn.ensemble import GradientBoostingClassifierfrom xgboost import XGBClassifierfrom 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 SVCsvc = 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_splitfrom sklearn.linear_model import LinearRegressionfrom 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일차 끝.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
'패스트캠퍼스 챌린지' 카테고리의 다른 글