카테고리 없음

심화프로젝트 4일차 - 선형회귀 검증 및 시각화

iron-min 2025. 11. 11. 21:45

1. 선형성을 만족하는 변수가 로지스틱 회귀에 영향을 미치는지 확인

우선 box-tidwell test를 진행하여 선형성을 파악한 요인에 대하여 튜터님께서 선형성이 확인된 요인으로만 로지스틱 회귀를 돌리는게 정확도가 높은지 아니면 모든 요인을 전부 넣고 돌리는게 정확도가 높은지 확인하라고 하셨습니다.

 

# 데이터 분할 후 스케일링

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import minmax_scale

scaler = MinMaxScaler()

X_line = df_line[independent_vars]
y_line = df_line[target_var]

X_train_line, X_test_line, y_train_line, y_test_line = train_test_split(X_line,y_line,test_size=0.2, random_state=42)

X_train_line_scaled = scaler.fit_transform(X_train_line)
X_test_line_scaled = scaler.transform(X_test_line)

X_train_line_scaled_df = pd.DataFrame(X_train_line_scaled, columns=X_train_line.columns, index=X_train_line.index)
X_test_line_scaled_df = pd.DataFrame(X_test_line_scaled, columns=X_test_line.columns, index=X_test_line.index)

 

#로지스틱 회귀(전부넣은것,PCA적용)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error #성능지표
from sklearn.metrics import accuracy_score, roc_auc_score, confusion_matrix

model_line1 = LogisticRegression(random_state=42, solver='liblinear', max_iter=1000)
model_line1.fit(X_train_line_scaled, y_train_line)

y_pred_line = model_line1.predict(X_test_line_scaled)
mse_line = mean_squared_error(y_test_line, y_pred_line)
y_pred_proba = model_line1.predict_proba(X_test_line_scaled_df)[:, 1]

print("--- 로지스틱 회귀 (전체 변수) 결과 ---")
print(f"정확도 (Accuracy): {accuracy_score(y_test_line, y_pred_line):.4f}")
print(f"ROC-AUC 점수: {roc_auc_score(y_test_line, y_pred_proba):.4f}")
print("혼동 행렬(Confusion Matrix):")
print(confusion_matrix(y_test_line, y_pred_line))
print('회귀계수 (계수 개수: {}):'.format(len(model_line1.coef_[0])))
print(model_line1.coef_)

 

 

 

#로지스틱 회귀(선형성을 만족하는것만 넣은것)
selected_features = ['Square_Index','Steel_Plate_Thickness','Minimum_of_Luminosity','pca2','Luminosity_Index','Edges_Y_Index','Outside_X_Index','Empty_Index']

model_line2 = LogisticRegression(random_state=42, solver='liblinear', max_iter=1000)
model_line2.fit(X_train_line_scaled_df[selected_features], y_train_line)

y_pred_line2 = model_line2.predict(X_test_line_scaled_df[selected_features])
y_pred_proba2 = model_line2.predict_proba(X_test_line_scaled_df[selected_features])[:, 1]

print("--- 로지스틱 회귀 (선형성을 만족하는 변수) 결과 ---")
print(f"정확도 (Accuracy): {accuracy_score(y_test_line, y_pred_line2):.4f}")
print(f"ROC-AUC 점수: {roc_auc_score(y_test_line, y_pred_proba2):.4f}")
print("혼동 행렬(Confusion Matrix):")
print(confusion_matrix(y_test_line, y_pred_line2))
print('회귀계수 (계수 개수: {}):'.format(len(model_line2.coef_[0])))
print(model_line2.coef_)

 

예상과는 다르게 선형성을 만족하는 변수만 넣는것보다 모든 데이터를 넣고 로지스틱회귀식을 만드는것이 정확도가 더 높게 나왔습니다.

 

2. PCA 유효성 검증

선형성 외에도 튜터님께서 PCA를 진행한게 정말 정확도가 더 높은지 검증해보라고 하셨고 다음과 같이 3개의 모델링을 테스트 해보라고 하셨습니다.

  • 모델링 실험:
  •  ① X,Y만 넣은 경우
  •  ② Pixel_Areas만 넣은 경우
  •  ③ 3개 모두 넣은 경우

 

