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가지)
- 모델 불러오기
- 학습 fit(X,y)
- 예측 predict(test) ex) 여자|남자
- 또는 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 |