빅분기 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
이진분류, 다중분류, 회귀, 평가지표\
- 데이터를 불러옵니다.
- 데이터를 정규화 합니다.(트리는상관)
- 정답 데이터를 지정합니다.
- 모델 생성
- 모델 훈련
- 모델 예측
- 정답 제출
타겟이 분류일 때만 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()로 얻은 확률값 사용.- 불균형 데이터셋에서도 신뢰성 있음.\
- 용도: 주로 이진분류에서 모델의 클래스 구분 능력을 0~1 사이 점수로 평가.
- 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)