# 로지스트 회귀 전체변수
independent_vars = [
    'Luminosity_Index','Orientation_Index','Minimum_of_Luminosity','Edges_Y_Index',
    'Maximum_of_Luminosity','Edges_X_Index','Outside_X_Index','Length_of_Conveyer',
    'SigmoidOfAreas','Empty_Index','Square_Index','Steel_Plate_Thickness','Y_Center','X_Center',
    'LogOfAreas','X_Perimeter','Y_Perimeter','Pixels_Areas'
]

# 종속변수 (Y) 설정.
target_var = 'Pastry'

# 데이터 분리 및 스케일링
X_test = df[independent_vars]
y_test = df[target_var]

X_train_test, X_test_test, y_train_test, y_test_test = train_test_split(X_test,y_test,test_size=0.2, random_state=42)

X_train_test_scaled = scaler.fit_transform(X_train_test)
X_test_test_scaled = scaler.transform(X_test_test)

X_train_test_scaled_df = pd.DataFrame(X_train_test_scaled, columns=X_test_test.columns, index=X_train_test.index)
X_test_test_scaled_df = pd.DataFrame(X_test_test_scaled, columns=X_test_test.columns, index=X_test_test.index)

# 로지스틱 회귀
model_test = LogisticRegression(random_state=42, solver='liblinear', max_iter=1000)
model_test.fit(X_train_test_scaled, y_train_test)

y_pred_test = model_test.predict(X_test_test_scaled)

y_pred_proba_test = model_test.predict_proba(X_test_test_scaled_df)[:, 1]

print("--- 로지스틱 회귀 (전체 변수) 결과 ---")
print(f"정확도 (Accuracy): {accuracy_score(y_test_test, y_pred_test):.4f}")
print(f"ROC-AUC 점수: {roc_auc_score(y_test_test, y_pred_proba_test):.4f}")
print("혼동 행렬(Confusion Matrix):")
print(confusion_matrix(y_test_test, y_pred_test))
print('회귀계수 (계수 개수: {}):'.format(len(model_test.coef_[0])))

coef_df_final = pd.DataFrame({
    'Variable': X_test_test_scaled_df.columns,
    'Coefficient': model_test.coef_[0]
}).sort_values(by='Coefficient', ascending=False)
print(coef_df_final)

 

# 로지스트 회귀 Pixels_Areas만 --> 가장 정확도 높음
independent_vars = [
    'Luminosity_Index','Orientation_Index','Minimum_of_Luminosity','Edges_Y_Index',
    'Maximum_of_Luminosity','Edges_X_Index','Outside_X_Index','Length_of_Conveyer',
    'SigmoidOfAreas','Empty_Index','Square_Index','Steel_Plate_Thickness','Y_Center','X_Center',
    'LogOfAreas','Pixels_Areas'
]

# 종속변수 (Y) 설정.
target_var = 'Pastry'

# 데이터 분리 및 스케일링
X_test = df[independent_vars]
y_test = df[target_var]

X_train_test, X_test_test, y_train_test, y_test_test = train_test_split(X_test,y_test,test_size=0.2, random_state=42)

X_train_test_scaled = scaler.fit_transform(X_train_test)
X_test_test_scaled = scaler.transform(X_test_test)

X_train_test_scaled_df = pd.DataFrame(X_train_test_scaled, columns=X_test_test.columns, index=X_train_test.index)
X_test_test_scaled_df = pd.DataFrame(X_test_test_scaled, columns=X_test_test.columns, index=X_test_test.index)

# 로지스틱 회귀
model_test = LogisticRegression(random_state=42, solver='liblinear', max_iter=1000)
model_test.fit(X_train_test_scaled, y_train_test)

y_pred_test = model_test.predict(X_test_test_scaled)

y_pred_proba_test = model_test.predict_proba(X_test_test_scaled_df)[:, 1]

print("--- 로지스틱 회귀 (Pixels_Areas)  결과 ---")
print(f"정확도 (Accuracy): {accuracy_score(y_test_test, y_pred_test):.4f}")
print(f"ROC-AUC 점수: {roc_auc_score(y_test_test, y_pred_proba_test):.4f}")
print("혼동 행렬(Confusion Matrix):")
print(confusion_matrix(y_test_test, y_pred_test))
print('회귀계수 (계수 개수: {}):'.format(len(model_test.coef_[0])))

