빅분기 2유형

topics
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")

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

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


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

## 4. 수치형데이터,범주형데이터 인코딩
from sklearn.preprocessing import LabelEncoder
# 수치형은 MinMaxScaler보통쓰면됨 랜덤포래스트쓴다면안해두됨
le = LabelEncoder()
object_cols = train_x.select_dtypes(include="object").columns
# test데이터에 예외값이잇는지확인
# 만약예외값이있다면 기타항목을 넣어야함
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])

## 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)

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

## 7. 검증데이터의 예측값과 실제값으로 모델성능확인 w
# 정답먼저
# 분류면 f1스코어보겟쥬?
from sklearn.metrics import root_mean_squared_error,r2_score
# 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)

## 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)

## 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

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

# 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)에 덜 민감
    • 음수 값이 있으면 사용 불가
    • 이것도 보통 루트해서 사용

원핫인코딩유의점

교차검증 (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)