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

이항분류 모델링(lr, knn, dt, rf, xgb)

유방울 2023. 6. 6. 18:58
# 학습용 데이터
data = make_sample(seedno=1234, size=20000)

# 평가용 데이터
all = make_all()
X = all.iloc[:, :3]
Y = all['합격여부']

1. LogisticRegression

- 독립 변수의 선형 결합을 이용해 사건 발생 가능성을 예측하는 데 사용되는 통계 기법

- 반복하면서 기울기 값 갱신, 기울기 미분값이 0이 되는 지점 찾음

- max_itst, tol 변경해 성능 개선

- max_iter : 반복 횟수

- tol : 허용오차, 반복을 중단하는 조건으로 사용됨

- panalty : 종류

- C : panalty 세기

 

- 그 외 파라미터 

  • (penalty='l2', *, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='lbfgs', max_iter=100, multi_class='auto', verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)

 

model_lr = LogisticRegression()
ModelTrain(model_lr, data)
print(modle_lr.score(X,Y))

[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 0.9479377699629219
test 성능: 0.9422106711512002
0.9203271665270635

2. KNeighborsClassifier

- k개의 근접 이웃을 확인해 클래스 선택

- n_neighbors를 변경해 성능 개선

- n_neighbors : 확인할 근접 이웃 개수

- 그 외 파라미터

  • (n_neighbors=5, *, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None)

 

k = 3 베스트!

# for문 사용해서 성능높은 k 찾기

for k in range(3,10):
	model_knn = KNeighborsClassifier(n_neighbors=k)
    ModelTrain(model_knn,data)
    model_knn.score(X,Y)
    
[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 0.9974389358204961
test 성능: 0.9940376089282984
[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 0.9964450900194947
test 성능: 0.9923559088824339
[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 0.9968655632429952
test 성능: 0.9944962543953524
[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 0.9964833148579947
test 성능: 0.9925087907047851
[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 0.9970566874354956
test 성능: 0.9938847271059471
[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 0.9964450900194947
test 성능: 0.9931203179941905
[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 0.9969420129199954
test 성능: 0.9935789634612444

3. DesicionTreeClassifier

- overfitting 

- max_depth를 줄이는 방법임

- min_samples_split

- min_samples_leaf 높여도 됨

- max_features 도 조정 가능

  • (*, criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, class_weight=None, ccp_alpha=0.0)
model_dt = DesicionTreeClassifier
ModleTrain(model_dt, data)
print(model_dt.score(X,Y))

[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 1.0
test 성능: 0.9946491362177037
0.9937697818404525

max_depth가 높다고 좋은 것 아님 적절히 선택해야 함

성능떨어졌음 !

max_depth = 6

0.98

model_dt2 = DecisionTreeClassifier(max_depth=6)
ModelTrain(model_dc1, data)
print(model_dc1.score(X, Y))

[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 0.9948396468024923
test 성능: 0.9911328543036233
0.9884033889125605

max_depth = 3

0.93

# 성능 떨어짐
# 과대적합시!! max_depth를 조절해야 함
model_dc3 = DecisionTreeClassifier(max_depth=3)
ModelTrain(model_dc3, data)
print(model_dc3.score(X, Y))

[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 0.9628072321394442
test 성능: 0.9548998624063599
0.9360516975136393

4. RandomForestClassifier

- DesicionTreeClassifer를 100개 사용하는 앙상블 모델

- dt와 동일

 

model_rf = RandomForestClassifier()
ModelTrain(model_rf, data)
print(model_rf.score(X,Y))

[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 1.0
test 성능: 0.9970952453753249
0.9961166688181415

n_estimators=100 디폹트

500으로 설정

성능 미미하게 향상

model_rf = RandomForestClassifier(n_estimators=500)
ModelTrain(model_rf, data)
print(model_rf.score(X,Y))

[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 1.0
test 성능: 0.9972481271976762
0.9962049925216029

5. XGBClassifier

model_xgb = XGBClassifier()
ModelTrain(model_xgb,data)
print(model_xgb.score(X,Y))

[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 1.0
test 성능: 0.9970952453753249
0.9961166688181415

성능 미미하게 상

model_xgb1 = XGBClassifier(n_estimators=500, max_depth=5)
ModelTrain(model_xgb1, data)
print(model_rf1.score(X, Y))

[(26161, 3), (6541, 3), (26161,), (6541,)]
train 성능: 1.0
test 성능: 0.9975538908423789
0.9967630818566613