coef_df_final = pd.DataFrame({
    'Variable': X_test_test_scaled_df.columns,
    'Coefficient': model_test.coef_[0]
}).sort_values(by='Coefficient', ascending=False)
print(coef_df_final)

 

# 로지스트회귀 X,Y 파라미터만
independent_vars = [
    'Luminosity_Index','Orientation_Index','Minimum_of_Luminosity','Edges_Y_Index',
    'Maximum_of_Luminosity','Edges_X_Index','Outside_X_Index','Length_of_Conveyer',
    'SigmoidOfAreas','Empty_Index','Square_Index','Steel_Plate_Thickness','Y_Center','X_Center',
    'LogOfAreas','X_Perimeter','Y_Perimeter'
]

# 종속변수 (Y) 설정.
target_var = 'Pastry'

# 데이터 분리 및 스케일링
X_test = df[independent_vars]
y_test = df[target_var]

X_train_test, X_test_test, y_train_test, y_test_test = train_test_split(X_test,y_test,test_size=0.2, random_state=42)

X_train_test_scaled = scaler.fit_transform(X_train_test)
X_test_test_scaled = scaler.transform(X_test_test)

X_train_test_scaled_df = pd.DataFrame(X_train_test_scaled, columns=X_test_test.columns, index=X_train_test.index)
X_test_test_scaled_df = pd.DataFrame(X_test_test_scaled, columns=X_test_test.columns, index=X_test_test.index)

# 로지스틱 회귀
model_test = LogisticRegression(random_state=42, solver='liblinear', max_iter=1000)
model_test.fit(X_train_test_scaled, y_train_test)

y_pred_test = model_test.predict(X_test_test_scaled) 

y_pred_proba_test = model_test.predict_proba(X_test_test_scaled_df)[:, 1]

print("--- 로지스틱 회귀 (전체 변수) 결과 ---")
print(f"정확도 (Accuracy): {accuracy_score(y_test_test, y_pred_test):.4f}")
print(f"ROC-AUC 점수: {roc_auc_score(y_test_test, y_pred_proba_test):.4f}")
print("혼동 행렬(Confusion Matrix):")
print(confusion_matrix(y_test_test, y_pred_test))
print('회귀계수 (계수 개수: {}):'.format(len(model_test.coef_[0])))

coef_df_final = pd.DataFrame({
    'Variable': X_test_test_scaled_df.columns,
    'Coefficient': model_test.coef_[0]
}).sort_values(by='Coefficient', ascending=False)
print(coef_df_final)

 

 

이렇게 3개를 점검해보니 PCA를 적용한 것 보다 Pixels_Areas 변수만 넣은것이 훨씬 정확도가 높았습니다.

 

PCA 한거
정확도 (Accuracy): 0.9356
ROC-AUC 점수: 0.9307
혼동 행렬(Confusion Matrix):
[[355   4]
 [ 21   8]]
PCA 안하고 전체변수
정확도 (Accuracy): 0.9356
ROC-AUC 점수: 0.9307
혼동 행렬(Confusion Matrix):
[[355   4]
 [ 21   8]]
PCA 안하고 Pixels_Areas만
정확도 (Accuracy): 0.9356
ROC-AUC 점수: 0.9314
혼동 행렬(Confusion Matrix):
[[355   4]
 [ 21   8]]
PCA 안하고 X,Y 만
정확도 (Accuracy): 0.9356
ROC-AUC 점수: 0.9308
혼동 행렬(Confusion Matrix):
[[355   4]
 [ 21   8]]

 

3. 7가지 결함에 대해서 선형회귀 구하기

위와같이 최적의 정확성 조건을 검증을 한뒤 이제 본격적으로 7가지 결함에 대해서 선형회귀식을 구했습니다.

 

# 로지스트 회귀
independent_vars = [
    'Luminosity_Index','Orientation_Index','Minimum_of_Luminosity','Edges_Y_Index',
    'Maximum_of_Luminosity','Edges_X_Index','Outside_X_Index','Length_of_Conveyer',
    'SigmoidOfAreas','Empty_Index','Square_Index','Steel_Plate_Thickness','Y_Center','X_Center',
    'LogOfAreas','Pixels_Areas'
]

# 종속변수 (Y) 설정.
target_faults = ['Pastry', 'Z_Scratch', 'K_Scratch', 'Stains', 'Dirtiness', 'Bumps', 'Other_Faults']

