데이터분석 6기/본캠프

2025-04-17 머신러닝 총 정리 (회귀~분류)

seyeon1130 2025. 4. 17. 20:49

머신러닝은  세가지로 나뉜다.

 

1. 지도학습: 회귀. 분류

2. 비지도 학습: 클러스터링(군집화)

3. 강화학습

 

회귀분석

1. 독립변수는 연속형이든, 범주형이든 관계 없음. 종속변수가 연속형이면 가능하다.

2. 독립변수가 한 개면 단순선형회귀, 두 개면 다중선형회귀. 종속변수는 항상 한 개여야한다.

3. 독립변수와 종속변수의 관계가 선형인지 확인한다.

4. 변수들간 상관행렬을 그려서 상관계수가 0.9 이상인 변수는 하나를 제외하고 삭제한다.

5. 회귀분석 하기 전, 범주형은 인코딩. 수치형은 표준화 혹은 정규화 해주기

6. Train 데이터랑 Test 데이터 나누기

 

선형회귀분석 : 독립변수와 종속변수 관계가 선형일 때

 

다중공선성 확인 : VIF

 

상관행렬을 구해서 0.9 이상인 애들은 우선 제거하거나 변경함.

그 이후 VIF 실행

VIF

# VIF 계산 함수
def calc_vif(df_input):
    vif_data = []
    for i in range(df_input.shape[1]):
        vif = variance_inflation_factor(df_input.values, i)
        vif_data.append((df_input.columns[i], vif))
    return pd.DataFrame(vif_data, columns=['feature','VIF'])

vif_df = calc_vif(df_corr)
print("\n=== [VIF 결과] ===")
print(vif_df)
print()

 

10 이상이면 높게 나온 것이다.

삭제하거나 변경해야함.

 

만약 삭제하거나 변경하면 안되는 경우에는 릿지, 라쏘 사용

 

[선형회귀분석]  CASE 1. 다중공선성 고려하지 않아도 될 때

 

CASE 1. 데이터가 작을 때

 

LinearRegression():  최소자승법

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import numpy as np

# ✅ 모델 학습
lin_reg = LinearRegression()
lin_reg.fit(X_train, y_train)

# ✅ 예측
y_pred_lin = lin_reg.predict(X_test)

# ✅ 성능 측정
mse_lin = mean_squared_error(y_test, y_pred_lin)
rmse_lin = np.sqrt(mse_lin)  # √MSE
mae_lin = mean_absolute_error(y_test, y_pred_lin)
r2_lin = r2_score(y_test, y_pred_lin)

# ✅ 결과 출력
print("[LinearRegression 결과]")
print("가중치(coefficient):", lin_reg.coef_)
print("절편(intercept):", lin_reg.intercept_)
print("MAE:", mae_lin)
print("MSE:", mse_lin)
print("RMSE:", rmse_lin)
print("R2 점수:", r2_lin)
결과:

가중치(coefficient): [ 37.90402135 -241.96436231 542.42875852 347.70384391 -931.48884588
518.06227698 163.41998299 275.31790158 736.1988589 48.67065743]
절편(intercept): 151.34560453985995

 

해석

 

이때 성능 평가를 보고 판단.

 

CASE2. 데이터가 클 때

SGDRegressor () :경사하강법 

# ✅ 필요한 라이브러리 불러오기
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import numpy as np

# ✅ SGDRegressor 모델 학습
sgd_reg = SGDRegressor(max_iter=6000, tol=1e-3, random_state=42)
sgd_reg.fit(X_train, y_train)

# ✅ 예측
y_pred_sgd = sgd_reg.predict(X_test)

# ✅ 성능 측정
mse_sgd = mean_squared_error(y_test, y_pred_sgd)
rmse_sgd = np.sqrt(mse_sgd)
mae_sgd = mean_absolute_error(y_test, y_pred_sgd)
r2_sgd = r2_score(y_test, y_pred_sgd)

# ✅ 결과 출력
print("[SGDRegressor 결과]")
print("가중치(coefficient):", sgd_reg.coef_)
print("절편(intercept):", sgd_reg.intercept_)
print("MAE:", mae_sgd)
print("MSE:", mse_sgd)
print("RMSE:", rmse_sgd)
print("R2 점수:", r2_sgd)

 

해석은 최소자승법과  같음.

 

 

[선형회귀분석] 다중공선성을 고려해야할 때

 

CASE1. 필요 없는 컬럼을 삭제하고 싶을 때

라쏘

from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error, r2_score

# Lasso 회귀 모델 학습
lasso_reg = Lasso(alpha=0.1, random_state=42, max_iter=10000)
lasso_reg.fit(X_train, y_train)

# 예측
y_pred_lasso = lasso_reg.predict(X_test)

# 성능 평가
mse_lasso = mean_squared_error(y_test, y_pred_lasso)
r2_lasso = r2_score(y_test, y_pred_lasso)

# Lasso 회귀 계수 확인
print("Lasso 회귀 계수:", lasso_reg.coef_)

# 출력된 결과
print("MSE:", mse_lasso)
print("R2 점수:", r2_lasso)

 

계수가 0이 아닌 컬럼들만 중요한 것임.

 

 

 

