[빅데이터분석기사] 작업형2 머신러닝 - 머신러닝 학습 및 평가(분류/회귀)

2025. 6. 16. 10:52·Data/빅데이터분석기사
728x90
# predict_proba로 바로 예측 가능
pred = lgbmc.predict_proba(test)
pred

# 클래스 확인
lgbmc.classes_

# 파일 생성
submit = pd.DataFrame({'pred':pred[:,1]})
submit.to_csv("result.csv", index=False)

# 파일이 잘 생성됐는지 확인
pd.read_csv("result.csv")

추천 머신러닝 모델

  • 랜덤포레스트
  • lightGBM
랜덤포레스트와 lightGBM은 각각 분류모델/회귀모델이 있다. 이 두가지를 비교해서 최종적으로 하나만 선택하는 것을 추천

머신러닝 학습 및 예측방법(3가지)

  1. 모델 불러오기
  2. 학습 fit(X,y)
    1. 예측 predict(test) ex) 여자|남자
    2. 또는 predict_proba(): 평가지표가 roc-auc일 때 주로 사용(분류) ex) 여자일 확률|남자일 확률

분류문제

1. 랜덤포레스트

# 랜덤포레스트
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(random_state=0)
rf.fit(X_tr, y_tr)
pred=rf.predict_proba(X_val) # 각 레이블에 속할 확률 값 반환

# 예측 결과 확인
pred[:10]

# 클래스 확인
print(rf.classes_)

# predict
pred = rf.predict(X_val) # 예측된 각 레이블 반환
pred[:10]

# 정확도 (accuracy)
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_val, pred)
print('accuracy_score:', accuracy)

# f1
from sklearn.metrics import f1_score
f1 = f1_score(y_val, pred, pos_label='>50K')
print('f1_score:', f1)

2. LightGBM

# LightGBM
import lightgbm as lgb
lgbmc = lgb.LGBMClassifier(random_state=0, verbose=-1)
lgbmc.fit(X_tr, y_tr)
pred = lgbmc.predict_proba(X_val)

roc_auc = roc_auc_score(y_val, pred[:,1])
print('roc_auc:', roc_auc)

pred = lgbmc.predict(X_val)
accuracy = accuracy_score(y_val, pred)
print('accuracy_score:', accuracy)

f1 = f1_score(y_val, pred, pos_label='>50K')
print('f1_score:', f1)

 

랜덤포레스트와 LightGBM의 결과 값이 만약 아래처럼 나오게 된다면, 이 문제는 roc_auc를 비교하는 거 이기 때문에 roc_auc의 정확도가 더 높은 LightGBM 모델을 사용하면 된다.

# 랜덤포레스트
roc_auc: 0.9173623004487484
accuracy_score: 0.8694761986009213
f1_score: 0.6926476496584973

# LightGBM
roc_auc: 0.9279535666686397
accuracy_score: 0.8771540692714553
f1_score: 0.7158642462509865

예측 및 결과 파일 생성

pred = lgbmc.predict_proba(test)
pred

lgbmc.classes_

submit = pd.DataFrame({'pred':pred[:,1]})
submit.to_csv("result.csv", index=False)

pd.read_csv("result.csv")

회귀문제

금액, 수량, 사용량 등 카테고리화 할 수 없는 종류로 나눌 수 없는 것들이 나오면 회귀라고 보면 될 것 같다.

1. 문제정의

주어진 상품 데이터로부터 판매 금액을 예측
레이블(타깃)은 판매 금액 (컬럼명: Item_Outlet_Sales)
예측한 판매 금액을 CSV 파일로 생성하여 제출
평가 기준은 RMSE (Root Mean Squared Error)
제출 파일은 예측값만 포함된 result.csv로 생성 (컬럼명: pred, 1개)

2. 탐색적데이터분석 (EDA)

# 데이터 크기
print(train.shape)
print(test.shape)

# 데이터 샘플
train.head()

# 자료형(타입)
train.info()

# 수치형 컬럼 통계값 확인(train)
train.describe()

# 범주형 컬럼 통계값 확인(train)
train.describe(include="object")

# Item_Identifier 컬럼을 보면 unique가 1500개 이상이기 때문에 원핫인코딩은 힘들 것 같다.
# 원핫인코딩은 N~1N개 정도일때 가장 적당하다

