빅데이터 분석기사/작업 유형 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