본문 바로가기
IT/오랫만코딩:파이썬

DAY12 특징선택-feature selection 및 재현율 (recall)-(Bing 챗(chat) GPT 생성한 파이썬 코드 첨삭)

by 자바라머신러닝 2023. 3. 21.

lable 이 불균형을 이룬 상태에서는 특정선택과 재현율(recall) 지수가 중요합니다. 3주차 파이썬 데이터분석 교육 중 모델평가 이후에 특징선택(feature selection) 에 대해 배운것을 챗(chat) GPT 에게 질문하여 얻은 답변과 예제코드 입니다.

 

특징선택의 중요성

 

머신러닝은 데이터 건수는 최대한 늘려야 하지만, 데이터 특징(속성)은 최소한으로 줄여야 합니다. 

특징선택의 중요성 (필요한 것만 최소화)
특징선택의 중요성 (필요한 것만 최소화)

데이터세트

 

중소기업청에서 제공하는 사출성형 공정데이터 이며, 설비가동시 불량품 발생에 대한 raw data 입니다.

 

labeled_data - ANSI.csv
4.32MB

 

대략적으로 피봇 요약하면 다음과 같습니다. 알고자 하는 목표변수는 PassOrFail 이며, 불량(N)/양품(Y) 값을 가지고 있습니다. 비율은 불량(N) : 양품(Y) = 0.9 : 99.1 입니다. 즉 불량(N) 데이터가 굉장히 불균형을 이루지만 알고자 하는 목표변수 값입니다.

데이터에 대한 대략적인 피봇 요약
데이터에 대한 대략적인 피봇 요약

 

데이터의 특징 (=속성/필드/항목) 리스트

 

데이터 항목은 다음과 같은 리스트로 정리되며, 총 45 개 특징 (=속성/필드/항목) 을 보입니다.

 

feature = ['_id', 'TimeStamp', 'PART_FACT_PLAN_DATE', 'PART_FACT_SERIAL',
       'PART_NAME', 'EQUIP_CD', 'EQUIP_NAME', 'PassOrFail', 'Reason',
       'Injection_Time', 'Filling_Time', 'Plasticizing_Time', 'Cycle_Time',
       'Clamp_Close_Time', 'Cushion_Position', 'Switch_Over_Position',
       'Plasticizing_Position', 'Clamp_Open_Position', 'Max_Injection_Speed',
       'Max_Screw_RPM', 'Average_Screw_RPM', 'Max_Injection_Pressure',
       'Max_Switch_Over_Pressure', 'Max_Back_Pressure',
       'Average_Back_Pressure', 'Barrel_Temperature_1', 'Barrel_Temperature_2',
       'Barrel_Temperature_3', 'Barrel_Temperature_4', 'Barrel_Temperature_5',
       'Barrel_Temperature_6', 'Barrel_Temperature_7', 'Hopper_Temperature',
       'Mold_Temperature_1', 'Mold_Temperature_2', 'Mold_Temperature_3',
       'Mold_Temperature_4', 'Mold_Temperature_5', 'Mold_Temperature_6',
       'Mold_Temperature_7', 'Mold_Temperature_8', 'Mold_Temperature_9',
       'Mold_Temperature_10', 'Mold_Temperature_11', 'Mold_Temperature_12'] 

 

데이터세트.describe(include='all').T   실행결과

데이터셋트를 head() 로 사용한 결과는 다음과 같습니다.

45개 피처를 세로형으로 describe 한 결과
45개 피처를 세로형으로 describe 한 결과

파이썬 3.8 버전의 문자/숫자 혼재된 데이터세트의 특징선택

 

질문) 문자와 숫자가 혼재되어 있을 때 머신러닝 적용하기 위해 f_regressio 을 적용한 feature selction 하는 방법을 파이썬 3.8 버전의 코드 작성

 

답변) f_regression은 feature와 타겟 변수 사이의 선형 관계를 평가하는 통계적 테스트입니다1. 각 feature에 대해 단순 선형 회귀 모델을 적합하고 F-통계량과 p-value를 계산합니다. F-통계량은 feature와 타겟 변수 사이의 상관성을 측정하는 지표로, 높을수록 관련성이 높다고 판단할 수 있습니다.

f_regression을 사용하여 feature selection을 하는 방법은 다음과 같습니다.

 

소스) 아래 글 더보기 클

더보기
# 필요한 라이브러리 임포트
import pandas as pd
from sklearn.feature_selection import f_regression, SelectKBest

 

# 데이터세트 로드
df = pd.read_csv('your_dataset.csv')

 

# 문자열 feature와 숫자형 feature 분리
str_features = df.select_dtypes(include='object')
num_features = df.select_dtypes(exclude='object')

 