for target_var in target_faults:
    print(f"\n=======================================================")
    print(f"--- 로지스틱 회귀 결과: {target_var} ---")
    print(f"=======================================================")
    
    # Target setting
    y_full = df[target_var]
    
    # Data split
    X_train, X_test, y_train, y_test = train_test_split(X_full, y_full, test_size=0.2, random_state=42)
    
    # Scaling
    X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    
    # Convert scaled data back to DataFrame for coefficient naming
    X_test_scaled_df = pd.DataFrame(X_test_scaled, columns=X_test.columns, index=X_test.index)
    
    # Logistic Regression Model Training
    model = LogisticRegression(random_state=42, solver='liblinear', max_iter=1000)
    model.fit(X_train_scaled, y_train)
    
    # Prediction
    y_pred = model.predict(X_test_scaled)
    
    # roc_auc_score를 위한 확률 예측
    y_pred_proba = model.predict_proba(X_test_scaled)[:, 1]
    
    # Evaluation and Output
    accuracy = accuracy_score(y_test, y_pred)
    try:
        roc_auc = roc_auc_score(y_test, y_pred_proba)
    except ValueError:
        roc_auc = np.nan # 한 클래스만 존재할 경우 계산 불가
    
    conf_matrix = confusion_matrix(y_test, y_pred)
    
    print(f"정확도 (Accuracy): {accuracy:.4f}")
    print(f"ROC-AUC 점수: {roc_auc:.4f}")
    print("혼동 행렬(Confusion Matrix):")
    print(conf_matrix)
    
    # 회귀 계수 출력
    coef_df = pd.DataFrame({
        'Variable': X_test_scaled_df.columns,
        'Coefficient': model.coef_[0]
    }).sort_values(by='Coefficient', ascending=False)
    
    print('회귀계수 (계수 개수: {}):'.format(len(model.coef_[0])))
    print(coef_df.to_string())

 

=======================================================
--- 로지스틱 회귀 결과: Pastry ---
=======================================================
정확도 (Accuracy): 0.9332
ROC-AUC 점수: 0.9310
혼동 행렬(Confusion Matrix):
[[357   3]
 [ 23   6]]
회귀계수 (계수 개수: 16):
                 Variable  Coefficient
1       Orientation_Index     3.036616
7      Length_of_Conveyer     1.530041
3           Edges_Y_Index     1.514203
12               Y_Center     0.958564
4   Maximum_of_Luminosity     0.755693
13               X_Center     0.248962
11  Steel_Plate_Thickness     0.114241
5           Edges_X_Index     0.091990
0        Luminosity_Index    -0.222117
15           Pixels_Areas    -0.232284
6         Outside_X_Index    -0.388408
8          SigmoidOfAreas    -0.522278
14             LogOfAreas    -1.228512
2   Minimum_of_Luminosity    -2.694163
9             Empty_Index    -3.075917
10           Square_Index    -3.296238

=======================================================
--- 로지스틱 회귀 결과: Z_Scratch ---
=======================================================
정확도 (Accuracy): 0.9152
ROC-AUC 점수: 0.9403
혼동 행렬(Confusion Matrix):
[[346   2]
 [ 31  10]]
회귀계수 (계수 개수: 16):
                 Variable  Coefficient
9             Empty_Index     2.884664
3           Edges_Y_Index     1.820684
2   Minimum_of_Luminosity     1.359650
10           Square_Index     0.688733
1       Orientation_Index     0.254469
11  Steel_Plate_Thickness    -0.651875
15           Pixels_Areas    -0.814127
8          SigmoidOfAreas    -0.901482
12               Y_Center    -0.976169
6         Outside_X_Index    -1.073478
14             LogOfAreas    -1.374853
5           Edges_X_Index    -2.159479
0        Luminosity_Index    -2.511862
4   Maximum_of_Luminosity    -2.796142
13               X_Center    -3.706922
7      Length_of_Conveyer    -3.826394

=======================================================
--- 로지스틱 회귀 결과: K_Scratch ---
=======================================================
정확도 (Accuracy): 0.9589
ROC-AUC 점수: 0.9887
혼동 행렬(Confusion Matrix):
[[303   3]
 [ 13  70]]
회귀계수 (계수 개수: 16):
                 Variable  Coefficient
