빅분기 2유형

topics 900-자격증 100-데이터분석 & AI 101 머신러닝
types 학습 실습
contexts 자격증
tags

빅분기 2유형 - 머신러닝 실습

https://www.youtube.com/watch?v=QtWhHCuVIxA&t=1462s
https://www.youtube.com/watch?v=GnVJ6AEwfVo
https://www.youtube.com/watch?v=JSBjZv2BUx

이진분류, 다중분류, 회귀, 평가지표\

  1. 데이터를 불러옵니다.
  2. 데이터를 정규화 합니다.(트리는상관)
  3. 정답 데이터를 지정합니다.
  4. 모델 생성
  5. 모델 훈련
  6. 모델 예측
  7. 정답 제출
  • 타겟이 분류일 때만 LabelEncoder

  • 입력이 문자형일 때는 One-Hot Encoding

    • pd.get_dummies(df, columns=["부서"])

회귀

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
import sklearn.metrics
print(dir(sklearn.metrics))
x_train = pd.get_dummies(train, columns=["지역"])
test = pd.get_dummies(test, columns=["지역"])
test=test.reindex(columns=x_train.columns,fill_value=False)

#2 . 전처리
#(1) X\
X= train.drop(['총구매액'], ax1s=1)
y = train['총구매액']
X_full = pd.concat ([X,test], axis=0)
X_full = X_full.drop(['*|₴ID'], axis=1)
#print (X_full. shape)
#(2) 결측치• 처리
X_full['환불금액']= Xfu11['환불금액'].f111na(0)
#(3) 수치형 변수 스케일링 skip
#(4) 범주형 변수 인코딩
X_full = pd.get_dummies(X_full)
#print(X_full. shape)
#print (X_full)
#3. 데이터 분리
_train = X_full[:train.shape[0]]
X_test = X_full[train.shape[0]:]
#print(X train.shape. X test. shapel


train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")

# <span id="일단회귀임"></span>일단회귀임
## <span id="1-데이터확인"></span>1. 데이터확인
# <span id="printtrainhead"></span>print(train.head())
# <span id="printtesthead"></span>print(test.head())
# <span id="회원id-총구매액-최대구매액-환불금액-주구매상품-주구매지점-방문일수-방문당구매건수-주말방문비율-구매주기"></span>['회원ID', '총구매액', '최대구매액', '환불금액', '주구매상품', '주구매지점', '방문일수', '방문당구매건수', '주말방문비율', '구매주기']
# <span id="printtraininfo"></span>print(train.info())

## <span id="2-y값-분리"></span>2. y값 분리
train_y = train["총구매액"]
train_x = train.drop(['총구매액', '회원ID'], axis=1)
test_x = test.drop(['회원ID'], axis=1)


## <span id="3-결측치-처리"></span>3. 결측치 처리
# <span id="내생각엔-2가지방법-결측치가많으니깐-1-환불이-없다-환불컬럼을아예지운다정도"></span>내생각엔 2가지방법 결측치가많으니깐 1. 환불이 없다, 환불컬럼을아예지운다정도
train_x['환불금액'] = train_x['환불금액'].fillna(0)
test_x['환불금액'] = test_x['환불금액'].fillna(0)

## <span id="4-수치형데이터범주형데이터-인코딩"></span>4. 수치형데이터,범주형데이터 인코딩
from sklearn.preprocessing import LabelEncoder
# <span id="수치형은-minmaxscaler보통쓰면됨-랜덤포래스트쓴다면안해두됨"></span>수치형은 MinMaxScaler보통쓰면됨 랜덤포래스트쓴다면안해두됨
le = LabelEncoder()
object_cols = train_x.select_dtypes(include="object").columns
# <span id="test데이터에-예외값이잇는지확인"></span>test데이터에 예외값이잇는지확인
# <span id="만약예외값이있다면-기타항목을-넣어야함"></span>만약예외값이있다면 기타항목을 넣어야함
for col in object_cols:
    # print(set(test_x[col])-set(train_x[col]))
        train_x[col] = le.fit_transform(train_x[col])
        test_x[col] = le.transform(test_x[col])

## <span id="5-데이터-분류"></span>5. 데이터 분류
from sklearn.model_selection import train_test_split
x_tra,x_val,y_tra,y_val = train_test_split(train_x,train_y,test_size=0.2)
print(x_tra.shape,x_val.shape,y_tra.shape,y_val.shape)

## <span id="6-모델학습"></span>6. 모델학습
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()
model.fit(x_tra,y_tra)
# <span id="검증데이터-예측"></span>검증데이터 예측
y_val_pre = model.predict(x_val)

## <span id="7-검증데이터의-예측값과-실제값으로-모델성능확인-w"></span>7. 검증데이터의 예측값과 실제값으로 모델성능확인 w
# <span id="정답먼저"></span>정답먼저
# <span id="분류면-f1스코어보겟쥬"></span>분류면 f1스코어보겟쥬?
from sklearn.metrics import root_mean_squared_error,r2_score
# <span id="printhelproot_mean_squared_error"></span>print(help(root_mean_squared_error))
rmse = root_mean_squared_error(y_val,y_val_pre)
r2 = r2_score(y_val,y_val_pre)
print(rmse,r2)