# 범주형 컬럼 통계값 확인 (test)
test.describe(include="object")

# train과 test 유니크(종류) 비교 / true 같다 / false 다르다
set(train['Item_Identifier']) == set(test['Item_Identifier'])

# 결측치 확인(train)
train.isna().sum()

# 결측치 확인(test)
test.isna().sum()

3. 데이터 전처리

# 타겟 분리
target = train.pop("Item_Outlet_Sales")

# 결측치 처리
# 베이스라인 코드를 작성할 때에는 아무 값으로 채워도 좋다.

train["Item_Weight"] = train["Item_Weight"].fillna(train["Item_Weight"].min()) # 최소값
# train["Item_Weight"] = train["Item_Weight"].fillna(train["Item_Weight"].mode()[0]) # 최빈값
# train["Item_Weight"] = train["Item_Weight"].fillna(train["Item_Weight"].mean()) # 평균값

# train["Outlet_Size"] = train["Outlet_Size"].fillna(train["Outlet_Size"].min()) # 최소값
train["Outlet_Size"] = train["Outlet_Size"].fillna(train["Outlet_Size"].mode()[0]) # 최빈값
# train["Outlet_Size"] = train["Outlet_Size"].fillna(train["Outlet_Size"].mean()) # 평균값

test["Item_Weight"] = test["Item_Weight"].fillna(test["Item_Weight"].min()) # 최소값
# test["Item_Weight"] = test["Item_Weight"].fillna(test["Item_Weight"].mode()[0]) # 최빈값
# test["Item_Weight"] = test["Item_Weight"].fillna(test["Item_Weight"].mean()) # 평균값

# test["Outlet_Size"] = test["Outlet_Size"].fillna(test["Outlet_Size"].min()) # 최소값
test["Outlet_Size"] = test["Outlet_Size"].fillna(test["Outlet_Size"].mode()[0]) # 최빈값
# test["Outlet_Size"] = test["Outlet_Size"].fillna(test["Outlet_Size"].mean()) # 평균값

# 인코딩
# 범주형 데이터 선택 방법1
cols = list(train.columns[train.dtypes == "object"])
# 선택방법2는 그냥 냅다 다 컬럼으로 넣어버리기 .. cols = ["컬럼1", "컬럼2", "컬럼3", "컬럼4", "컬럼5" .. ]

# 인코딩을 위해 train + test
print(train.shape, test.shape)
df = pd.concat([train, test])
print(df.shape)

# 레이블 인코딩
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder();
for i in cols:
    df[i] = le.fit_transform(df[i])

# 원핫 인코딩
# df = df.drop('Item_Identifier', axis=1)
# df = pd.get_dummies(df)

 

원핫 인코딩

  • 만약 원핫인코딩을 할 것이라면 'Item_Identifier'는 삭제(drop) 후 진행 추천
  • 유니크(종류) 수가 1000개가 넘음 -> 원핫인코딩은 1000개 이상의 컬럼을 생성함
  • 'Item_Identifier'삭제해도 큰 차이 없을 것으로 예상 됨 (비교 필요)
  • 삭제한다면 인코딩 전 삭제 필요
# 변경된 데이터 (샘플 확인)
df.head()

# train, test데이터 분리
train = df.iloc[:len(train)].copy()
test = df.iloc[len(train):].copy()
train.shape, test.shape

4. 검증 데이터 분할

# 검증 데이터 나누기
from sklearn.model_selection import train_test_split

X_train, X_val, y_train, y_val = train_test_split(
    train,
    target,
    test_size=0.2,
    random_state=0)
X_train.shape, X_val.shape, y_train.shape, y_val.shape

5. 머신러닝 학습 및 평가

from sklearn.metrics import root_mean_squared_error

# 추가 학습
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import r2_score
# 선형회귀
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train, y_train)
y_pred = lr.predict(X_val)

result = root_mean_squared_error(y_val, y_pred)
print('RMSE:', result)

# 추가 평가지표 학습
result = mean_squared_error(y_val, y_pred)
print('MSE:', result)

result = mean_absolute_error(y_val, y_pred)
print('MAE:', result)

result = r2_score(y_val, y_pred)
print('R2:', result)
# 베이스라인 RMSE: 1122.079060613472
# 랜덤포레스트
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(random_state=0)
rf.fit(X_train, y_train)
y_pred = rf.predict(X_val)