14             LogOfAreas     4.448442
0        Luminosity_Index     3.684125
4   Maximum_of_Luminosity     2.118288
10           Square_Index     1.945930
15           Pixels_Areas     1.351792
8          SigmoidOfAreas     1.246893
6         Outside_X_Index     0.755430
5           Edges_X_Index     0.305544
12               Y_Center    -1.065491
1       Orientation_Index    -1.744838
7      Length_of_Conveyer    -1.988272
3           Edges_Y_Index    -2.115319
13               X_Center    -2.167030
2   Minimum_of_Luminosity    -2.368810
9             Empty_Index    -3.222455
11  Steel_Plate_Thickness    -5.068048

=======================================================
--- 로지스틱 회귀 결과: Stains ---
=======================================================
정확도 (Accuracy): 0.9743
ROC-AUC 점수: 0.9873
혼동 행렬(Confusion Matrix):
[[375   1]
 [  9   4]]
회귀계수 (계수 개수: 16):
                 Variable  Coefficient
5           Edges_X_Index     1.587848
9             Empty_Index     1.288286
10           Square_Index     0.730767
3           Edges_Y_Index     0.609894
2   Minimum_of_Luminosity     0.609525
13               X_Center     0.597087
0        Luminosity_Index     0.221320
15           Pixels_Areas    -0.018404
4   Maximum_of_Luminosity    -0.163809
6         Outside_X_Index    -0.197557
12               Y_Center    -1.186352
11  Steel_Plate_Thickness    -2.366634
1       Orientation_Index    -2.703760
7      Length_of_Conveyer    -3.189608
8          SigmoidOfAreas    -4.314334
14             LogOfAreas    -4.503608

=======================================================
--- 로지스틱 회귀 결과: Dirtiness ---
=======================================================
정확도 (Accuracy): 0.9794
ROC-AUC 점수: 0.8858
혼동 행렬(Confusion Matrix):
[[381   0]
 [  8   0]]
회귀계수 (계수 개수: 16):
                 Variable  Coefficient
2   Minimum_of_Luminosity     1.685230
13               X_Center     1.504321
12               Y_Center     1.137113
0        Luminosity_Index     0.353820
1       Orientation_Index     0.296274
3           Edges_Y_Index     0.278712
4   Maximum_of_Luminosity     0.126590
15           Pixels_Areas    -0.191540
6         Outside_X_Index    -0.308919
11  Steel_Plate_Thickness    -0.410407
9             Empty_Index    -0.635451
8          SigmoidOfAreas    -0.765598
14             LogOfAreas    -1.108274
7      Length_of_Conveyer    -1.191584
5           Edges_X_Index    -2.975680
10           Square_Index    -3.930645

=======================================================
--- 로지스틱 회귀 결과: Bumps ---
=======================================================
정확도 (Accuracy): 0.8226
ROC-AUC 점수: 0.7951
혼동 행렬(Confusion Matrix):
[[300  17]
 [ 52  20]]
회귀계수 (계수 개수: 16):
                 Variable  Coefficient
10           Square_Index     1.760422
12               Y_Center     1.523596
3           Edges_Y_Index     1.516623
7      Length_of_Conveyer     1.285550
13               X_Center     0.842131
2   Minimum_of_Luminosity     0.507138
4   Maximum_of_Luminosity     0.122417
8          SigmoidOfAreas     0.065254
5           Edges_X_Index    -0.166298
11  Steel_Plate_Thickness    -0.618914
15           Pixels_Areas    -0.741163
9             Empty_Index    -0.849303
1       Orientation_Index    -0.944968
6         Outside_X_Index    -0.979171
14             LogOfAreas    -1.360708
0        Luminosity_Index    -1.906296

=======================================================
--- 로지스틱 회귀 결과: Other_Faults ---
=======================================================
정확도 (Accuracy): 0.7275
ROC-AUC 점수: 0.7751
혼동 행렬(Confusion Matrix):
[[224  22]
 [ 84  59]]
회귀계수 (계수 개수: 16):
                 Variable  Coefficient
