머신러닝 2

단비·2025년 4월 9일
1
post-thumbnail

머신러닝 학습유형

1. 지도학습 - 문제와 정답을 모두 알려주면 데이터를 학습해서 패턴 찾음 (x, y)

회귀: 연속형 데이터를 예측, 특정 값을 예측, 주관식
분류: 범주형 데이터를 예측, 객관식

2. 비지도학습 - 답을 가르쳐주지 않고 학습시킴 (Y없이 X만!) 따라서 성능평가가 불가능하고 사람이 눈으로 판단해야함

군집화: 비슷한 특성을 가진 데이터를 그룹으로 나눔
차원축소: 많은 변수를 가장 잘 설명하는 핵심 변수들로 압축

3. 강화학습 - 보상을 통해 상은 최대화, 벌은 최소화하는 방향으로 행위를 강화하는 학습

회귀학습

회귀모델 종류
1. 선형회귀(Linear Regression)
2. 릿지회귀(Ridge Regression)
3. 라쏘회귀(Lasso Regression)
4. 엘라스틱넷 회귀

성능평가

  1. MAE: 실제값과 예측 값의 차이를 절대값으로 변환해 평균
  2. MSE: 실제값과 예측값의 차이를 제곱해 평균
  3. RMSE: MSE의 평균보다 값이 커지는 오류를 보완하기 위해 루트를 씌움
  4. MAPE: MSE, RMSE의 문제점 개선

숫자가 작을수록 좋음!!

실습코드

데이터 수집 -> 전처리 -> 분할 -> 모델 선택 및 학습 -> 예측 및 평가

범주형 데이터 수치화

from sklearn.preprocessing import LabelEncoder

col_lst = ['sex', 'smoker', 'region']

for col in col_lst:
  encoder = LabelEncoder()  #for문 전에 정의해도 됨
  df[col] = encoder.fit_transform(df[col])

#col_lst에 있는 것을 하나씩 데려와서 인코딩후 df[col]에 집어넣기

df.head()

MinMaxScaler를 통해 정규화

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
df_scaled = scaler.fit_transform(df)

df2 = pd.DataFrame(data=df_scaled)

df2

데이터 수집 -> 전처리 -> 분할 -> 모델 선택 및 학습 -> 예측 및 평가

x = df_scaled[:, :-1 ]               #charges 제외하고 나머지 열 데려오기
y = df_scaled[:,-1]                 #charges가 마지막이니까 -1로 불러오고 행은 전체행을 들고옴

# print(x.shape)
# print(y.shape)
# print(df_scaled.shape) 잘 분리되었는지 확인 


x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=123)
print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)

데이터 수집 -> 전처리 -> 분할 -> 모델 선택 및 학습 -> 예측 및 평가

LinearRegression()


from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(x_train, y_train)

데이터 수집 -> 전처리 -> 분할 -> 모델 선택 및 학습 -> 예측 및 평가

pred = model.predict(x_test)

from sklearn.metrics import mean_absolute_error, mean_squared_error

mae = mean_absolute_error(y_test, pred)
mse = mean_squared_error(y_test, pred)

print(mae)
print(mse)

결과 비교

LinearRegression()
mae - 0.06198111675647074
mse - 0.00791154927917929

RandomForestRegressor() - best!
mae: 0.041299882928715635
mse: 0.004578017406251179

Ridge()
mae: 0.061969787859531965
mse: 0.007948477943010365

Lasso()
mae: 0.14602329437451125
mse: 0.03940553701157805

여기서는 랜덤포레스트가 가장 성능이 좋음!

분류 학습

분류모델 종류
1. 로지스틱 회귀(Logistic Regression) - 이진분류에만 사용!!!
2. 결정트리 (Decision Tree)
3. 랜덤포레스트 (Random Forest)
4. XGBoost

성능 평가
1. 오차행렬 - 예측범주, 실제 분류 범주를 교차표로 정리

  1. 정확도 - 모델이 전체 문제 중에서 정답을 맞춘 비율

  2. 재현율 - 실제로 정답이 positive인 것들 중에서 모델이 positive라고 예측한 비율
    ex)
    실제 -> 장애O 예측 -> 장애X
    실제 -> 장애X 예측-> 장애O
    둘중 전자가 중요함 !!!!!! (2번칸) 2번값 낮춰야함!!!

  3. 정밀도 - 모델이 positive라고 예측한 것들 중에서 실제로 정답이 positive인 비율
    ex) 스팸메일분류기
    스팸메일분류해서 스팸메일함으로 가는걸 원함
    실제 -> 스팸X 예측 -> 스팸O
    실제 -> 스팸O 예측 -> 스팸X
    전자가 더 위험(3번칸)
    3번의 비율을 낮춰야

1/(1+3) = 정밀도
1번의 비율을 높이는 것이 중요

  1. F1-score
    재현율, 정밀도의 조화평균(역수의 평균: 무슨 비율이 더 중요한지 살펴보는 의미)

데이터 수집 -> 전처리 -> 분할 -> 모델 선택 및 학습 -> 예측 및 평가


x = x.iloc[:, 1:]   #이전 파일은 numpy객체(array)였기 때문에 변수에 그냥 [:, 1:]붙여서 사용하면 되는데 df는 iloc사용
y = y.iloc[:, 1]

print(x.shape)
print(y.shape)

cust_id가 인덱스값과 동일했기때문에 이를 변수로 받아들이면
결과가 왜곡될 수 있으니 제거하여 x,y로 분리

데이터 수집 -> 전처리 -> 분할 -> 모델 선택 및 학습 -> 예측 및 평가

LogisticRegression
오차행렬
[[621 51]
[326 52]]
정확도: 0.6409523809523809
정밀도: 0.13756613756613756
재현율: 0.5048543689320388
F1: 0.21621621621621623

DecisionTreeClassifier
오차행렬
[[532 140]
[257 121]]
정확도: 0.6409523809523809
정밀도: 0.3201058201058201
재현율: 0.5048543689320388
F1: 0.37871674491392804

RandomForestClassifier
오차행렬
[[548 124]
[266 112]]
정확도: 0.6409523809523809
정밀도: 0.2962962962962963
재현율: 0.5048543689320388
F1: 0.36482084690553745

XGBoost
오차행렬
[[529 143]
[241 137]]
정확도: 0.6409523809523809
정밀도: 0.36243386243386244
재현율: 0.5048543689320388
F1: 0.41641337386018235

0개의 댓글