result = root_mean_squared_error(y_val, y_pred)
print('RMSE:', result)

# 추가 평가지표 학습
result = mean_squared_error(y_val, y_pred)
print('MSE:', result)

result = mean_absolute_error(y_val, y_pred)
print('MAE:', result)

result = r2_score(y_val, y_pred)
print('R2:', result)

# 베이스라인 RMSE: 1055.191554504419
# LightGBM
import lightgbm as lgb
model = lgb.LGBMRegressor(random_state=0, verbose=-1)
model.fit(X_train, y_train)
y_pred = model.predict(X_val)

result = root_mean_squared_error(y_val, y_pred)
print('RMSE:', result)

# 추가 평가지표 학습
result = mean_squared_error(y_val, y_pred)
print('MSE:', result)

result = mean_absolute_error(y_val, y_pred)
print('MAE:', result)

result = r2_score(y_val, y_pred)
print('R2:', result)

# 베이스라인 RMSE: 1054.0180490596224

6. 예측 결과 및 파일 생성

pred = model.predict(test)
pred

submit = pd.DataFrame({'pred':pred})
submit.to_csv("result.csv", index=False)

pd.read_csv("result.csv")
728x90

'Data > 빅데이터분석기사' 카테고리의 다른 글

[빅데이터분석기사] 데이터전처리 100제  (0) 2025.06.30
[빅데이터분석기사] 작업형2 머신러닝 - 데이터 전처리(인코딩, 스케일링), 검증 데이터 분할  (0) 2025.06.15
[빅데이터분석기사] 작업형2 머신러닝 - 데이터 전처리(결측치, 이상치)  (0) 2025.06.15
[빅데이터분석기사] 작업형1 모의문제3+4  (0) 2025.06.13
[빅데이터분석기사] 작업형1 모의문제1+2  (0) 2025.06.13
'Data/빅데이터분석기사' 카테고리의 다른 글
  • [빅데이터분석기사] 데이터전처리 100제
  • [빅데이터분석기사] 작업형2 머신러닝 - 데이터 전처리(인코딩, 스케일링), 검증 데이터 분할
  • [빅데이터분석기사] 작업형2 머신러닝 - 데이터 전처리(결측치, 이상치)
  • [빅데이터분석기사] 작업형1 모의문제3+4
DROPDEW
DROPDEW
💻 Developer | 기록하지 않으면 존재하지 않는다
  • DROPDEW
    제 2장 1막
    DROPDEW
  • 전체
    오늘
    어제
    • Dev (443)
      • App·Android (1)
      • BE (50)
        • HTTP 웹 기본 지식 (8)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (12)
        • 스프링부트와 JPA 활용 (11)
        • 스프링부트 시큐리티 & JWT (0)
        • 실전 자바 기본, 중급 (1)
        • PHP (11)
      • FE·Client (23)
        • HTML (1)
        • React (19)
        • Unity (1)
      • Data (28)
        • AI (7)
        • Bigdata (6)
        • Database (1)
        • Python (0)
        • 빅데이터분석기사 (13)
      • Infra (1)
      • Activity (9)
        • Intern (0)
        • SK AI Dream Camp (2)
        • 구름톤 유니브 4기 (1)
        • 리모트 인턴십 6기 (3)
        • 봉사활동 (0)
        • 부스트캠프 AI Tech 8기 (3)
      • CS (8)
      • 취준 (12)
        • 자격증 (4)
        • 인적성·NCS (6)
        • 코테·필기·면접 후기 (2)
      • 코테 (270)
        • Algorithm (222)
        • SQL (35)
        • 정리 (13)
      • 인사이트 (27)
        • 금융경제뉴스 (7)
        • 금융용어·지식 (2)
        • 북마크 (7)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    구현
    다이나믹프로그래밍
    티스토리챌린지
    이분탐색
    브루트포스 알고리즘
    자료구조
    시뮬레이션
    투포인터
    백준
    최단경로
    그래프탐색
    정렬
    문자열
    오블완
    너비우선탐색
    누적합
    매개변수탐색
    그리디알고리즘
    수학
    그래프이론
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
DROPDEW
[빅데이터분석기사] 작업형2 머신러닝 - 머신러닝 학습 및 평가(분류/회귀)
상단으로

티스토리툴바