## <span id="8-문제서-요구하는-test데이터값예측-후-결과저장"></span>8. 문제서 요구하는 test데이터값예측 후 결과저장
y_test_pre=model.predict(test_x)
print(y_test_pre) # 1차원 numpy
y_test_pre = pd.DataFrame(y_test_pre,columns=['pred'])
pd.DataFrame({'pred':y_test_pre})
print(y_test_pre.head())
y_test_pre.to_csv('result.csv',index=False)

## <span id="9-확인"></span>9. 확인
print(pd.read_csv('result.csv').head())

기본적으로 이부분 사용
ASSO 대비

from sklearn.processing import LabelEncoder,StandardScaler,MinMaxScaler,RobustScaler

from sklearn.model_selection import train_test_split

asso때는 y,x(타겟과 특성을 먼저 분리햇는데)
애넨 테스트셋부터분리를 하네??

먼가 순서가 잘못되었으면 이렇게 하면될듯

import pandas as pd

# <span id="예시-데이터프레임"></span>예시 데이터프레임
df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value1': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['B', 'C', 'D'], 'value2': [4, 5, 6]})

# <span id="key-컬럼을-기준으로-가로로-합치기-inner-join"></span>key 컬럼을 기준으로 가로로 합치기 (inner join)
merged = pd.merge(df1, df2, on='key', how='inner')
print(merged)

학습및평가

분류모델쓸때 (하위 함수,속성은 sklearn의 분류모델의 인스턴스에 잇는것임)

  • predict_proba(): 각 클래스별 확률 반환 (분류 모델에서만 사용)
  • predict: 가장 확률 높은 클래스(최종 예측값) 반환
  • classes_ : 인식한 고유((한 클래스(레이블) 값들의 리스트

평가

from sklearn.metrics import 어쩌고들

분류지표
  • roc_auc_score
    • 용도: 주로 이진분류에서 모델의 클래스 구분 능력을 0~1 사이 점수로 평가.
      • 다중분류에서 쓰려면 따로 설정 필요
    • 계산: ROC 곡선(TPR vs FPR) 아래 면적.
      • 1: 완벽한 분류, 0.5: 랜덤 추측 수준.
    • 특징
      • predict_proba()로 얻은 확률값 사용.
      • 불균형 데이터셋에서도 신뢰성 있음.\
  • confusion_matrix
    • 주로히트멥이랑같이사용
    • sns.heatmap(
      cm,
      annot =True # 각 셀에 값 표시
      fmt = 'd', # 정수형으로 표시
      cmap = 'Blues' # 색상
      )
  • accuracy_score : 정확도
    • 용도: 전체 예측 중 올바른 예측 비율 계산.
    • 계산: $ \text{Accuracy} = \frac{\text{TP + TN}}{\text{TP + TN + FP + FN}} $
    • 주의: 클래스 불균형 시 신뢰도 떨어짐 (예: 99% Negative 데이터에서 전부 Negative로 예측 → 99% 정확도).
  • f1_score
    • 정밀도(Precision)와 재현율(Recall)의 조화 평균
    • 0-1 사이, 1일수록 성능 좋음
    • 불균형 데이터도 어느정도 ㄱㅊ
  • classification_report
    • precision recall f1-score support
    • support : 해당 클래스의 실제 데이터 개수
    • accuracy: 전체 데이터 중 맞춘 비율 (전체 정확도)
    • macro avg: 각 클래스의 지표(precision, recall, f1)를 단순 평균
      • 클래스 불균형이 심할 때 소수 클래스도 동등하게 반영
    • weighted avg: 각 클래스의 샘플 수로 가중 평균
      • 전체 데이터 비율을 반영, 클래스가 많은 쪽이 더 큰 영향
  • precision_score : 정밀도
회귀지표
  • mean_squared_error
    • 용도: 예측값과 실제값의 평균 제곱 오차 측정.
    • 계산: $ \text{MSE} = \frac{1}{n}\sum_{i=1}^n (y_i - \hat{y}_i)^2 $
    • 특징: 큰 오차에 높은 패널티 (제곱 효과).
      • 단위가 실제값과 다름
      • RMSE 사용 권장.
        • rmse = mse ** 0.5
  • mean_absolute_error
    • 용도 : 예측값과 실제값의 평균 절대 오차 측정.
    • 계산: $ \text{MAE} = \frac{1}{n}\sum_{i=1}^n |y_i - \hat{y}_i| $
    • 특징 : - 이상치 영향을 덜 받음. - 단위가 실제값과 동일해 해석 용이.
  • r2_score : "결정계수" 또는 "설명력"
    • 용도: 모델이 데이터 분산을 얼마나 설명하는지 평가.
    • 계산: $ R^2 = 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2} $
    • 범위: 1: 완벽 예측, 0: 평균 예측 수준, 음수: 모델이 평균보다 나쁨.
  • mean_squared_log_error
    • MSLE, 평균 제곱 로그 오차
    • 이상치(outlier)에 덜 민감
    • 음수 값이 있으면 사용 불가
    • 이것도 보통 루트해서 사용

원핫인코딩유의점

빅분기 2유형-1750431767097.png ### 교차검증 (kfold)
rf = RandomForestClassifier(random_state=0)

f1_scores = cross_val_score(rf, train, target, cv=3, scoring='f1_macro')

print(f1_scores.mean())
  • scoring 기본값
    • 분류(Classification) : accuracy (정확도)
    • 회귀(Regression) 모델 : r2 (결정계수, R-squared)

결과 파일생성

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