# 문자열 feature에 대해 one-hot encoding 적용
str_features_encoded = pd.get_dummies(str_features)

 

# one-hot encoding된 문자열 feature와 숫자형 feature 합치기
features = pd.concat([str_features_encoded, num_features], axis=1)

 

# 타겟 변수 설정 (예시: PassOrFail 컬럼)
target = df['PassOrFail']

 

# f_regression을 통해 각 feature의 F-통계량과 p-value 계산하기
f_values, p_values = f_regression(features, target)

 

# F-통계량과 p-value를 데이터프레임으로 만들기
f_df = pd.DataFrame({'feature': features.columns, 'F-value': f_values, 'p-value': p_values})

 

# F-통계량과 p-value를 내림차순으로 정렬하기
f_df.sort_values(by=['F-value', 'p-value'], ascending=False, inplace=True)

 

# F-통계량과 p-value를 확인하기
print(f_df)

 

# F-통계량이 가장 높은 k개의 feature 선택하기 (예시: k=10)
selector = SelectKBest(f_regression, k=10)
selector.fit(features, target)
features_reduced_freg = features[features.columns[selector.get_support(indices=True)]]

 

# 최종적으로 선택된 feature 확인하기
print(features_reduced_freg.columns)

 

# 필요한 라이브러리 임포트
import pandas as pd
from sklearn.feature_selection import f_regression, SelectKBest

# 데이터세트 로드
df = pd.read_csv('your_dataset.csv')

# 문자열 feature와 숫자형 feature 분리
str_features = df.select_dtypes(include='object')
num_features = df.select_dtypes(exclude='object')

# 문자열 feature에 대해 one-hot encoding 적용
str_features_encoded = pd.get_dummies(str_features)

# one-hot encoding된 문자열 feature와 숫자형 feature 합치기
features = pd.concat([str_features_encoded, num_features], axis=1)

# 타겟 변수 설정 (예시: PassOrFail 컬럼)
target = df['PassOrFail']

# f_regression을 통해 각 feature의 F-통계량과 p-value 계산하기
f_values, p_values = f_regression(features, target)

# F-통계량과 p-value를 데이터프레임으로 만들기
f_df = pd.DataFrame({'feature': features.columns, 'F-value': f_values, 'p-value': p_values})

# F-통계량과 p-value를 내림차순으로 정렬하기
f_df.sort_values(by=['F-value', 'p-value'], ascending=False, inplace=True)

# F-통계량과 p-value를 확인하기
print(f_df)

# F-통계량이 가장 높은 k개의 feature 선택하기 (예시: k=10)
selector = SelectKBest(f_regression, k=10)
selector.fit(features, target)
features_reduced_freg = features[features.columns[selector.get_support(indices=True)]]

# 최종적으로 선택된 feature 확인하기
print(features_reduced_freg.columns)

# F-통계량이 가장 높은 k개의 feature 선택하기 (예시: k=10)
selector = SelectKBest(f_regression, k=10)
selector.fit(features, target)
features_reduced_freg = features[features.columns[selector.get_support(indices=True)]]

# 최종적으로 선택된 feature 확인하기
print(features_reduced_freg.columns)
머신러닝 적용 성과지표 : 재현율 (recall)

해당 데이터를 머신러닝 적용시 중요한 지표는 재현율 (recall) 입니다. 워낙 N(불량) 데이터가 적은 불균형 데이터 이기 때문에 정분류율은 Y(양품) 만 맞춰도 99% 이상이기 때문입니다.

 

SVM, RandomForest, AdaBoost 모델을 적용한 결과 다음과 같습니다.

 

SVM 은 맞다고 주장하는 precision (정밀도) 이나, 실제 N 인 것을 나타내는 재현율 (recall) 이나, precision (정밀도) / 재현율 (recall)  균형지표인 f1-score 나 0 으로 해당 모델을 사용할 수 없습니다.

 

SVM 평과 결과 재현율 부실
SVM 평과 결과 재현율 부실

RandomForest 은 실제 N 인 것을 나타내는 재현율 (recall) 이 0.67 인데 2/3는 실제 불량(N)이 맞다는 모델입니다.

RandomForest 평과 결과 재현율 0.67
RandomForest 평과 결과 재현율 0.67

AdaBoost 는 맞다고 주장하는 precision (정밀도) 가 1인데 100$ 주장하는 실제 불량(N)이 맞다는 모델입니다.

AdaBoost 평과 결과 정밀도 1
AdaBoost 평과 결과 정밀도 1

항상 맞는 모델은 없습니다. 결국 최적의 모델을 찾는 기나긴 시행착오를 겪어야 하는 것이 머신러닝입니다.

 

최적 F1값 도식
최적 F1값 도식

댓글