2   Minimum_of_Luminosity     3.278085
11  Steel_Plate_Thickness     2.472342
5           Edges_X_Index     1.350603
1       Orientation_Index     0.966068
9             Empty_Index     0.662669
8          SigmoidOfAreas     0.647544
13               X_Center     0.618982
7      Length_of_Conveyer     0.579306
10           Square_Index    -0.433217
12               Y_Center    -0.490124
15           Pixels_Areas    -0.692041
6         Outside_X_Index    -0.981786
4   Maximum_of_Luminosity    -1.059499
0        Luminosity_Index    -1.482128
14             LogOfAreas    -1.764817
3           Edges_Y_Index    -1.799399

 

 

4. 결과 시각화

 

X_full = df[independent_vars_extended]

# 결과를 저장할 리스트 초기화
all_coefs = []

# ----------------------------------------------------
# 2. 로지스틱 회귀 모델 학습 및 모든 계수 추출
# ----------------------------------------------------
for target_var in target_faults:
    y_full = df[target_var]
    X_train, X_test, y_train, y_test = train_test_split(X_full, y_full, test_size=0.2, random_state=42)

    # Scaling
    X_train_scaled = scaler.fit_transform(X_train)

    # Model Training
    model = LogisticRegression(random_state=42, solver='liblinear', max_iter=1000)
    model.fit(X_train_scaled, y_train)

    # 계수 추출
    coef_dict = dict(zip(X_full.columns, model.coef_[0]))
    coef_dict['Fault Type'] = target_var
    all_coefs.append(coef_dict)

# 히트맵 생성을 위한 데이터프레임 준비
coef_df = pd.DataFrame(all_coefs).set_index('Fault Type')
coef_df = coef_df.rename_axis(None, axis=1) # 컬럼 인덱스 이름 제거
coef_df = coef_df.T # 행과 열을 바꿈 (변수가 Y축, 결함이 X축이 되도록)
coef_df = coef_df.rename_axis(None, axis=0) # 인덱스 이름 제거

# 결함 변수를 재정렬하여 유사한 결함끼리 묶기
ordered_faults = ['K_Scratch', 'Stains', 'Pastry', 'Z_Scratch', 'Dirtiness', 'Bumps', 'Other_Faults']
coef_df = coef_df[ordered_faults]

# ----------------------------------------------------
# 3. 히트맵 시각화
# ----------------------------------------------------

plt.figure(figsize=(15, 10))
sns.heatmap(
    coef_df, # 다시 행과 열을 바꿈 (결함이 Y축, 변수가 X축이 되도록)
    cmap='coolwarm', # 양의 영향(빨강)과 음의 영향(파랑)을 잘 구분하는 색상맵 사용
    center=0, # 0을 중심으로 색상 균형 맞춤
    annot=True,         # 히트맵 셀 안에 수치 표시
    fmt='.2f',          # 소수점 둘째 자리까지 표시
    linewidths=0.5,
    linecolor='lightgray',
    cbar_kws={'label': '로지스틱 회귀 계수 (Coefficient)'}
)
plt.title('7가지 결함 유형별 모든 독립변수의 영향력 (회귀 계수)', fontsize=16)
plt.xlabel('독립변수 (Features)', fontsize=14)
plt.ylabel('결함 유형 (Fault Type)', fontsize=14)
plt.xticks(rotation=0, ha='right')
plt.yticks(rotation=0)
plt.tight_layout()
plt.show()

 

 

 

한글이 깨졌기는 했지만 그래도 각 결함에 대한 요인도를 시각화 할수있었습니다.

 

 

5. 교차검증

from sklearn.model_selection import KFold, cross_val_score, train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score

analysis_cols = independent_vars_extended + target_faults

# 모델과 스케일링 준비
X_full = df[independent_vars_extended]
scaler = MinMaxScaler()
model = LogisticRegression(random_state=42, solver='liblinear', max_iter=1000)

K = 5

# K-Fold 검증에 사용할 X_scaled 데이터 미리 준비
# 교차 검증에서는 전체 데이터셋(X_full, y_full)을 사용합니다.
X_scaled_full = scaler.fit_transform(X_full)
X_scaled_full_df = pd.DataFrame(X_scaled_full, columns=X_full.columns)

# ----------------------------------------------------
# 2. K-Fold 교차 검증 수행 (반복문)
# ----------------------------------------------------

print(f"--- 5-Fold 교차 검증 결과 (K={K}) ---")