CASE 2. 삭제할 필요 없을 때

 

릿지 회귀

ridge_reg = Ridge(alpha=1.0, random_state=42)
ridge_reg.fit(X_train, y_train)

y_pred = ridge_reg.predict(X_test_scaled)

# 4. 성능 평가
print("MSE:", mean_squared_error(y_test, y_pred))  # 평균 제곱 오차
print("R2 score:", r2_score(y_test, y_pred))      # 결정 계수 (R2 score)

# 5. Lasso 회귀 계수 확인
print("Lasso 회귀 계수:", ridge_reg.coef_)

 

 

[비선형 회귀 분석] 독립변수와 종속변수가 선형관계가 아닐 때

 

혹은 선형회귀를 했는데 결과가 좋게 안나올 때도 비선형 회귀분석 할 수 있음.

 

poly_model = Pipeline([
    ("poly", PolynomialFeatures(degree=2, include_bias=False)),
    ("lin_reg", LinearRegression())
])
poly_model.fit(X_train, y_train)
y_pred_poly = poly_model.predict(X_test)

mse_poly = mean_squared_error(y_test, y_pred_poly)
r2_poly = r2_score(y_test, y_pred_poly)

# 평균 비율 오차
def MPE(y_true, y_pred):
    return np.mean((y_true - y_pred) / y_true) * 100

print("[다항회귀(2차) 결과]")
print("MSE:", mse_poly)
print("R2:", r2_poly)
print("평균 비율 오차 : ", MPE(y_test, y_pred_poly))

coefs = poly_model.named_steps["lin_reg"].coef_
feature_names = poly_model.named_steps["poly"].get_feature_names_out(diabetes.feature_names)

for name, coef in zip(feature_names, coefs):
    print(f"{name}: {coef}")

 

 

 

 

해석

age만 보면: 나이가 많을수록 당뇨 지수가 증가할 수 있음

bmi만 보면: BMI가 높을수록 당뇨 지수가 증가할 수 있음

age와 bmi가 결합되면: 나이가 많고 BMI가 높을 때 당뇨 지수는 감소하는 경향이 있다고 해석할 수 있음.

 

 

 

분류

 

1. 독립변수는 연속형이든, 범주형이든 관계 없음. 종속변수가 범주형이면 가능하다.

 

 

CASE 1. 해석이 중요할 때

 

로지스틱 회귀

# 4. 로지스틱 회귀 학습
log_reg = LogisticRegression(random_state=42, max_iter=10000)
log_reg.fit(X_train_scaled, y_train)

y_pred_logistic = logistic_model.predict(X_test)

# 5. 계수와 절편 출력
coeff_df = pd.DataFrame({
    "Feature": X.columns,
    "Coefficient": log_reg.coef_[0]
})
print("=== [로지스틱 회귀 계수] ===")
print(coeff_df.sort_values(by="Coefficient", key=abs, ascending=False))  # 절댓값 기준 정렬

# 5. 성능 평가

print("=== Logistic Regression ===")
print("Accuracy:", accuracy_score(y_test, y_pred_logistic))
print(classification_report(y_test, y_pred_logistic, target_names=iris.target_names))

계수로 특징 중요도 알 수 있음

분류부터는 평가 재현율과 정밀도로 한다. 혹은 ROC

 

CASE 2. 예측이 중요할 때

 

SVM

svm_model = SVC()
svm_model.fit(X_train, y_train)

# 4. 예측
y_pred_svm = svm_model.predict(X_test)

# 5. 성능 평가
# Accuracy(정확도)와 정밀 평가(classification_report)를 이용해 비교해봅니다.

print("=== SVM ===")
print("Accuracy:", accuracy_score(y_test, y_pred_svm))
print(classification_report(y_test, y_pred_svm, target_names=iris.target_names))

 

로지스틱처럼 계수를 제공하진 않음

 

앙상블: 회귀와 분류를 모두 할 수 있는 모델

 

XGBoost 회귀 (XGBRegressor)

# XGBoost 회귀 모델 학습
xg_reg = XGBRegressor(random_state=42)
xg_reg.fit(X_train, y_train)

# 예측
y_pred = xg_reg.predict(X_test)

# 평가
print("=== XGBoost Regressor ===")
print("MSE (평균제곱오차):", mean_squared_error(y_test, y_pred))
print("RMSE (루트 평균제곱오차):", np.sqrt(mean_squared_error(y_test, y_pred)))
print("MAE (평균절대오차):", mean_absolute_error(y_test, y_pred))
print("R2 Score (결정계수):", r2_score(y_test, y_pred))

from xgboost import plot_importance
import matplotlib.pyplot as plt

# 피처 중요도 시각화
plot_importance(xg_reg)
plt.title("Feature Importance (XGBRegressor)")
plt.show()

 

 

'데이터분석 6기 > 본캠프' 카테고리의 다른 글

2025-04-21 심화 프로젝트 EDA 2  (0) 2025.04.21
2025-04-18 심화 프로젝트 EDA  (0) 2025.04.19
2025-04-16 통계 총 정리  (1) 2025.04.16
2025-04-14 머신러닝 6  (0) 2025.04.14
2025-04-11 머신러닝 5  (0) 2025.04.11