빅데이터 분석기사/작업 유형 2 (ML)

이항분류 파생변수 생성, 스캐일링

유방울 2023. 6. 6. 18:11

합격/불합격 여부를 결정하는 평균, 과락에 관한 파생변수 추가

# 파생변수 생성/추가
data['평균'] = data[['국어','영어','수학']].mean(axis=1)
data['최저'] = data[['국어', '영어', '수학']].min(axis=1)

 파생변수 추가시 성능 개

# 파생변수 생성시 성능 개선됨
# 항상 그런 것은 아님
for no in [1234, 1225, 1245] :
    model5 = LogisticRegression(max_iter=1000)
    data = make_sample(seedno=no, size=20000)
    data['평균'] = data[['국어', '영어', '수학']].mean(axis=1)
    data['최저'] = data[['국어', '영어', '수학']].min(axis=1)
    ModelTrain(model5, data)
    
[(26104, 5), (6526, 5), (26104,), (6526,)]
train 성능: 0.9850980692614159
test 성능: 0.9828378792522219
[(26126, 5), (6532, 5), (26126,), (6532,)]
train 성능: 0.9871775243052897
test 성능: 0.9837721984078384
[(26233, 5), (6559, 5), (26233,), (6559,)]
train 성능: 0.9866199062249837
test 성능: 0.9865833206281446

맨 마지막 0.97이 파생변수 생성시

# 1,2 충분한 데이터
# 부족한 데이터
# 파생변수

data = make_all()
X1 = data.iloc[:, :3]
X2 = data.drop(columns=['합격여부'])
Y = data['합격여부']
print(Y.value_counts())

for x in model1, model2, model3, model4:
    print(x.score(X1, Y))
print(model5.score(X2, Y)) 

0    841140
1    189161
Name: 합격여부, dtype: int64
0.9202815487901108
0.9206610495379506
0.9057314318825276
0.9204028725586018
0.976593247992577

스케일러 사용

 

for no in [1234, 1225, 1245] :
    model6 = LogisticRegression(max_iter=1000)
    data = make_sample(seedno=no, size=20000)
    data['국어'] *= 500
    data['수학'] *= 1000
    ModelTrain(model6, data)
    
[(26284, 3), (6572, 3), (26284,), (6572,)]
train 성능: 0.5
test 성능: 0.5
[(26174, 3), (6544, 3), (26174,), (6544,)]
train 성능: 0.5
test 성능: 0.5
[(26081, 3), (6521, 3), (26081,), (6521,)]
train 성능: 0.500019171044055
test 성능: 0.49992332464345957

성능 향상!! 0.94

# StancardScaler 사용하여 정규 분포 만들기
#
from sklearn.preprocessing import StandardScaler

for no in [1234, 1225, 1245]:
    model7 = LogisticRegression(max_iter=1000)
    data = make_sample(seedno=no, size=20000)
    data['국어'] *= 500
    data['수학'] *= 1000    
    X = data[['국어', '영어', '수학']]
    Y = data['합격여부']
    scaledX = StandardScaler().fit_transform(X)
    scaledX = pd.DataFrame(scaledX, columns=['국어', '영어', '수학'])
    data = pd.concat([scaledX, Y], axis=1)
    ModelTrain(model7, data)
    
[(26120, 3), (6530, 3), (26120,), (6530,)]
train 성능: 0.9477029096477795
test 성능: 0.9468606431852986
[(26265, 3), (6567, 3), (26265,), (6567,)]
train 성능: 0.9476108890158005
test 성능: 0.944266788487894
[(26163, 3), (6541, 3), (26163,), (6541,)]
train 성능: 0.9485533004624852
test 성능: 0.9438923711970647