for target_var in target_faults:
    y_full = data_clean[target_var]
    
    # StratifiedKFold를 사용하여 타겟 클래스 비율을 유지합니다. (특히 불균형 데이터에 중요)
    # StratifiedKFold는 y가 이진 분류일 때 사용해야 하므로, KFold 대신 KFold를 사용합니다.
    # 단, y가 0 또는 1로 구성되어 있으므로 StratifiedKFold를 쓰는 것이 더 정확하나,
    # 여기서는 간단히 cross_val_score의 기본 cv=5 옵션이 StratifiedKFold를 사용하도록 합니다.
    
    try:
        # scoring='roc_auc'로 설정하여 ROC-AUC 점수를 평가 지표로 사용
        scores = cross_val_score(
            estimator=model, 
            X=X_scaled_full_df, 
            y=y_full, 
            scoring='roc_auc', 
            cv=K 
        )
        
        # 교차 검증 점수와 평균 점수 출력
        print(f"\n=======================================================")
        print(f"--- 결함 유형: {target_var} ---")
        print(f"K-Fold ROC-AUC Scores (K={K}): {scores}")
        print(f"평균 ROC-AUC: {scores.mean():.4f} (표준편차: {scores.std():.4f})")
        print(f"=======================================================")
        
    except ValueError as e:
        print(f"\n--- 오류: {target_var} ---")
        print(f"교차 검증 중 오류 발생: {e}")
        print("-> 해당 폴드에 양성 샘플(1)이 충분하지 않아 ROC-AUC 계산 불가. 데이터 불균형 문제로 인한 것일 수 있습니다.")
--- 5-Fold 교차 검증 결과 (K=5) ---

=======================================================
--- 결함 유형: Pastry ---
K-Fold ROC-AUC Scores (K=5): [0.98284314 0.89360955 0.8198736  0.89961146 0.85578748]
평균 ROC-AUC: 0.8903 (표준편차: 0.0544)
=======================================================

=======================================================
--- 결함 유형: Z_Scratch ---
K-Fold ROC-AUC Scores (K=5): [0.96896086 0.99849624 0.99548872 0.98556391 0.68428571]
평균 ROC-AUC: 0.9266 (표준편차: 0.1216)
=======================================================

=======================================================
--- 결함 유형: K_Scratch ---
K-Fold ROC-AUC Scores (K=5): [0.76533279 0.99950372 0.99499586 0.98523573 0.98039702]
평균 ROC-AUC: 0.9451 (표준편차: 0.0901)
=======================================================

=======================================================
--- 결함 유형: Stains ---
K-Fold ROC-AUC Scores (K=5): [0.985918   0.99541635 0.99885409 0.99675325 0.99678284]
평균 ROC-AUC: 0.9947 (표준편차: 0.0045)
=======================================================

=======================================================
--- 결함 유형: Dirtiness ---
K-Fold ROC-AUC Scores (K=5): [0.86604137 0.90475042 0.77935857 0.97612732 0.89124668]
평균 ROC-AUC: 0.8835 (표준편차: 0.0636)
=======================================================

=======================================================
--- 결함 유형: Bumps ---
K-Fold ROC-AUC Scores (K=5): [0.71544813 0.87982955 0.85738636 0.6099026  0.67941449]
평균 ROC-AUC: 0.7484 (표준편차: 0.1041)
=======================================================

=======================================================
--- 결함 유형: Other_Faults ---
K-Fold ROC-AUC Scores (K=5): [0.61324001 0.70678106 0.35735692 0.49090909 0.57306397]
평균 ROC-AUC: 0.5483 (표준편차: 0.1181)
=======================================================

 

마지막으로 조원분이 교차검증에 대해 알려줘서 이렇게 진행해보았습니다.

 

 

 

느낀점

조원들의 도움아니였으면 하나도 못할뻔했습니다. 기사준비하느라 머신러닝에 대한 이해도가 조금 떨어지는데 조원들이 제가 가진의문에 대해서 전부 대답해주고 친절하게 알려줘서 여기까지 할 수 있었던것 같습니다. 제가 질문을 엄청많이 하는데에도 하나하나 꼼꼼하게 대답해줘서 너무 고마웠던것 같습니다.

 

머신러닝부분은 제가 안해서 이해도가 떨어지지만 선형회귀를 완성하는 과정은 제가 담당한 파트였기때문에 완벽하게 이해한것 같습니다. 선형회귀 부분에 있어서는 실무에서도 자신있게 할 수 있을것 같습니다.