Supervised Learning Algorithms
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
Basic Information
์ง๋ ํ์ต์ ๋ ์ด๋ธ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด, ๋ณด์ง ๋ชปํ ์ ๋ ฅ์ ๋ํ ์์ธก์ ํ ์ ์๋ ๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค. ์ฌ์ด๋ฒ ๋ณด์์์ ์ง๋ ๊ธฐ๊ณ ํ์ต์ ์นจ์ ํ์ง(์ ์ ๋๋ ๊ณต๊ฒฉ์ผ๋ก ๋คํธ์ํฌ ํธ๋ํฝ ๋ถ๋ฅ), ์ ์ฑ ์ํํธ์จ์ด ํ์ง(์ ์ฑ ์ํํธ์จ์ด์ ์ ์ ์ํํธ์จ์ด ๊ตฌ๋ถ), ํผ์ฑ ํ์ง(์ฌ๊ธฐ ์น์ฌ์ดํธ ๋๋ ์ด๋ฉ์ผ ์๋ณ), ์คํธ ํํฐ๋ง ๋ฑ๊ณผ ๊ฐ์ ์์ ์ ๋๋ฆฌ ์ ์ฉ๋ฉ๋๋ค. ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์๋ก ๋ค๋ฅธ ์ ํ์ ๋ฌธ์ (๋ถ๋ฅ ๋๋ ํ๊ท)์ ์ ํฉํฉ๋๋ค. ์๋์์๋ ์ฃผ์ ์ง๋ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ ๊ฒํ ํ๊ณ , ์๋ ๋ฐฉ์์ ์ค๋ช ํ๋ฉฐ, ์ค์ ์ฌ์ด๋ฒ ๋ณด์ ๋ฐ์ดํฐ ์ธํธ์์์ ์ฌ์ฉ์ ์์ฐํฉ๋๋ค. ๋ํ ๋ชจ๋ธ ๊ฒฐํฉ(์์๋ธ ํ์ต)์ด ์์ธก ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ๋ ผ์ํฉ๋๋ค.
Algorithms
-
Linear Regression: ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ ๋ฐฉ์ ์์ ์ ํฉํ์ฌ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ๋ ๊ธฐ๋ณธ ํ๊ท ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
-
Logistic Regression: ์ด์ง ๊ฒฐ๊ณผ์ ํ๋ฅ ์ ๋ชจ๋ธ๋งํ๊ธฐ ์ํด ๋ก์ง์คํฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ(์ด๋ฆ๊ณผ๋ ๋ฌ๋ฆฌ)์ ๋๋ค.
-
Decision Trees: ์์ธก์ ์ํด ๋ฐ์ดํฐ๋ฅผ ํน์ง๋ณ๋ก ๋ถํ ํ๋ ํธ๋ฆฌ ๊ตฌ์กฐ ๋ชจ๋ธ์ ๋๋ค. ํด์ ๊ฐ๋ฅ์ฑ ๋๋ฌธ์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
-
Random Forests: ์ ํ์ฑ์ ํฅ์์ํค๊ณ ๊ณผ์ ํฉ์ ์ค์ด๋ ๊ฒฐ์ ํธ๋ฆฌ์ ์์๋ธ(๋ฐฐ๊น ์ ํตํด)์ ๋๋ค.
-
Support Vector Machines (SVM): ์ต์ ์ ๋ถ๋ฆฌ ์ดํ๋ฉด์ ์ฐพ๋ ์ต๋ ๋ง์ง ๋ถ๋ฅ๊ธฐ์ ๋๋ค. ๋น์ ํ ๋ฐ์ดํฐ์ ๋ํด ์ปค๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-
Naive Bayes: ํน์ง ๋ ๋ฆฝ์ฑ์ ๊ฐ์ ํ ๋ฒ ์ด์ฆ ์ ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ํ๋ฅ ์ ๋ถ๋ฅ๊ธฐ๋ก, ์คํธ ํํฐ๋ง์ ์ ๋ช ํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
-
k-Nearest Neighbors (k-NN): ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์์ ๋ค์ ํด๋์ค์ ๋ฐ๋ผ ์ํ์ ๋ ์ด๋ธ์ ์ง์ ํ๋ ๊ฐ๋จํ โ์ธ์คํด์ค ๊ธฐ๋ฐโ ๋ถ๋ฅ๊ธฐ์ ๋๋ค.
-
Gradient Boosting Machines: ์ฝํ ํ์ต์(์ผ๋ฐ์ ์ผ๋ก ๊ฒฐ์ ํธ๋ฆฌ)๋ฅผ ์์ฐจ์ ์ผ๋ก ์ถ๊ฐํ์ฌ ๊ฐ๋ ฅํ ์์ธก๊ธฐ๋ฅผ ๊ตฌ์ถํ๋ ์์๋ธ ๋ชจ๋ธ(์: XGBoost, LightGBM)์ ๋๋ค.
์๋ ๊ฐ ์น์
์์๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ๊ฐ์ ๋ ์ค๋ช
๊ณผ pandas ๋ฐ scikit-learn(์ ๊ฒฝ๋ง ์์ ์ ๊ฒฝ์ฐ PyTorch)๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ Python ์ฝ๋ ์์ ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์ ๋ ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์ฌ์ด๋ฒ ๋ณด์ ๋ฐ์ดํฐ ์ธํธ(์: ์นจ์
ํ์ง๋ฅผ ์ํ NSL-KDD ๋ฐ ํผ์ฑ ์น์ฌ์ดํธ ๋ฐ์ดํฐ ์ธํธ)๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ผ๊ด๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ
๋๋ค:
-
๋ฐ์ดํฐ ์ธํธ ๋ก๋ (๊ฐ๋ฅํ ๊ฒฝ์ฐ URL์ ํตํด ๋ค์ด๋ก๋).
-
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ (์: ๋ฒ์ฃผํ ํน์ง ์ธ์ฝ๋ฉ, ๊ฐ ์ค์ผ์ผ๋ง, ํ๋ จ/ํ ์คํธ ์ธํธ๋ก ๋ถํ ).
-
ํ๋ จ ๋ฐ์ดํฐ์์ ๋ชจ๋ธ ํ๋ จ.
-
ํ ์คํธ ์ธํธ์์ ํ๊ฐ: ๋ถ๋ฅ์ ๊ฒฝ์ฐ ์ ํ๋, ์ ๋ฐ๋, ์ฌํ์จ, F1 ์ ์ ๋ฐ ROC AUC(ํ๊ท์ ๊ฒฝ์ฐ ํ๊ท ์ ๊ณฑ ์ค์ฐจ ์ฌ์ฉ).
๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
Linear Regression
์ ํ ํ๊ท๋ ์ฐ์์ ์ธ ์ซ์ ๊ฐ์ ์์ธกํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํ๊ท ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ ๋ ฅ ํน์ง(๋ ๋ฆฝ ๋ณ์)๊ณผ ์ถ๋ ฅ(์ข ์ ๋ณ์) ๊ฐ์ ์ ํ ๊ด๊ณ๋ฅผ ๊ฐ์ ํฉ๋๋ค. ๋ชจ๋ธ์ ํน์ง๊ณผ ๋ชฉํ ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฐ์ฅ ์ ์ค๋ช ํ๋ ์ง์ (๋๋ ๊ณ ์ฐจ์์์์ ์ดํ๋ฉด)์ ์ ํฉํ๋ ค๊ณ ํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์์ธก ๊ฐ๊ณผ ์ค์ ๊ฐ ๊ฐ์ ์ ๊ณฑ ์ค์ฐจ ํฉ์ ์ต์ํํจ์ผ๋ก์จ ์ํ๋ฉ๋๋ค(์ต์ ์ ๊ณฑ๋ฒ).
์ ํ ํ๊ท๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฅ ๊ฐ๋จํ ํํ๋ ์ ์ผ๋ก ํํ๋ฉ๋๋ค:
y = mx + b
์ด๋์:
y๋ ์์ธก๋ ๊ฐ(์ถ๋ ฅ)์ ๋๋ค.m์ ์ ์ ๊ธฐ์ธ๊ธฐ(๊ณ์)์ ๋๋ค.x๋ ์ ๋ ฅ ํน์ฑ์ ๋๋ค.b๋ y-์ ํธ์ ๋๋ค.
์ ํ ํ๊ท์ ๋ชฉํ๋ ์์ธก๋ ๊ฐ๊ณผ ๋ฐ์ดํฐ์ ์ ์ค์ ๊ฐ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ์ต์ํํ๋ ์ต์ ์ ์ ํฉ์ ์ ์ฐพ๋ ๊ฒ์ ๋๋ค. ๋ฌผ๋ก , ์ด๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ๋ฉฐ, 2๊ฐ์ ๋ฒ์ฃผ๋ฅผ ๊ตฌ๋ถํ๋ ์ง์ ์ด ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ ๋ง์ ์ฐจ์์ด ์ถ๊ฐ๋๋ฉด ์ ์ ๋ ๋ณต์กํด์ง๋๋ค:
y = w1*x1 + w2*x2 + ... + wn*xn + b
Tip
์ฌ์ด๋ฒ ๋ณด์์์์ ์ฌ์ฉ ์ฌ๋ก: ์ ํ ํ๊ท๋ ํต์ฌ ๋ณด์ ์์ (๋๋ถ๋ถ ๋ถ๋ฅ ์์ )์ ๋นํด ๋ ์ผ๋ฐ์ ์ด์ง๋ง, ์์น์ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ๋ ๋ฐ ์ ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ ํ๊ท๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ํธ๋ํฝ์ ์์ ์์ธกํ๊ฑฐ๋ ํน์ ๊ธฐ๊ฐ ๋ด ๊ณต๊ฒฉ์ ์๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค. ๋ํ ํน์ ์์คํ ๋ฉํธ๋ฆญ์ ๊ณ ๋ คํ์ฌ ์ํ ์ ์๋ ๊ณต๊ฒฉ ํ์ง๊น์ง์ ์์ ์๊ฐ์ ์์ธกํ ์ ์์ต๋๋ค. ์ค์ ๋ก๋ ๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ(๋ก์ง์คํฑ ํ๊ท๋ ํธ๋ฆฌ์ ๊ฐ์)์ด ์นจ์ ์ด๋ ์ ์ฑ ์ํํธ์จ์ด ํ์ง์ ๋ ์์ฃผ ์ฌ์ฉ๋์ง๋ง, ์ ํ ํ๊ท๋ ๊ธฐ์ด๋ก์ ํ๊ท ์งํฅ ๋ถ์์ ์ ์ฉํฉ๋๋ค.
์ ํ ํ๊ท์ ์ฃผ์ ํน์ฑ:
-
๋ฌธ์ ์ ํ: ํ๊ท(์ฐ์ ๊ฐ ์์ธก). ์ถ๋ ฅ์ ์๊ณ๊ฐ์ด ์ ์ฉ๋์ง ์๋ ํ ์ง์ ์ ์ธ ๋ถ๋ฅ์๋ ์ ํฉํ์ง ์์.
-
ํด์ ๊ฐ๋ฅ์ฑ: ๋์ โ ๊ณ์๋ ์ง๊ด์ ์ผ๋ก ํด์ํ ์ ์์ผ๋ฉฐ, ๊ฐ ํน์ฑ์ ์ ํ ํจ๊ณผ๋ฅผ ๋ณด์ฌ์ค.
-
์ฅ์ : ๊ฐ๋จํ๊ณ ๋น ๋ฅด๋ฉฐ; ํ๊ท ์์ ์ ์ข์ ๊ธฐ์ค์ ; ์ค์ ๊ด๊ณ๊ฐ ๋๋ต ์ ํ์ผ ๋ ์ ์๋ํจ.
-
์ ํ ์ฌํญ: ๋ณต์กํ๊ฑฐ๋ ๋น์ ํ ๊ด๊ณ๋ฅผ ํฌ์ฐฉํ ์ ์์(์๋ ํน์ฑ ์์ง๋์ด๋ง ์์ด๋); ๊ด๊ณ๊ฐ ๋น์ ํ์ผ ๊ฒฝ์ฐ ๊ณผ์์ ํฉ์ ์ทจ์ฝํจ; ๊ฒฐ๊ณผ๋ฅผ ์๊ณกํ ์ ์๋ ์ด์์น์ ๋ฏผ๊ฐํจ.
-
์ต์ ์ ์ ํฉ ์ฐพ๊ธฐ: ๊ฐ๋ฅํ ๋ฒ์ฃผ๋ฅผ ๋ถ๋ฆฌํ๋ ์ต์ ์ ์ ํฉ์ ์ ์ฐพ๊ธฐ ์ํด **์ต์ ์ ๊ณฑ๋ฒ(OLS)**์ด๋ผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ด์ธก๋ ๊ฐ๊ณผ ์ ํ ๋ชจ๋ธ์ ์ํด ์์ธก๋ ๊ฐ ์ฌ์ด์ ์ ๊ณฑ ์ฐจ์ด์ ํฉ์ ์ต์ํํฉ๋๋ค.
์์ -- ์นจ์ ๋ฐ์ดํฐ์ ์์ ์ฐ๊ฒฐ ์ง์ ์๊ฐ ์์ธก(ํ๊ท)
์๋์์๋ NSL-KDD ์ฌ์ด๋ฒ ๋ณด์ ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํ์ฌ ์ ํ ํ๊ท๋ฅผ ์์ฐํฉ๋๋ค. ๋ค๋ฅธ ํน์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋คํธ์ํฌ ์ฐ๊ฒฐ์ `์ง์ ์๊ฐ`์ ์์ธกํ์ฌ ์ด๋ฅผ ํ๊ท ๋ฌธ์ ๋ก ๋ค๋ฃฐ ๊ฒ์ ๋๋ค. (์ค์ ๋ก `์ง์ ์๊ฐ`์ NSL-KDD์ ํ๋์ ํน์ฑ์ด๋ฉฐ, ํ๊ท๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ์ฌ๊ธฐ์ ์ฌ์ฉํฉ๋๋ค.) ๋ฐ์ดํฐ์ ์ ๋ก๋ํ๊ณ , ์ ์ฒ๋ฆฌ(๋ฒ์ฃผํ ํน์ฑ ์ธ์ฝ๋ฉ), ์ ํ ํ๊ท ๋ชจ๋ธ์ ํ๋ จ์ํค๊ณ , ํ ์คํธ ์ธํธ์์ ํ๊ท ์ ๊ณฑ ์ค์ฐจ(MSE)์ Rยฒ ์ ์๋ฅผ ํ๊ฐํฉ๋๋ค. ```python import pandas as pd from sklearn.preprocessing import LabelEncoder from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_scoreโโ 1. Column names taken from the NSLโKDD documentation โโโโโโโโโโโโโโ
col_names = [ โdurationโ,โprotocol_typeโ,โserviceโ,โflagโ,โsrc_bytesโ,โdst_bytesโ,โlandโ, โwrong_fragmentโ,โurgentโ,โhotโ,โnum_failed_loginsโ,โlogged_inโ, โnum_compromisedโ,โroot_shellโ,โsu_attemptedโ,โnum_rootโ, โnum_file_creationsโ,โnum_shellsโ,โnum_access_filesโ,โnum_outbound_cmdsโ, โis_host_loginโ,โis_guest_loginโ,โcountโ,โsrv_countโ,โserror_rateโ, โsrv_serror_rateโ,โrerror_rateโ,โsrv_rerror_rateโ,โsame_srv_rateโ, โdiff_srv_rateโ,โsrv_diff_host_rateโ,โdst_host_countโ, โdst_host_srv_countโ,โdst_host_same_srv_rateโ,โdst_host_diff_srv_rateโ, โdst_host_same_src_port_rateโ,โdst_host_srv_diff_host_rateโ, โdst_host_serror_rateโ,โdst_host_srv_serror_rateโ,โdst_host_rerror_rateโ, โdst_host_srv_rerror_rateโ,โclassโ,โdifficulty_levelโ ]
โโ 2. Load data without header row โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
train_url = โhttps://raw.githubusercontent.com/Mamcose/NSL-KDD-Network-Intrusion-Detection/master/NSL_KDD_Train.csvโ test_url = โhttps://raw.githubusercontent.com/Mamcose/NSL-KDD-Network-Intrusion-Detection/master/NSL_KDD_Test.csvโ
df_train = pd.read_csv(train_url, header=None, names=col_names) df_test = pd.read_csv(test_url, header=None, names=col_names)
โโ 3. Encode the 3 nominal features โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
for col in [โprotocol_typeโ, โserviceโ, โflagโ]: le = LabelEncoder() le.fit(pd.concat([df_train[col], df_test[col]], axis=0)) df_train[col] = le.transform(df_train[col]) df_test[col] = le.transform(df_test[col])
โโ 4. Prepare features / target โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
X_train = df_train.drop(columns=[โclassโ, โdifficulty_levelโ, โdurationโ]) y_train = df_train[โdurationโ]
X_test = df_test.drop(columns=[โclassโ, โdifficulty_levelโ, โdurationโ]) y_test = df_test[โdurationโ]
โโ 5. Train & evaluate simple Linear Regression โโโโโโโโโโโโโโโโโโโโโ
model = LinearRegression().fit(X_train, y_train) y_pred = model.predict(X_test)
print(fโTestโฏMSE: {mean_squared_error(y_test, y_pred):.2f}โ) print(fโTestโฏRยฒ : {r2_score(y_test, y_pred):.3f}โ)
โโโ TestโฏMSE: 3021333.56 TestโฏRยฒ : -0.526 โโโ
์ด ์์ ์์ ์ ํ ํ๊ท ๋ชจ๋ธ์ ๋ค๋ฅธ ๋คํธ์ํฌ ํน์ฑ์ผ๋ก๋ถํฐ ์ฐ๊ฒฐ `duration`์ ์์ธกํ๋ ค๊ณ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ํ๊ท ์ ๊ณฑ ์ค์ฐจ(Mean Squared Error, MSE)์ Rยฒ๋ก ์ฑ๋ฅ์ ์ธก์ ํฉ๋๋ค. Rยฒ๊ฐ 1.0์ ๊ฐ๊น์ธ์๋ก ๋ชจ๋ธ์ด `duration`์ ๋๋ถ๋ถ ๋ณ๋์ฑ์ ์ค๋ช
ํ๋ค๋ ๊ฒ์ ๋ํ๋ด๋ฉฐ, ๋ฎ๊ฑฐ๋ ์์ Rยฒ๋ ์ ํฉ๋๊ฐ ์ข์ง ์์์ ๋ํ๋
๋๋ค. (์ฌ๊ธฐ์ Rยฒ๊ฐ ๋ฎ๋๋ผ๋ ๋๋ผ์ง ๋ง์ธ์ -- ์ฃผ์ด์ง ํน์ฑ์ผ๋ก๋ถํฐ `duration`์ ์์ธกํ๋ ๊ฒ์ด ์ด๋ ค์ธ ์ ์์ผ๋ฉฐ, ์ ํ ํ๊ท๋ ๋ณต์กํ ํจํด์ ํฌ์ฐฉํ์ง ๋ชปํ ์ ์์ต๋๋ค.)
### ๋ก์ง์คํฑ ํ๊ท
๋ก์ง์คํฑ ํ๊ท๋ ํน์ ํด๋์ค(์ผ๋ฐ์ ์ผ๋ก "์์ฑ" ํด๋์ค)์ ์ธ์คํด์ค๊ฐ ์ํ ํ๋ฅ ์ ๋ชจ๋ธ๋งํ๋ **๋ถ๋ฅ** ์๊ณ ๋ฆฌ์ฆ์
๋๋ค. ์ด๋ฆ๊ณผ๋ ๋ฌ๋ฆฌ, *๋ก์ง์คํฑ* ํ๊ท๋ ์ด์ฐ ๊ฒฐ๊ณผ์ ์ฌ์ฉ๋ฉ๋๋ค(์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ํ ์ ํ ํ๊ท์๋ ๋ค๋ฆ). ์ฃผ๋ก **์ด์ง ๋ถ๋ฅ**(๋ ํด๋์ค, ์: ์
์ฑ vs. benign)์ ์ฌ์ฉ๋์ง๋ง, ๋ค์ค ํด๋์ค ๋ฌธ์ ๋ก ํ์ฅํ ์ ์์ต๋๋ค(softmax ๋๋ one-vs-rest ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉ).
๋ก์ง์คํฑ ํ๊ท๋ ์์ธก ๊ฐ์ ํ๋ฅ ๋ก ๋งคํํ๊ธฐ ์ํด ๋ก์ง์คํฑ ํจ์(์๊ทธ๋ชจ์ด๋ ํจ์๋ผ๊ณ ๋ ํจ)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์๊ทธ๋ชจ์ด๋ ํจ์๋ 0๊ณผ 1 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๋ฉฐ ๋ถ๋ฅ์ ํ์์ ๋ฐ๋ผ S์ ํํ์ ๊ณก์ ์ผ๋ก ์ฑ์ฅํ๋ ํจ์๋ก, ์ด์ง ๋ถ๋ฅ ์์
์ ์ ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ ์
๋ ฅ์ ๊ฐ ํน์ฑ์ ํ ๋น๋ ๊ฐ์ค์น์ ๊ณฑํด์ง๊ณ , ๊ฒฐ๊ณผ๋ ์๊ทธ๋ชจ์ด๋ ํจ์๋ฅผ ํต๊ณผํ์ฌ ํ๋ฅ ์ ์์ฑํฉ๋๋ค:
```plaintext
p(y=1|x) = 1 / (1 + e^(-z))
์ด๋์:
p(y=1|x)๋ ์ ๋ ฅx๊ฐ ์ฃผ์ด์ก์ ๋ ์ถ๋ ฅy๊ฐ 1์ผ ํ๋ฅ ์ ๋๋ค.e๋ ์์ฐ ๋ก๊ทธ์ ๋ฐ์ ๋๋ค.z๋ ์ ๋ ฅ ํน์ง์ ์ ํ ์กฐํฉ์ผ๋ก, ์ผ๋ฐ์ ์ผ๋กz = w1*x1 + w2*x2 + ... + wn*xn + b๋ก ํํ๋ฉ๋๋ค. ๊ฐ์ฅ ๋จ์ํ ํํ์์๋ ์ง์ ์ด์ง๋ง, ๋ ๋ณต์กํ ๊ฒฝ์ฐ์๋ ์ฌ๋ฌ ์ฐจ์(ํน์ง๋น ํ๋)์ ์ดํ๋ฉด์ด ๋ฉ๋๋ค.
Tip
์ฌ์ด๋ฒ ๋ณด์์์์ ์ฌ์ฉ ์ฌ๋ก: ๋ง์ ๋ณด์ ๋ฌธ์ ๋ ๋ณธ์ง์ ์ผ๋ก ์/์๋์ค ๊ฒฐ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ก์ง์คํฑ ํ๊ท๊ฐ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์นจ์ ํ์ง ์์คํ ์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ํน์ง์ ๊ธฐ๋ฐ์ผ๋ก ํด๋น ์ฐ๊ฒฐ์ด ๊ณต๊ฒฉ์ธ์ง ๊ฒฐ์ ํ๊ธฐ ์ํด ๋ก์ง์คํฑ ํ๊ท๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํผ์ฑ ํ์ง์์๋ ๋ก์ง์คํฑ ํ๊ท๊ฐ ์น์ฌ์ดํธ์ ํน์ง(URL ๊ธธ์ด, โ@โ ๊ธฐํธ์ ์กด์ฌ ๋ฑ)์ ๊ฒฐํฉํ์ฌ ํผ์ฑ์ผ ํ๋ฅ ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด๊ธฐ ์ธ๋ ์คํธ ํํฐ์์ ์ฌ์ฉ๋์์ผ๋ฉฐ, ๋ง์ ๋ถ๋ฅ ์์ ์ ๊ฐ๋ ฅํ ๊ธฐ์ค์ ์ผ๋ก ๋จ์ ์์ต๋๋ค.
๋น ์ด์ง ๋ถ๋ฅ๋ฅผ ์ํ ๋ก์ง์คํฑ ํ๊ท
๋ก์ง์คํฑ ํ๊ท๋ ์ด์ง ๋ถ๋ฅ๋ฅผ ์ํด ์ค๊ณ๋์์ง๋ง, one-vs-rest (OvR) ๋๋ softmax ํ๊ท์ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ค์ค ํด๋์ค ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ํ์ฅํ ์ ์์ต๋๋ค. OvR์์๋ ๊ฐ ํด๋์ค๋ฅผ ๊ธ์ ํด๋์ค์ ๋ค๋ฅธ ๋ชจ๋ ํด๋์ค๋ฅผ ๋์กฐํ์ฌ ๋ณ๋์ ๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค. ์์ธก ํ๋ฅ ์ด ๊ฐ์ฅ ๋์ ํด๋์ค๊ฐ ์ต์ข ์์ธก์ผ๋ก ์ ํ๋ฉ๋๋ค. Softmax ํ๊ท๋ ์ถ๋ ฅ์ธต์ ์ํํธ๋งฅ์ค ํจ์๋ฅผ ์ ์ฉํ์ฌ ์ฌ๋ฌ ํด๋์ค์ ๋ํด ๋ก์ง์คํฑ ํ๊ท๋ฅผ ์ผ๋ฐํํ์ฌ ๋ชจ๋ ํด๋์ค์ ๋ํ ํ๋ฅ ๋ถํฌ๋ฅผ ์์ฑํฉ๋๋ค.
๋ก์ง์คํฑ ํ๊ท์ ์ฃผ์ ํน์ฑ:
-
๋ฌธ์ ์ ํ: ๋ถ๋ฅ(์ผ๋ฐ์ ์ผ๋ก ์ด์ง). ๊ธ์ ํด๋์ค์ ํ๋ฅ ์ ์์ธกํฉ๋๋ค.
-
ํด์ ๊ฐ๋ฅ์ฑ: ๋์ โ ์ ํ ํ๊ท์ ๋ง์ฐฌ๊ฐ์ง๋ก, ํน์ง ๊ณ์๋ ๊ฐ ํน์ง์ด ๊ฒฐ๊ณผ์ ๋ก๊ทธ ์ค์ฆ์ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น๋์ง๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ด ํฌ๋ช ์ฑ์ ๊ฒฝ๊ณ ์ ๊ธฐ์ฌํ๋ ์์๋ฅผ ์ดํดํ๋ ๋ฐ ๋ณด์์์ ์ข ์ข ๋์ด ํ๊ฐ๋ฉ๋๋ค.
-
์ฅ์ : ํ๋ จ์ด ๊ฐ๋จํ๊ณ ๋น ๋ฅด๋ฉฐ, ํน์ง๊ณผ ๊ฒฐ๊ณผ์ ๋ก๊ทธ ์ค์ฆ ๊ฐ์ ๊ด๊ณ๊ฐ ์ ํ์ผ ๋ ์ ์๋ํฉ๋๋ค. ํ๋ฅ ์ ์ถ๋ ฅํ์ฌ ์ํ ์ ์๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ ์ ํ ์ ๊ทํ๋ฅผ ํตํด ์ ์ผ๋ฐํ๋๋ฉฐ, ์ผ๋ฐ ์ ํ ํ๊ท๋ณด๋ค ๋ค์ค ๊ณต์ ์ฑ์ ๋ ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
-
์ ํ ์ฌํญ: ํน์ง ๊ณต๊ฐ์์ ์ ํ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ๊ฐ์ ํฉ๋๋ค(์ง์ง ๊ฒฝ๊ณ๊ฐ ๋ณต์กํ๊ฑฐ๋ ๋น์ ํ์ธ ๊ฒฝ์ฐ ์คํจ). ์ํธ์์ฉ์ด๋ ๋น์ ํ ํจ๊ณผ๊ฐ ์ค์ํ ๋ฌธ์ ์์๋ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์์ผ๋ฉฐ, ๋คํญ์ ๋๋ ์ํธ์์ฉ ํน์ง์ ์๋์ผ๋ก ์ถ๊ฐํ์ง ์๋ ํ ๊ทธ๋ ์ต๋๋ค. ๋ํ, ํด๋์ค๊ฐ ํน์ง์ ์ ํ ์กฐํฉ์ผ๋ก ์ฝ๊ฒ ๋ถ๋ฆฌ๋์ง ์๋ ๊ฒฝ์ฐ ๋ก์ง์คํฑ ํ๊ท์ ํจ๊ณผ๊ฐ ๋จ์ด์ง๋๋ค.
์์ -- ๋ก์ง์คํฑ ํ๊ท๋ฅผ ์ด์ฉํ ํผ์ฑ ์น์ฌ์ดํธ ํ์ง:
์ฐ๋ฆฌ๋ ํผ์ฑ ์น์ฌ์ดํธ ๋ฐ์ดํฐ์ (UCI ์ ์ฅ์์์) ์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ์ด ๋ฐ์ดํฐ์ ์ ์น์ฌ์ดํธ์ ํน์ง(์: URL์ IP ์ฃผ์๊ฐ ์๋์ง, ๋๋ฉ์ธ์ ๋์ด, HTML์ ์์ฌ์ค๋ฌ์ด ์์์ ์กด์ฌ ๋ฑ)๊ณผ ์ฌ์ดํธ๊ฐ ํผ์ฑ์ธ์ง ํฉ๋ฒ์ ์ธ์ง๋ฅผ ๋ํ๋ด๋ ๋ ์ด๋ธ์ ํฌํจํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์น์ฌ์ดํธ๋ฅผ ๋ถ๋ฅํ๊ธฐ ์ํด ๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์ ํ๋ จํ๊ณ , ํ ์คํธ ๋ถํ ์์ ์ ํ๋, ์ ๋ฐ๋, ์ฌํ์จ, F1 ์ ์ ๋ฐ ROC AUC๋ฅผ ํ๊ฐํฉ๋๋ค.
import pandas as pd
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
# 1. Load dataset
data = fetch_openml(data_id=4534, as_frame=True) # PhishingWebsites
df = data.frame
print(df.head())
# 2. Target mapping โ legitimate (1) โ 0, everything else โ 1
df['Result'] = df['Result'].astype(int)
y = (df['Result'] != 1).astype(int)
# 3. Features
X = df.drop(columns=['Result'])
# 4. Train/test split with stratify
## Stratify ensures balanced classes in train/test sets
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.20, random_state=42, stratify=y)
# 5. Scale
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 6. Logistic Regression
## LโBFGS is a modern, memoryโefficient โquasiโNewtonโ algorithm that works well for medium/large datasets and supports multiclass natively.
##ย Upper bound on how many optimization steps the solver may take before it gives up. Not all steps are guaranteed to be taken, but would be the maximum before a "failed to converge" error.
clf = LogisticRegression(max_iter=1000, solver='lbfgs', random_state=42)
clf.fit(X_train, y_train)
# 7. Evaluation
y_pred = clf.predict(X_test)
y_prob = clf.predict_proba(X_test)[:, 1]
print(f"Accuracy : {accuracy_score(y_test, y_pred):.3f}")
print(f"Precision: {precision_score(y_test, y_pred):.3f}")
print(f"Recall : {recall_score(y_test, y_pred):.3f}")
print(f"F1-score : {f1_score(y_test, y_pred):.3f}")
print(f"ROCย AUC : {roc_auc_score(y_test, y_prob):.3f}")
"""
Accuracy : 0.928
Precision: 0.934
Recall : 0.901
F1-score : 0.917
ROC AUC : 0.979
"""
์ด ํผ์ฑ ํ์ง ์์ ์์ ๋ก์ง์คํฑ ํ๊ท๋ ๊ฐ ์น์ฌ์ดํธ๊ฐ ํผ์ฑ์ผ ํ๋ฅ ์ ์์ฑํฉ๋๋ค. ์ ํ๋, ์ ๋ฐ๋, ์ฌํ์จ ๋ฐ F1์ ํ๊ฐํจ์ผ๋ก์จ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ ์ฌํ์จ์ ๋๋ถ๋ถ์ ํผ์ฑ ์ฌ์ดํธ๋ฅผ ์ก์๋ธ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ(๋์น ๊ณต๊ฒฉ์ ์ต์ํํ๊ธฐ ์ํด ๋ณด์์ ์ค์), ๋์ ์ ๋ฐ๋๋ ์๋ชป๋ ๊ฒฝ๊ณ ๊ฐ ์ ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค(๋ถ์๊ฐ์ ํผ๋ก๋ฅผ ํผํ๊ธฐ ์ํด ์ค์ํฉ๋๋ค). ROC AUC(ROC ๊ณก์ ์๋ ๋ฉด์ )๋ ์ฑ๋ฅ์ ์๊ณ๊ฐ ๋ ๋ฆฝ์ ์ธ ์ธก์ ์ ์ ๊ณตํฉ๋๋ค(1.0์ด ์ด์์ ์ด๋ฉฐ, 0.5๋ ์ฐ์ฐ๊ณผ ๋ค๋ฅด์ง ์์). ๋ก์ง์คํฑ ํ๊ท๋ ์ด๋ฌํ ์์ ์์ ์ข ์ข ์ ์ํ๋์ง๋ง, ํผ์ฑ ์ฌ์ดํธ์ ํฉ๋ฒ์ ์ธ ์ฌ์ดํธ ๊ฐ์ ๊ฒฐ์ ๊ฒฝ๊ณ๊ฐ ๋ณต์กํ๋ค๋ฉด ๋ ๊ฐ๋ ฅํ ๋น์ ํ ๋ชจ๋ธ์ด ํ์ํ ์ ์์ต๋๋ค.
๊ฒฐ์ ํธ๋ฆฌ
๊ฒฐ์ ํธ๋ฆฌ๋ ๋ถ๋ฅ ๋ฐ ํ๊ท ์์ ๋ชจ๋์ ์ฌ์ฉํ ์ ์๋ ๋ค์ฌ๋ค๋ฅํ ๊ฐ๋ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ๋ฐ์ดํฐ์ ํน์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ฒฐ์ ์ ๊ณ์ธต์ ํธ๋ฆฌ ๋ชจ๋ธ์ ํ์ตํฉ๋๋ค. ํธ๋ฆฌ์ ๊ฐ ๋ด๋ถ ๋ ธ๋๋ ํน์ ํน์ฑ์ ๋ํ ํ ์คํธ๋ฅผ ๋ํ๋ด๊ณ , ๊ฐ ๊ฐ์ง๋ ํด๋น ํ ์คํธ์ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ฉฐ, ๊ฐ ๋ฆฌํ ๋ ธ๋๋ ์์ธก๋ ํด๋์ค(๋ถ๋ฅ์ ๊ฒฝ์ฐ) ๋๋ ๊ฐ(ํ๊ท์ ๊ฒฝ์ฐ)์ ๋ํ๋ ๋๋ค.
ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด CART(๋ถ๋ฅ ๋ฐ ํ๊ท ํธ๋ฆฌ)์ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ง๋ ๋ถ์๋ ๋๋ **์ ๋ณด ์ด๋(์ํธ๋กํผ)**์ ๊ฐ์ ์ธก์ ์ ์ฌ์ฉํ์ฌ ๊ฐ ๋จ๊ณ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถํ ํ ์ต์์ ํน์ฑ๊ณผ ์๊ณ๊ฐ์ ์ ํํฉ๋๋ค. ๊ฐ ๋ถํ ์ ๋ชฉํ๋ ๊ฒฐ๊ณผ ํ์ ์งํฉ์์ ๋ชฉํ ๋ณ์์ ๋์ง์ฑ์ ์ฆ๊ฐ์ํค๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ถํ ํ๋ ๊ฒ์ ๋๋ค(๋ถ๋ฅ์ ๊ฒฝ์ฐ, ๊ฐ ๋ ธ๋๋ ๊ฐ๋ฅํ ํ ์์ํ๊ฒ ์ ์ง๋์ด์ผ ํ๋ฉฐ, ์ฃผ๋ก ๋จ์ผ ํด๋์ค๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค).
๊ฒฐ์ ํธ๋ฆฌ๋ ๋์ ํด์ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ฃจํธ์์ ๋ฆฌํ๊น์ง์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ์์ธก ๋ค์ ์๋ ๋
ผ๋ฆฌ๋ฅผ ์ดํดํ ์ ์์ต๋๋ค(์: โIF service = telnet AND src_bytes > 1000 AND failed_logins > 3 THEN classify as attackโ). ์ด๋ ํน์ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ ์ด์ ๋ฅผ ์ค๋ช
ํ๋ ๋ฐ ์ฌ์ด๋ฒ ๋ณด์์์ ๊ฐ์น๊ฐ ์์ต๋๋ค. ํธ๋ฆฌ๋ ์์ฐ์ค๋ฝ๊ฒ ์ซ์ ๋ฐ์ดํฐ์ ๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ ์ฒ๋ฆฌ๊ฐ ๊ฑฐ์ ํ์ํ์ง ์์ต๋๋ค(์: ํน์ฑ ์ค์ผ์ผ๋ง์ด ํ์ํ์ง ์์).
๊ทธ๋ฌ๋ ๋จ์ผ ๊ฒฐ์ ํธ๋ฆฌ๋ ํ๋ จ ๋ฐ์ดํฐ์ ์ฝ๊ฒ ๊ณผ์ ํฉ๋ ์ ์์ผ๋ฉฐ, ํนํ ๊น๊ฒ ์ฑ์ฅํ ๊ฒฝ์ฐ(๋ง์ ๋ถํ ). ๊ฐ์ง์น๊ธฐ(ํธ๋ฆฌ ๊น์ด ์ ํ ๋๋ ๋ฆฌํ๋น ์ต์ ์ํ ์ ์๊ตฌ)์ ๊ฐ์ ๊ธฐ์ ์ด ์ข ์ข ๊ณผ์ ํฉ์ ๋ฐฉ์งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๊ฒฐ์ ํธ๋ฆฌ์ ์ฃผ์ ๊ตฌ์ฑ ์์๋ 3๊ฐ์ง์ ๋๋ค:
- ๋ฃจํธ ๋ ธ๋: ์ ์ฒด ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ํ๋ด๋ ํธ๋ฆฌ์ ์ต์์ ๋ ธ๋.
- ๋ด๋ถ ๋ ธ๋: ํน์ฑ๊ณผ ํด๋น ํน์ฑ์ ๊ธฐ๋ฐํ ๊ฒฐ์ ์ ๋ํ๋ด๋ ๋ ธ๋.
- ๋ฆฌํ ๋ ธ๋: ์ต์ข ๊ฒฐ๊ณผ ๋๋ ์์ธก์ ๋ํ๋ด๋ ๋ ธ๋.
ํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ์ ์์ต๋๋ค:
[Root Node]
/ \
[Node A] [Node B]
/ \ / \
[Leaf 1] [Leaf 2] [Leaf 3] [Leaf 4]
Tip
์ฌ์ด๋ฒ ๋ณด์์ ์ฌ์ฉ ์ฌ๋ก: ์์ฌ ๊ฒฐ์ ํธ๋ฆฌ๋ ์นจ์ ํ์ง ์์คํ ์์ ๊ณต๊ฒฉ์ ์๋ณํ๊ธฐ ์ํ ๊ท์น์ ๋์ถํ๋ ๋ฐ ์ฌ์ฉ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ID3/C4.5 ๊ธฐ๋ฐ์ ์ด๊ธฐ IDS๋ ์ ์ ํธ๋ํฝ๊ณผ ์ ์์ ์ธ ํธ๋ํฝ์ ๊ตฌ๋ณํ๊ธฐ ์ํด ์ฌ๋์ด ์ฝ์ ์ ์๋ ๊ท์น์ ์์ฑํ์ต๋๋ค. ๋ํ ํ์ผ์ ์์ฑ(ํ์ผ ํฌ๊ธฐ, ์น์ ์ํธ๋กํผ, API ํธ์ถ ๋ฑ)์ ๊ธฐ๋ฐ์ผ๋ก ํ์ผ์ด ์ ์์ ์ธ์ง ๊ฒฐ์ ํ๊ธฐ ์ํด ์ ์ฑ ์ฝ๋ ๋ถ์์๋ ์ฌ์ฉ๋ฉ๋๋ค. ์์ฌ ๊ฒฐ์ ํธ๋ฆฌ์ ๋ช ํ์ฑ์ ํฌ๋ช ์ฑ์ด ํ์ํ ๋ ์ ์ฉํ๊ฒ ๋ง๋ญ๋๋ค. ๋ถ์๊ฐ๋ ํธ๋ฆฌ๋ฅผ ๊ฒ์ฌํ์ฌ ํ์ง ๋ ผ๋ฆฌ๋ฅผ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
์์ฌ ๊ฒฐ์ ํธ๋ฆฌ์ ์ฃผ์ ํน์ฑ:
-
๋ฌธ์ ์ ํ: ๋ถ๋ฅ ๋ฐ ํ๊ท ๋ชจ๋. ๊ณต๊ฒฉ๊ณผ ์ ์ ํธ๋ํฝ์ ๋ถ๋ฅ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
-
ํด์ ๊ฐ๋ฅ์ฑ: ๋งค์ฐ ๋์ โ ๋ชจ๋ธ์ ๊ฒฐ์ ์ if-then ๊ท์น์ ์งํฉ์ผ๋ก ์๊ฐํ๋๊ณ ์ดํด๋ ์ ์์ต๋๋ค. ์ด๋ ๋ณด์์์ ๋ชจ๋ธ ํ๋์ ์ ๋ขฐ์ ๊ฒ์ฆ์ ์ํ ์ฃผ์ ์ฅ์ ์ ๋๋ค.
-
์ฅ์ : ๋น์ ํ ๊ด๊ณ์ ํน์ฑ ๊ฐ์ ์ํธ์์ฉ์ ํฌ์ฐฉํ ์ ์์ต๋๋ค(๊ฐ ๋ถํ ์ ์ํธ์์ฉ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค). ํน์ฑ์ ์ค์ผ์ผ๋งํ๊ฑฐ๋ ๋ฒ์ฃผํ ๋ณ์๋ฅผ ์-ํซ ์ธ์ฝ๋ฉํ ํ์๊ฐ ์์ต๋๋ค โ ํธ๋ฆฌ๋ ์ด๋ฅผ ๋ณธ๋์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ๋น ๋ฅธ ์ถ๋ก (์์ธก์ ๋จ์ํ ํธ๋ฆฌ์์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ ๋๋ค).
-
์ ํ ์ฌํญ: ์ ์ด๋์ง ์์ผ๋ฉด ๊ณผ์ ํฉ์ ์ทจ์ฝํฉ๋๋ค(๊น์ ํธ๋ฆฌ๋ ํ๋ จ ์ธํธ๋ฅผ ๊ธฐ์ตํ ์ ์์ต๋๋ค). ๋ถ์์ ํ ์ ์์ต๋๋ค โ ๋ฐ์ดํฐ์ ์์ ๋ณํ๊ฐ ๋ค๋ฅธ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋จ์ผ ๋ชจ๋ธ๋ก์ ๊ทธ ์ ํ๋๊ฐ ๋ ๋ฐ์ ๋ ๋ฐฉ๋ฒ(๋๋ค ํฌ๋ ์คํธ์ ๊ฐ์ ์์๋ธ)์ด ์ผ๋ฐ์ ์ผ๋ก ๋ถ์ฐ์ ์ค์ฌ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค.
-
์ต๊ณ ์ ๋ถํ ์ฐพ๊ธฐ:
-
์ง๋ ๋ถ์๋: ๋ ธ๋์ ๋ถ์๋๋ฅผ ์ธก์ ํฉ๋๋ค. ๋ฎ์ ์ง๋ ๋ถ์๋๋ ๋ ๋์ ๋ถํ ์ ๋ํ๋ ๋๋ค. ๊ณต์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
Gini = 1 - ฮฃ(p_i^2)
์ฌ๊ธฐ์ p_i๋ ํด๋์ค i์ ์ธ์คํด์ค ๋น์จ์
๋๋ค.
- ์ํธ๋กํผ: ๋ฐ์ดํฐ์ ์ ๋ถํ์ค์ฑ์ ์ธก์ ํฉ๋๋ค. ๋ฎ์ ์ํธ๋กํผ๋ ๋ ๋์ ๋ถํ ์ ๋ํ๋ ๋๋ค. ๊ณต์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
Entropy = -ฮฃ(p_i * log2(p_i))
์ฌ๊ธฐ์ p_i๋ ํด๋์ค i์ ์ธ์คํด์ค ๋น์จ์
๋๋ค.
- ์ ๋ณด ์ด๋: ๋ถํ ํ ์ํธ๋กํผ ๋๋ ์ง๋ ๋ถ์๋์ ๊ฐ์์ ๋๋ค. ์ ๋ณด ์ด๋์ด ๋์์๋ก ๋ ๋์ ๋ถํ ์ ๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐ๋ฉ๋๋ค:
Information Gain = Entropy(parent) - (Weighted Average of Entropy(children))
๋ํ, ํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ข ๋ฃ๋ฉ๋๋ค:
- ๋ ธ๋์ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๋์ผํ ํด๋์ค์ ์ํฉ๋๋ค. ์ด๋ ๊ณผ์ ํฉ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ํธ๋ฆฌ์ ์ต๋ ๊น์ด(ํ๋์ฝ๋ฉ๋จ)์ ๋๋ฌํ์ต๋๋ค. ์ด๋ ๊ณผ์ ํฉ์ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ๋ ธ๋์ ์ธ์คํด์ค ์๊ฐ ํน์ ์๊ณ๊ฐ ์ดํ์ ๋๋ค. ์ด๊ฒ๋ ๊ณผ์ ํฉ์ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์ถ๊ฐ ๋ถํ ๋ก ์ธํ ์ ๋ณด ์ด๋์ด ํน์ ์๊ณ๊ฐ ์ดํ์ ๋๋ค. ์ด๊ฒ๋ ๊ณผ์ ํฉ์ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์์ -- ์นจ์ ํ์ง๋ฅผ ์ํ ์์ฌ ๊ฒฐ์ ํธ๋ฆฌ:
NSL-KDD ๋ฐ์ดํฐ์ ์์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ *์ ์* ๋๋ *๊ณต๊ฒฉ*์ผ๋ก ๋ถ๋ฅํ๊ธฐ ์ํด ์์ฌ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ํ๋ จ์ํฌ ๊ฒ์ ๋๋ค. NSL-KDD๋ ํ๋กํ ์ฝ ์ ํ, ์๋น์ค, ์ง์ ์๊ฐ, ์คํจํ ๋ก๊ทธ์ธ ์ ๋ฑ์ ํน์ฑ์ ๊ฐ์ง ๊ณ ์ ์ ์ธ KDD Cup 1999 ๋ฐ์ดํฐ์ ์ ๊ฐ์ ๋ ๋ฒ์ ์ด๋ฉฐ, ๊ณต๊ฒฉ ์ ํ ๋๋ "์ ์"์ ๋ํ๋ด๋ ๋ ์ด๋ธ์ด ์์ต๋๋ค. ๋ชจ๋ ๊ณต๊ฒฉ ์ ํ์ "์ด์" ํด๋์ค์ ๋งคํํ ๊ฒ์ ๋๋ค(์ด์ง ๋ถ๋ฅ: ์ ์ vs ์ด์). ํ๋ จ ํ, ํ ์คํธ ์ธํธ์์ ํธ๋ฆฌ์ ์ฑ๋ฅ์ ํ๊ฐํ ๊ฒ์ ๋๋ค. ```python import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.preprocessing import LabelEncoder from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score1๏ธโฃ NSLโKDD column names (41 features + class + difficulty)
col_names = [ โdurationโ,โprotocol_typeโ,โserviceโ,โflagโ,โsrc_bytesโ,โdst_bytesโ,โlandโ, โwrong_fragmentโ,โurgentโ,โhotโ,โnum_failed_loginsโ,โlogged_inโ,โnum_compromisedโ, โroot_shellโ,โsu_attemptedโ,โnum_rootโ,โnum_file_creationsโ,โnum_shellsโ, โnum_access_filesโ,โnum_outbound_cmdsโ,โis_host_loginโ,โis_guest_loginโ,โcountโ, โsrv_countโ,โserror_rateโ,โsrv_serror_rateโ,โrerror_rateโ,โsrv_rerror_rateโ, โsame_srv_rateโ,โdiff_srv_rateโ,โsrv_diff_host_rateโ,โdst_host_countโ, โdst_host_srv_countโ,โdst_host_same_srv_rateโ,โdst_host_diff_srv_rateโ, โdst_host_same_src_port_rateโ,โdst_host_srv_diff_host_rateโ,โdst_host_serror_rateโ, โdst_host_srv_serror_rateโ,โdst_host_rerror_rateโ,โdst_host_srv_rerror_rateโ, โclassโ,โdifficulty_levelโ ]
2๏ธโฃ Load data โ headerless CSV
train_url = โhttps://raw.githubusercontent.com/Mamcose/NSL-KDD-Network-Intrusion-Detection/master/NSL_KDD_Train.csvโ test_url = โhttps://raw.githubusercontent.com/Mamcose/NSL-KDD-Network-Intrusion-Detection/master/NSL_KDD_Test.csvโ
df_train = pd.read_csv(train_url, header=None, names=col_names) df_test = pd.read_csv(test_url, header=None, names=col_names)
3๏ธโฃ Encode the 3 nominal features
for col in [โprotocol_typeโ, โserviceโ, โflagโ]: le = LabelEncoder().fit(pd.concat([df_train[col], df_test[col]])) df_train[col] = le.transform(df_train[col]) df_test[col] = le.transform(df_test[col])
4๏ธโฃ Prepare X / y (binary: 0ย =ย normal,ย 1ย =ย attack)
X_train = df_train.drop(columns=[โclassโ, โdifficulty_levelโ]) y_train = (df_train[โclassโ].str.lower() != โnormalโ).astype(int)
X_test = df_test.drop(columns=[โclassโ, โdifficulty_levelโ]) y_test = (df_test[โclassโ].str.lower() != โnormalโ).astype(int)
5๏ธโฃ Train DecisionโTree
clf = DecisionTreeClassifier(max_depth=10, random_state=42) clf.fit(X_train, y_train)
6๏ธโฃ Evaluate
y_pred = clf.predict(X_test) y_prob = clf.predict_proba(X_test)[:, 1]
print(fโAccuracy : {accuracy_score(y_test, y_pred):.3f}โ) print(fโPrecision: {precision_score(y_test, y_pred):.3f}โ) print(fโRecall : {recall_score(y_test, y_pred):.3f}โ) print(fโF1โscore : {f1_score(y_test, y_pred):.3f}โ) print(fโROCย AUC : {roc_auc_score(y_test, y_prob):.3f}โ)
โโโ Accuracy : 0.772 Precision: 0.967 Recall : 0.621 F1โscore : 0.756 ROC AUC : 0.758 โโโ
์ด ๊ฒฐ์ ํธ๋ฆฌ ์์ ์์๋ ๊ทน๋จ์ ์ธ ๊ณผ์ ํฉ์ ํผํ๊ธฐ ์ํด ํธ๋ฆฌ ๊น์ด๋ฅผ 10์ผ๋ก ์ ํํ์ต๋๋ค(`max_depth=10` ๋งค๊ฐ๋ณ์). ๋ฉํธ๋ฆญ์ ํธ๋ฆฌ๊ฐ ์ ์ ํธ๋ํฝ๊ณผ ๊ณต๊ฒฉ ํธ๋ํฝ์ ์ผ๋ง๋ ์ ๊ตฌ๋ถํ๋์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋์ ์ฌํ์จ์ ๋๋ถ๋ถ์ ๊ณต๊ฒฉ์ ํฌ์ฐฉํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ(IDS์ ์ค์), ๋์ ์ ๋ฐ๋๋ ์๋ชป๋ ๊ฒฝ๊ณ ๊ฐ ์ ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ฒฐ์ ํธ๋ฆฌ๋ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ์์ ๊ด์ฐฎ์ ์ ํ๋๋ฅผ ๋ฌ์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง, ๋จ์ผ ํธ๋ฆฌ๋ ์ต์์ ์ฑ๋ฅ์ ๋๋ฌํ์ง ๋ชปํ ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ชจ๋ธ์ *ํด์ ๊ฐ๋ฅ์ฑ*์ ํฐ ์ฅ์ ์
๋๋ค. ์๋ฅผ ๋ค์ด, ํธ๋ฆฌ์ ๋ถํ ์ ๊ฒํ ํ์ฌ ์ด๋ค ํน์ฑ(์: `service`, `src_bytes` ๋ฑ)์ด ์ฐ๊ฒฐ์ ์
์ฑ์ผ๋ก ํ๋๊ทธํ๋ ๋ฐ ๊ฐ์ฅ ์ํฅ์ ๋ฏธ์น๋์ง ํ์ธํ ์ ์์ต๋๋ค.
</details>
### ๋๋ค ํฌ๋ ์คํธ
๋๋ค ํฌ๋ ์คํธ๋ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ **์์๋ธ ํ์ต** ๋ฐฉ๋ฒ์
๋๋ค. ๋๋ค ํฌ๋ ์คํธ๋ ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ํ๋ จ์ํค๊ณ (๋ฐ๋ผ์ "ํฌ๋ ์คํธ") ์ด๋ค์ ์ถ๋ ฅ์ ๊ฒฐํฉํ์ฌ ์ต์ข
์์ธก์ ๋ง๋ญ๋๋ค(๋ถ๋ฅ์ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ฒฐ์ ์ํด). ๋๋ค ํฌ๋ ์คํธ์ ๋ ๊ฐ์ง ์ฃผ์ ์์ด๋์ด๋ **๋ฐฐ๊น
**(๋ถํธ์คํธ๋ฉ ์ง๊ณ)๊ณผ **ํน์ฑ ๋ฌด์์์ฑ**์
๋๋ค:
- **๋ฐฐ๊น
:** ๊ฐ ํธ๋ฆฌ๋ ํ๋ จ ๋ฐ์ดํฐ์ ๋ฌด์์ ๋ถํธ์คํธ๋ฉ ์ํ(๊ต์ฒด ์ํ๋ง)์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ จ๋ฉ๋๋ค. ์ด๋ ํธ๋ฆฌ ๊ฐ์ ๋ค์์ฑ์ ๋์
ํฉ๋๋ค.
- **ํน์ฑ ๋ฌด์์์ฑ:** ํธ๋ฆฌ์ ๊ฐ ๋ถํ ์์ ๋ฌด์์ ํน์ฑ์ ํ์ ์งํฉ์ด ๋ถํ ์ ์ํด ๊ณ ๋ ค๋ฉ๋๋ค(๋ชจ๋ ํน์ฑ์ด ์๋). ์ด๋ ํธ๋ฆฌ ๊ฐ์ ์๊ด๊ด๊ณ๋ฅผ ๋์ฑ ์ค์
๋๋ค.
๋ง์ ํธ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ํ๊ท ํํจ์ผ๋ก์จ ๋๋ค ํฌ๋ ์คํธ๋ ๋จ์ผ ๊ฒฐ์ ํธ๋ฆฌ๊ฐ ๊ฐ์ง ์ ์๋ ๋ถ์ฐ์ ์ค์
๋๋ค. ๊ฐ๋จํ ๋งํด, ๊ฐ๋ณ ํธ๋ฆฌ๋ ๊ณผ์ ํฉ๋๊ฑฐ๋ ๋
ธ์ด์ฆ๊ฐ ์์ ์ ์์ง๋ง, ๋ค์ํ ํธ๋ฆฌ๊ฐ ํจ๊ป ํฌํํ๋ฉด ์ด๋ฌํ ์ค๋ฅ๊ฐ ์ํ๋ฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ๋ ์ข
์ข
**๋ ๋์ ์ ํ๋**์ ๋จ์ผ ๊ฒฐ์ ํธ๋ฆฌ๋ณด๋ค ๋ ๋์ ์ผ๋ฐํ๋ฅผ ๊ฐ์ง ๋ชจ๋ธ์
๋๋ค. ๋ํ, ๋๋ค ํฌ๋ ์คํธ๋ ๊ฐ ํน์ฑ์ด ํ๊ท ์ ์ผ๋ก ๋ถ์๋๋ฅผ ์ผ๋ง๋ ์ค์ด๋์ง๋ฅผ ์ดํด๋ด์ผ๋ก์จ ํน์ฑ ์ค์๋์ ์ถ์ ์น๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋๋ค ํฌ๋ ์คํธ๋ ์นจ์
ํ์ง, ์
์ฑ ์ฝ๋ ๋ถ๋ฅ ๋ฐ ์คํธ ํ์ง์ ๊ฐ์ ์์
์์ **์ฌ์ด๋ฒ ๋ณด์์ ์ผ๊พผ**์ด ๋์์ต๋๋ค. ์ต์ํ์ ์กฐ์ ์ผ๋ก ์ฆ์ ์ ์๋ํ๋ฉฐ ๋๊ท๋ชจ ํน์ฑ ์งํฉ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์นจ์
ํ์ง์์ ๋๋ค ํฌ๋ ์คํธ๋ ๋ ๋ฏธ์ธํ ๊ณต๊ฒฉ ํจํด์ ํฌ์ฐฉํ์ฌ ์๋ชป๋ ๊ธ์ ์ด ์ ์ ๋จ์ผ ๊ฒฐ์ ํธ๋ฆฌ๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ ๋ฐํํ ์ ์์ต๋๋ค. ์ฐ๊ตฌ์ ๋ฐ๋ฅด๋ฉด ๋๋ค ํฌ๋ ์คํธ๋ NSL-KDD ๋ฐ UNSW-NB15์ ๊ฐ์ ๋ฐ์ดํฐ ์ธํธ์์ ๊ณต๊ฒฉ์ ๋ถ๋ฅํ๋ ๋ฐ ์์ด ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ๋นํด ์ ๋ฆฌํ ์ฑ๋ฅ์ ๋ณด์์ต๋๋ค.
#### **๋๋ค ํฌ๋ ์คํธ์ ์ฃผ์ ํน์ฑ:**
- **๋ฌธ์ ์ ํ:** ์ฃผ๋ก ๋ถ๋ฅ(ํ๊ท์๋ ์ฌ์ฉ๋จ). ๋ณด์ ๋ก๊ทธ์์ ์ผ๋ฐ์ ์ธ ๊ณ ์ฐจ์ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ์ ๋งค์ฐ ์ ํฉํฉ๋๋ค.
- **ํด์ ๊ฐ๋ฅ์ฑ:** ๋จ์ผ ๊ฒฐ์ ํธ๋ฆฌ๋ณด๋ค ๋ฎ์ต๋๋ค -- ์๋ฐฑ ๊ฐ์ ํธ๋ฆฌ๋ฅผ ํ ๋ฒ์ ์ฝ๊ฒ ์๊ฐํํ๊ฑฐ๋ ์ค๋ช
ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํน์ฑ ์ค์๋ ์ ์๋ ์ด๋ค ์์ฑ์ด ๊ฐ์ฅ ์ํฅ์ ๋ฏธ์น๋์ง์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
- **์ฅ์ :** ์ผ๋ฐ์ ์ผ๋ก ์์๋ธ ํจ๊ณผ๋ก ์ธํด ๋จ์ผ ํธ๋ฆฌ ๋ชจ๋ธ๋ณด๋ค ๋ ๋์ ์ ํ๋๋ฅผ ๊ฐ์ง๋๋ค. ๊ณผ์ ํฉ์ ๊ฐํฉ๋๋ค -- ๊ฐ๋ณ ํธ๋ฆฌ๊ฐ ๊ณผ์ ํฉ๋๋๋ผ๋ ์์๋ธ์ ๋ ์ ์ผ๋ฐํํฉ๋๋ค. ์ซ์ํ ๋ฐ ๋ฒ์ฃผํ ํน์ฑ์ ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ ๋ ๊ฒฐ์ธก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๋ํ ์ด์์น์ ๋ํด ์๋์ ์ผ๋ก ๊ฐํฉ๋๋ค.
- **์ ํ ์ฌํญ:** ๋ชจ๋ธ ํฌ๊ธฐ๊ฐ ํด ์ ์์ต๋๋ค(๋ง์ ํธ๋ฆฌ, ๊ฐ ํธ๋ฆฌ๋ ์ ์ฌ์ ์ผ๋ก ๊น์). ์์ธก ์๋๊ฐ ๋จ์ผ ํธ๋ฆฌ๋ณด๋ค ๋๋ฆฝ๋๋ค(๋ง์ ํธ๋ฆฌ๋ฅผ ์ง๊ณํด์ผ ํ๋ฏ๋ก). ๋ ํด์ ๊ฐ๋ฅํจ -- ์ค์ํ ํน์ฑ์ ์ ์ ์์ง๋ง, ์ ํํ ๋
ผ๋ฆฌ๋ ๊ฐ๋จํ ๊ท์น์ผ๋ก ์ฝ๊ฒ ์ถ์ ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ์ธํธ๊ฐ ๋งค์ฐ ๊ณ ์ฐจ์์ด๊ณ ํฌ์ํ ๊ฒฝ์ฐ, ๋งค์ฐ ํฐ ํฌ๋ ์คํธ๋ฅผ ํ๋ จํ๋ ๊ฒ์ ๊ณ์ฐ์ ์ผ๋ก ๋ฌด๊ฑฐ์ธ ์ ์์ต๋๋ค.
- **ํ๋ จ ๊ณผ์ :**
1. **๋ถํธ์คํธ๋ฉ ์ํ๋ง:** ๊ต์ฒด ์ํ๋ง์ ํตํด ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ๋ฌด์์๋ก ์ํ๋งํ์ฌ ์ฌ๋ฌ ํ์ ์งํฉ(๋ถํธ์คํธ๋ฉ ์ํ)์ ๋ง๋ญ๋๋ค.
2. **ํธ๋ฆฌ ๊ตฌ์ฑ:** ๊ฐ ๋ถํธ์คํธ๋ฉ ์ํ์ ๋ํด ๊ฐ ๋ถํ ์์ ๋ฌด์์ ํน์ฑ์ ํ์ ์งํฉ์ ์ฌ์ฉํ์ฌ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํฉ๋๋ค. ์ด๋ ํธ๋ฆฌ ๊ฐ์ ๋ค์์ฑ์ ๋์
ํฉ๋๋ค.
3. **์ง๊ณ:** ๋ถ๋ฅ ์์
์ ๊ฒฝ์ฐ, ์ต์ข
์์ธก์ ๋ชจ๋ ํธ๋ฆฌ์ ์์ธก ์ค ๋ค์๊ฒฐ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ํ๊ท ์์
์ ๊ฒฝ์ฐ, ์ต์ข
์์ธก์ ๋ชจ๋ ํธ๋ฆฌ์ ์์ธก ํ๊ท ์
๋๋ค.
<details>
<summary>์์ -- ์นจ์
ํ์ง๋ฅผ ์ํ ๋๋ค ํฌ๋ ์คํธ (NSL-KDD):</summary>
์ฐ๋ฆฌ๋ ๋์ผํ NSL-KDD ๋ฐ์ดํฐ ์ธํธ(์ ์ ๋ ์ด์์ผ๋ก ์ด์ง ๋ ์ด๋ธ)๋ฅผ ์ฌ์ฉํ๊ณ ๋๋ค ํฌ๋ ์คํธ ๋ถ๋ฅ๊ธฐ๋ฅผ ํ๋ จ์ํฌ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ๋ ๋๋ค ํฌ๋ ์คํธ๊ฐ ๋จ์ผ ๊ฒฐ์ ํธ๋ฆฌ๋ณด๋ค ์ฑ๋ฅ์ด ์ข๊ฑฐ๋ ๊ฐ๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์์๋ธ ํ๊ท ํ๊ฐ ๋ถ์ฐ์ ์ค์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ฐ๋ฆฌ๋ ๋์ผํ ๋ฉํธ๋ฆญ์ผ๋ก ํ๊ฐํ ๊ฒ์
๋๋ค.
```python
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import (accuracy_score, precision_score,
recall_score, f1_score, roc_auc_score)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 1. LOAD DATA โ files have **no header row**, so we
# pass `header=None` and give our own column names.
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
col_names = [ # 41ย features + 2ย targets
"duration","protocol_type","service","flag","src_bytes","dst_bytes","land",
"wrong_fragment","urgent","hot","num_failed_logins","logged_in",
"num_compromised","root_shell","su_attempted","num_root","num_file_creations",
"num_shells","num_access_files","num_outbound_cmds","is_host_login",
"is_guest_login","count","srv_count","serror_rate","srv_serror_rate",
"rerror_rate","srv_rerror_rate","same_srv_rate","diff_srv_rate",
"srv_diff_host_rate","dst_host_count","dst_host_srv_count",
"dst_host_same_srv_rate","dst_host_diff_srv_rate",
"dst_host_same_src_port_rate","dst_host_srv_diff_host_rate",
"dst_host_serror_rate","dst_host_srv_serror_rate","dst_host_rerror_rate",
"dst_host_srv_rerror_rate","class","difficulty_level"
]
train_url = "https://raw.githubusercontent.com/Mamcose/NSL-KDD-Network-Intrusion-Detection/master/NSL_KDD_Train.csv"
test_url = "https://raw.githubusercontent.com/Mamcose/NSL-KDD-Network-Intrusion-Detection/master/NSL_KDD_Test.csv"
df_train = pd.read_csv(train_url, header=None, names=col_names)
df_test = pd.read_csv(test_url, header=None, names=col_names)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 2. PREโPROCESSING
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 2โa) Encode the three categorical columns so that the model
# receives integers instead of strings.
# LabelEncoder gives an int to each unique value in the column: {'icmp':0, 'tcp':1, 'udp':2}
for col in ['protocol_type', 'service', 'flag']:
le = LabelEncoder().fit(pd.concat([df_train[col], df_test[col]]))
df_train[col] = le.transform(df_train[col])
df_test[col] = le.transform(df_test[col])
# 2โb) Build feature matrix X (drop target & difficulty)
X_train = df_train.drop(columns=['class', 'difficulty_level'])
X_test = df_test.drop(columns=['class', 'difficulty_level'])
# 2โc) Convert multiโclass labels to binary
# labelย 0 โ 'normal' traffic, labelย 1 โ any attack
y_train = (df_train['class'].str.lower() != 'normal').astype(int)
y_test = (df_test['class'].str.lower() != 'normal').astype(int)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 3. MODEL: RANDOMย FOREST
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# โข n_estimators = 100 โ build 100 different decisionโtrees.
# โข max_depth=None โ let each tree grow until pure leaves
# (or until it hits other stopping criteria).
# โข random_state=42 โ reproducible randomness.
model = RandomForestClassifier(
n_estimators=100,
max_depth=None,
random_state=42,
bootstrap=True # default: each tree is trained on a
# bootstrap sample the same size as
# the original training set.
# max_samples # โ you can set this (float or int) to
# use a smaller % of samples per tree.
)
model.fit(X_train, y_train)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 4. EVALUATION
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]
print(f"Accuracy : {accuracy_score(y_test, y_pred):.3f}")
print(f"Precision: {precision_score(y_test, y_pred):.3f}")
print(f"Recall : {recall_score(y_test, y_pred):.3f}")
print(f"F1โscore : {f1_score(y_test, y_pred):.3f}")
print(f"ROCย AUC : {roc_auc_score(y_test, y_prob):.3f}")
"""
Accuracy: 0.770
Precision: 0.966
Recall: 0.618
F1-score: 0.754
ROC AUC: 0.962
"""
๋๋ค ํฌ๋ ์คํธ๋ ์ผ๋ฐ์ ์ผ๋ก ์ด ์นจ์ ํ์ง ์์ ์์ ๊ฐ๋ ฅํ ๊ฒฐ๊ณผ๋ฅผ ๋ฌ์ฑํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ผ ๊ฒฐ์ ํธ๋ฆฌ์ ๋นํด F1 ๋๋ AUC์ ๊ฐ์ ๋ฉํธ๋ฆญ์์ ๊ฐ์ ์ ๊ด์ฐฐํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ์ฌํ์จ ๋๋ ์ ๋ฐ๋์์ ํนํ ๋๋๋ฌ์ง๋๋ค. ์ด๋ *โ๋๋ค ํฌ๋ ์คํธ(RF)๋ ์์๋ธ ๋ถ๋ฅ๊ธฐ์ด๋ฉฐ ๊ณต๊ฒฉ์ ํจ๊ณผ์ ์ธ ๋ถ๋ฅ๋ฅผ ์ํด ๋ค๋ฅธ ์ ํต์ ์ธ ๋ถ๋ฅ๊ธฐ์ ๋น๊ตํ์ฌ ์ ์๋ํ๋ค.โ*๋ ์ดํด์ ์ผ์นํฉ๋๋ค. ๋ณด์ ์ด์ ๋งฅ๋ฝ์์ ๋๋ค ํฌ๋ ์คํธ ๋ชจ๋ธ์ ๋ง์ ๊ฒฐ์ ๊ท์น์ ํ๊ท ํ ๋๋ถ์ ๊ณต๊ฒฉ์ ๋ ์ ๋ขฐ์ฑ ์๊ฒ ํ๋๊ทธํ ์ ์์ผ๋ฉฐ, ์๋ชป๋ ๊ฒฝ๊ณ ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. ์ฒ์์์ ํน์ฑ ์ค์์ฑ์ ์ด๋ค ๋คํธ์ํฌ ํน์ฑ์ด ๊ณต๊ฒฉ์ ๊ฐ์ฅ ์ ๋ํ๋ด๋์ง๋ฅผ ์๋ ค์ค ์ ์์ต๋๋ค(์: ํน์ ๋คํธ์ํฌ ์๋น์ค ๋๋ ๋น์ ์์ ์ธ ํจํท ์).
์ํฌํธ ๋ฒกํฐ ๋จธ์ (SVM)
์ํฌํธ ๋ฒกํฐ ๋จธ์ ์ ์ฃผ๋ก ๋ถ๋ฅ(๊ทธ๋ฆฌ๊ณ SVR๋ก ํ๊ท) ์ฉ๋๋ก ์ฌ์ฉ๋๋ ๊ฐ๋ ฅํ ๊ฐ๋ ํ์ต ๋ชจ๋ธ์ ๋๋ค. SVM์ ๋ ํด๋์ค ๊ฐ์ ๋ง์ง์ ์ต๋ํํ๋ ์ต์ ์ ๋ถ๋ฆฌ ์ดํ๋ฉด์ ์ฐพ์ผ๋ ค๊ณ ํฉ๋๋ค. ์ด ์ดํ๋ฉด์ ์์น๋ ๊ฒฝ๊ณ์ ๊ฐ์ฅ ๊ฐ๊น์ด ํ๋ จ ํฌ์ธํธ์ ํ์ ์งํฉ(โ์ํฌํธ ๋ฒกํฐโ)์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. ๋ง์ง(์ํฌํธ ๋ฒกํฐ์ ์ดํ๋ฉด ๊ฐ์ ๊ฑฐ๋ฆฌ)์ ์ต๋ํํจ์ผ๋ก์จ SVM์ ์ข์ ์ผ๋ฐํ๋ฅผ ๋ฌ์ฑํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
SVM์ ๊ฐ๋ ฅํ ์ ์ ๋น์ ํ ๊ด๊ณ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ปค๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ฅ๋ ฅ์ ๋๋ค. ๋ฐ์ดํฐ๋ ์ ํ ๋ถ๋ฆฌ๊ฐ ์กด์ฌํ ์ ์๋ ๋ ๋์ ์ฐจ์์ ํน์ฑ ๊ณต๊ฐ์ผ๋ก ์๋ฌต์ ์ผ๋ก ๋ณํ๋ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ปค๋์๋ ๋คํญ์, ๋ฐฉ์ฌ ๊ธฐ์ ํจ์(RBF), ์๊ทธ๋ชจ์ด๋๊ฐ ํฌํจ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋คํธ์ํฌ ํธ๋ํฝ ํด๋์ค๊ฐ ์์ ํน์ฑ ๊ณต๊ฐ์์ ์ ํ์ ์ผ๋ก ๋ถ๋ฆฌ๋์ง ์๋ ๊ฒฝ์ฐ, RBF ์ปค๋์ ์ด๋ฅผ ๋ ๋์ ์ฐจ์์ผ๋ก ๋งคํํ์ฌ SVM์ด ์ ํ ๋ถํ ์ ์ฐพ๋๋ก ํฉ๋๋ค(์ด๋ ์๋ ๊ณต๊ฐ์์ ๋น์ ํ ๊ฒฝ๊ณ์ ํด๋นํฉ๋๋ค). ์ปค๋์ ์ ํํ๋ ์ ์ฐ์ฑ ๋๋ถ์ SVM์ ๋ค์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
SVM์ ๊ณ ์ฐจ์ ํน์ฑ ๊ณต๊ฐ(์: ํ ์คํธ ๋ฐ์ดํฐ ๋๋ ์ ์ฑ ์ฝ๋ ๋ช ๋ น์ด ์ํ์ค)์์ ์ ์๋ํ๋ฉฐ, ํน์ฑ์ ์๊ฐ ์ํ ์์ ๋นํด ํด ๋ ํจ๊ณผ์ ์ ๋๋ค. 2000๋ ๋์๋ ์ ์ฑ ์ฝ๋ ๋ถ๋ฅ ๋ฐ ์ด์ ๊ธฐ๋ฐ ์นจ์ ํ์ง์ ๊ฐ์ ๋ง์ ์ด๊ธฐ ์ฌ์ด๋ฒ ๋ณด์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ธ๊ธฐ๊ฐ ์์์ผ๋ฉฐ, ์ข ์ข ๋์ ์ ํ๋๋ฅผ ๋ณด์์ต๋๋ค.
๊ทธ๋ฌ๋ SVM์ ๋งค์ฐ ํฐ ๋ฐ์ดํฐ ์ธํธ์ ์ฝ๊ฒ ํ์ฅ๋์ง ์์ต๋๋ค(ํ๋ จ ๋ณต์ก๋๋ ์ํ ์์ ๋ํด ์ด์ ํ์ด๋ฉฐ, ๋ง์ ์ํฌํธ ๋ฒกํฐ๋ฅผ ์ ์ฅํด์ผ ํ ์ ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ ์ ์์ต๋๋ค). ์ค์ ๋ก ์๋ฐฑ๋ง ๊ฐ์ ๋ ์ฝ๋๊ฐ ์๋ ๋คํธ์ํฌ ์นจ์ ํ์ง์ ๊ฐ์ ์์ ์์๋ ์ ์คํ ํ์ ์ํ๋ง์ด๋ ๊ทผ์ฌ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด SVM์ด ๋๋ฌด ๋๋ฆด ์ ์์ต๋๋ค.
SVM์ ์ฃผ์ ํน์ฑ:
-
๋ฌธ์ ์ ํ: ๋ถ๋ฅ(์ด์ง ๋๋ ๋ค์ค ํด๋์ค, ์ผ๋์ผ/์ผ๋๋ค) ๋ฐ ํ๊ท ๋ณํ. ๋ช ํํ ๋ง์ง ๋ถ๋ฆฌ๊ฐ ์๋ ์ด์ง ๋ถ๋ฅ์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
-
ํด์ ๊ฐ๋ฅ์ฑ: ์ค๊ฐ โ SVM์ ๊ฒฐ์ ํธ๋ฆฌ๋ ๋ก์ง์คํฑ ํ๊ท๋งํผ ํด์ ๊ฐ๋ฅํ์ง ์์ต๋๋ค. ์ด๋ค ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ์ํฌํธ ๋ฒกํฐ์ธ์ง ์๋ณํ ์ ์๊ณ , ์ ํ ์ปค๋ ๊ฒฝ์ฐ์ ๊ฐ์ค์น๋ฅผ ํตํด ์ด๋ค ํน์ฑ์ด ์ํฅ์ ๋ฏธ์น ์ ์๋์ง ๊ฐ์ ์ก์ ์ ์์ง๋ง, ์ค์ ๋ก SVM(ํนํ ๋น์ ํ ์ปค๋์ ์ฌ์ฉํ ๊ฒฝ์ฐ)์ ๋ธ๋๋ฐ์ค ๋ถ๋ฅ๊ธฐ๋ก ์ทจ๊ธ๋ฉ๋๋ค.
-
์ฅ์ : ๊ณ ์ฐจ์ ๊ณต๊ฐ์์ ํจ๊ณผ์ ; ์ปค๋ ํธ๋ฆญ์ผ๋ก ๋ณต์กํ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ๋ชจ๋ธ๋งํ ์ ์์; ๋ง์ง์ด ์ต๋ํ๋๋ฉด ๊ณผ์ ํฉ์ ๊ฐํจ(ํนํ ์ ์ ํ ์ ๊ทํ ๋งค๊ฐ๋ณ์ C๊ฐ ์์ ๋); ํด๋์ค๊ฐ ํฐ ๊ฑฐ๋ฆฌ์ ์ํด ๋ถ๋ฆฌ๋์ง ์์ ๋๋ ์ ์๋(์ต์์ ํํ ๊ฒฝ๊ณ๋ฅผ ์ฐพ์).
-
์ ํ ์ฌํญ: ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ์ ๋ํด ๊ณ์ฐ ์ง์ฝ์ (ํ๋ จ ๋ฐ ์์ธก ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์ ํ๋จ). ์ปค๋ ๋ฐ ์ ๊ทํ ๋งค๊ฐ๋ณ์(C, ์ปค๋ ์ ํ, RBF์ ๊ฐ๋ง ๋ฑ)๋ฅผ ์ ์คํ๊ฒ ์กฐ์ ํด์ผ ํจ. ํ๋ฅ ์ ์ถ๋ ฅ์ ์ง์ ์ ๊ณตํ์ง ์์(ํ์ง๋ง Platt ์ค์ผ์ผ๋ง์ ์ฌ์ฉํ์ฌ ํ๋ฅ ์ ์ป์ ์ ์์). ๋ํ SVM์ ์ปค๋ ๋งค๊ฐ๋ณ์ ์ ํ์ ๋ฏผ๊ฐํ ์ ์์ผ๋ฉฐ, ์๋ชป๋ ์ ํ์ ๊ณผ์์ ํฉ ๋๋ ๊ณผ์ ํฉ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ฌ์ด๋ฒ ๋ณด์์์์ ์ฌ์ฉ ์ฌ๋ก: SVM์ ์ ์ฑ ์ฝ๋ ํ์ง(์: ์ถ์ถ๋ ํน์ฑ ๋๋ ๋ช ๋ น์ด ์ํ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ผ ๋ถ๋ฅ), ๋คํธ์ํฌ ์ด์ ํ์ง(ํธ๋ํฝ์ ์ ์ ๋ ์ ์ฑ์ผ๋ก ๋ถ๋ฅ), ํผ์ฑ ํ์ง(URL์ ํน์ฑ์ ์ฌ์ฉ) ๋ฑ์ ์ฌ์ฉ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, SVM์ ์ด๋ฉ์ผ์ ํน์ฑ(ํน์ ํค์๋ ์, ๋ฐ์ ์ ํํ ์ ์ ๋ฑ)์ ๊ฐ์ ธ์ ํผ์ฑ ๋๋ ํฉ๋ฒ์ ์ธ ๊ฒ์ผ๋ก ๋ถ๋ฅํ ์ ์์ต๋๋ค. ๋ํ KDD์ ๊ฐ์ ํน์ฑ ์งํฉ์์ ์นจ์ ํ์ง์ ์ ์ฉ๋์ด ์ข ์ข ๋์ ์ ํ๋๋ฅผ ๋ฌ์ฑํ์์ผ๋ ๊ณ์ฐ ๋น์ฉ์ด ๋ฐ์ํ์ต๋๋ค.
์์ -- ์ ์ฑ ์ฝ๋ ๋ถ๋ฅ๋ฅผ ์ํ SVM:
์ด๋ฒ์๋ SVM์ ์ฌ์ฉํ์ฌ ํผ์ฑ ์น์ฌ์ดํธ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ค์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. SVM์ด ๋๋ฆด ์ ์์ผ๋ฏ๋ก ํ์ํ ๊ฒฝ์ฐ ํ๋ จ์ ์ํด ๋ฐ์ดํฐ์ ํ์ ์งํฉ์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค(๋ฐ์ดํฐ ์ธํธ๋ ์ฝ 11,000๊ฐ์ ์ธ์คํด์ค์ด๋ฉฐ, SVM์ด ์ ์ ํ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค). ๋น์ ํ ๋ฐ์ดํฐ์ ์ผ๋ฐ์ ์ผ๋ก ์ ํ๋๋ RBF ์ปค๋์ ์ฌ์ฉํ ๊ฒ์ด๋ฉฐ, ROC AUC๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด ํ๋ฅ ์ถ์ ์ ํ์ฑํํ ๊ฒ์ ๋๋ค. ```python import pandas as pd from sklearn.datasets import fetch_openml from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from sklearn.metrics import (accuracy_score, precision_score, recall_score, f1_score, roc_auc_score)โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1๏ธโฃ LOAD DATASET (OpenML idย 4534: โPhishingWebsitesโ)
โข as_frame=True โ returns a pandas DataFrame
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
data = fetch_openml(data_id=4534, as_frame=True) # or data_name=โPhishingWebsitesโ df = data.frame print(df.head()) # quick sanityโcheck
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
2๏ธโฃ TARGET: 0 = legitimate, 1 = phishing
The raw column has values {1, 0, -1}:
1 โ legitimate โ 0
0 & -1 โ phishing โ 1
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
y = (df[โResultโ].astype(int) != 1).astype(int) X = df.drop(columns=[โResultโ])
Train / test split (stratified keeps class proportions)
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.20, random_state=42, stratify=y)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
3๏ธโฃ PREโPROCESS: Standardize features (meanโ0 / stdโ1)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
4๏ธโฃ MODEL: RBFโkernel SVM
โข C=1.0 (regularization strength)
โข gamma=โscaleโ (1โฏ/โฏ[n_featuresโฏรโฏvar(X)])
โข probability=True โ enable predict_proba for ROCโAUC
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
clf = SVC(kernel=โrbfโ, C=1.0, gamma=โscaleโ, probability=True, random_state=42) clf.fit(X_train, y_train)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
5๏ธโฃ EVALUATION
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
y_pred = clf.predict(X_test) y_prob = clf.predict_proba(X_test)[:, 1] # P(classย 1)
print(fโAccuracy : {accuracy_score(y_test, y_pred):.3f}โ) print(fโPrecision: {precision_score(y_test, y_pred):.3f}โ) print(fโRecall : {recall_score(y_test, y_pred):.3f}โ) print(fโF1โscore : {f1_score(y_test, y_pred):.3f}โ) print(fโROCย AUC : {roc_auc_score(y_test, y_prob):.3f}โ)
โโโ Accuracy : 0.956 Precision: 0.963 Recall : 0.937 F1โscore : 0.950 ROC AUC : 0.989 โโโ
SVM ๋ชจ๋ธ์ ๋์ผํ ์์
์ ๋ํด ๋ก์ง์คํฑ ํ๊ท์ ๋น๊ตํ ์ ์๋ ๋ฉํธ๋ฆญ์ ์ถ๋ ฅํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ํน์ฑ์ ์ํด ์ ๋ถ๋ฆฌ๋์ด ์๋ค๋ฉด SVM์ด ๋์ ์ ํ๋์ AUC๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ๋ฐ๋ฉด, ๋ฐ์ดํฐ์
์ ๋ง์ ๋
ธ์ด์ฆ๋ ๊ฒน์น๋ ํด๋์ค๊ฐ ์๋ค๋ฉด SVM์ด ๋ก์ง์คํฑ ํ๊ท๋ณด๋ค ํฌ๊ฒ ์ฐ์ํ์ง ์์ ์ ์์ต๋๋ค. ์ค์ ๋ก SVM์ ํน์ฑ๊ณผ ํด๋์ค ๊ฐ์ ๋ณต์กํ๊ณ ๋น์ ํ์ ์ธ ๊ด๊ณ๊ฐ ์์ ๋ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. RBF ์ปค๋์ ๋ก์ง์คํฑ ํ๊ท๊ฐ ๋์น๋ ๊ณก์ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ํฌ์ฐฉํ ์ ์์ต๋๋ค. ๋ชจ๋ ๋ชจ๋ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ํธํฅ๊ณผ ๋ถ์ฐ์ ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด `C`(์ ๊ทํ) ๋ฐ ์ปค๋ ๋งค๊ฐ๋ณ์(์: RBF์ `gamma`)๋ฅผ ์ ์คํ๊ฒ ์กฐ์ ํด์ผ ํฉ๋๋ค.
</details>
#### ๋ก์ง์คํฑ ํ๊ท์ SVM์ ์ฐจ์ด
| ์ธก๋ฉด | **๋ก์ง์คํฑ ํ๊ท** | **์ํฌํธ ๋ฒกํฐ ๋จธ์ ** |
|---|---|---|
| **๋ชฉ์ ํจ์** | **๋ก๊ทธ ์์ค**(๊ต์ฐจ ์ํธ๋กํผ)์ ์ต์ํํฉ๋๋ค. | **ํ์ง ์์ค**์ ์ต์ํํ๋ฉด์ **๋ง์ง**์ ์ต๋ํํฉ๋๋ค. |
| **๊ฒฐ์ ๊ฒฝ๊ณ** | _P(y\|x)_๋ฅผ ๋ชจ๋ธ๋งํ๋ **์ต์ ์ ์ดํ๋ฉด**์ ์ฐพ์ต๋๋ค. | ๊ฐ์ฅ ๊ฐ๊น์ด ์ ๊ณผ์ ๊ฐ๊ฒฉ์ด ๊ฐ์ฅ ํฐ **์ต๋ ๋ง์ง ์ดํ๋ฉด**์ ์ฐพ์ต๋๋ค. |
| **์ถ๋ ฅ** | **ํ๋ฅ ์ ** โ ฯ(wยทxโฏ+โฏb)๋ฅผ ํตํด ๋ณด์ ๋ ํด๋์ค ํ๋ฅ ์ ์ ๊ณตํฉ๋๋ค. | **๊ฒฐ์ ์ ** โ ํด๋์ค ๋ ์ด๋ธ์ ๋ฐํํฉ๋๋ค; ํ๋ฅ ์ ์ถ๊ฐ ์์
์ด ํ์ํฉ๋๋ค(์: Platt ์ค์ผ์ผ๋ง). |
| **์ ๊ทํ** | L2(๊ธฐ๋ณธ๊ฐ) ๋๋ L1, ๊ณผ์/๊ณผ๋ ์ ํฉ์ ์ง์ ์ ์ผ๋ก ๊ท ํ ๋ง์ถฅ๋๋ค. | C ๋งค๊ฐ๋ณ์๋ ๋ง์ง ๋๋น์ ์๋ชป ๋ถ๋ฅ ๊ฐ์ ๊ท ํ์ ๋ง์ถ๋ฉฐ, ์ปค๋ ๋งค๊ฐ๋ณ์๋ ๋ณต์ก์ฑ์ ์ถ๊ฐํฉ๋๋ค. |
| **์ปค๋ / ๋น์ ํ** | ๊ธฐ๋ณธ ํํ๋ **์ ํ**; ๋น์ ํ์ฑ์ ํน์ฑ ์์ง๋์ด๋ง์ผ๋ก ์ถ๊ฐ๋ฉ๋๋ค. | ๋ด์ฅ๋ **์ปค๋ ํธ๋ฆญ**(RBF, poly ๋ฑ)์ ํตํด ๊ณ ์ฐจ์ ๊ณต๊ฐ์์ ๋ณต์กํ ๊ฒฝ๊ณ๋ฅผ ๋ชจ๋ธ๋งํ ์ ์์ต๋๋ค. |
| **ํ์ฅ์ฑ** | **O(nd)**์์ ๋ณผ๋ก ์ต์ ํ๋ฅผ ํด๊ฒฐํ๋ฉฐ, ๋งค์ฐ ํฐ n์ ์ ์ฒ๋ฆฌํฉ๋๋ค. | ํ๋ จ์ ์ ๋ฌธ ์๋ฒ ์์ด **O(nยฒโnยณ)** ๋ฉ๋ชจ๋ฆฌ/์๊ฐ์ด ์์๋ ์ ์์ผ๋ฉฐ, ํฐ n์ ๋ ์น์ํฉ๋๋ค. |
| **ํด์ ๊ฐ๋ฅ์ฑ** | **๋์** โ ๊ฐ์ค์น๊ฐ ํน์ฑ์ ์ํฅ์ ๋ณด์ฌ์ค๋๋ค; ์ค์ฆ ๋น์จ์ด ์ง๊ด์ ์
๋๋ค. | ๋น์ ํ ์ปค๋์ ๊ฒฝ์ฐ **๋ฎ์**; ์ํฌํธ ๋ฒกํฐ๋ ํฌ์ํ์ง๋ง ์ค๋ช
ํ๊ธฐ ์ฝ์ง ์์ต๋๋ค. |
| **์ด์์น์ ๋ํ ๋ฏผ๊ฐ๋** | ๋ถ๋๋ฌ์ด ๋ก๊ทธ ์์ค์ ์ฌ์ฉํ์ฌ โ ๋ ๋ฏผ๊ฐํฉ๋๋ค. | ํ๋ ๋ง์ง์ ํ์ง ์์ค์ **๋ฏผ๊ฐํ ์ ์์ต๋๋ค**; ์ํํธ ๋ง์ง(C)์ ์ด๋ฅผ ์ํํฉ๋๋ค. |
| **์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก** | ์ ์ฉ ์ ์, ์๋ฃ ์ํ, A/B ํ
์คํธ โ **ํ๋ฅ ๋ฐ ์ค๋ช
๊ฐ๋ฅ์ฑ**์ด ์ค์ํ ๊ฒฝ์ฐ. | ์ด๋ฏธ์ง/ํ
์คํธ ๋ถ๋ฅ, ์๋ฌผ ์ ๋ณดํ โ **๋ณต์กํ ๊ฒฝ๊ณ**์ **๊ณ ์ฐจ์ ๋ฐ์ดํฐ**๊ฐ ์ค์ํ ๊ฒฝ์ฐ. |
* **๋ณด์ ๋ ํ๋ฅ , ํด์ ๊ฐ๋ฅ์ฑ์ด ํ์ํ๊ฑฐ๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ์
์์ ์์
ํด์ผ ํ๋ ๊ฒฝ์ฐโฏโโฏ๋ก์ง์คํฑ ํ๊ท๋ฅผ ์ ํํ์ธ์.**
* **์๋ ํน์ฑ ์์ง๋์ด๋ง ์์ด ๋น์ ํ ๊ด๊ณ๋ฅผ ํฌ์ฐฉํ ์ ์๋ ์ ์ฐํ ๋ชจ๋ธ์ด ํ์ํ๋ค๋ฉดโฏโโฏSVM(์ปค๋ ์ฌ์ฉ)์ ์ ํํ์ธ์.**
* ๋ ๋ชจ๋ธ ๋ชจ๋ ๋ณผ๋ก ๋ชฉํ๋ฅผ ์ต์ ํํ๋ฏ๋ก **์ ์ญ ์ต์๊ฐ์ด ๋ณด์ฅ๋์ง๋ง**, SVM์ ์ปค๋์ ํ์ดํผ ๋งค๊ฐ๋ณ์์ ๊ณ์ฐ ๋น์ฉ์ ์ถ๊ฐํฉ๋๋ค.
### ๋์ด๋ธ ๋ฒ ์ด์ฆ
๋์ด๋ธ ๋ฒ ์ด์ฆ๋ ํน์ฑ ๊ฐ์ ๊ฐํ ๋
๋ฆฝ์ฑ ๊ฐ์ ์ ์ ์ฉํ์ฌ ๋ฒ ์ด์ฆ ์ ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ **ํ๋ฅ ์ ๋ถ๋ฅ๊ธฐ**์ ์งํฉ์
๋๋ค. ์ด๋ฌํ "๋์ด๋ธ" ๊ฐ์ ์๋ ๋ถ๊ตฌํ๊ณ , ๋์ด๋ธ ๋ฒ ์ด์ฆ๋ ํนํ ์คํธ ํ์ง์ ๊ฐ์ ํ
์คํธ ๋๋ ๋ฒ์ฃผํ ๋ฐ์ดํฐ์ ๊ด๋ จ๋ ํน์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ๋๋๋๋ก ์ ์๋ํฉ๋๋ค.
#### ๋ฒ ์ด์ฆ ์ ๋ฆฌ
๋ฒ ์ด์ฆ ์ ๋ฆฌ๋ ๋์ด๋ธ ๋ฒ ์ด์ฆ ๋ถ๋ฅ๊ธฐ์ ๊ธฐ์ด์
๋๋ค. ์ด๋ ๋ฌด์์ ์ฌ๊ฑด์ ์กฐ๊ฑด๋ถ ๋ฐ ์ฃผ๋ณ ํ๋ฅ ์ ์ฐ๊ฒฐํฉ๋๋ค. ๊ณต์์:
```plaintext
P(A|B) = (P(B|A) * P(A)) / P(B)
Where:
P(A|B)๋ ํน์ฑB๊ฐ ์ฃผ์ด์ก์ ๋ ํด๋์คA์ ์ฌํ ํ๋ฅ ์ ๋๋ค.P(B|A)๋ ํด๋์คA๊ฐ ์ฃผ์ด์ก์ ๋ ํน์ฑB์ ๊ฐ๋ฅ์ฑ์ ๋๋ค.P(A)๋ ํด๋์คA์ ์ฌ์ ํ๋ฅ ์ ๋๋ค.P(B)๋ ํน์ฑB์ ์ฌ์ ํ๋ฅ ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ํ ์คํธ๊ฐ ์ด๋ฆฐ์ด ๋๋ ์ฑ์ธ์ ์ํด ์์ฑ๋์๋์ง ๋ถ๋ฅํ๊ณ ์ ํ ๋, ํ ์คํธ์ ๋จ์ด๋ฅผ ํน์ฑ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Naive Bayes ๋ถ๋ฅ๊ธฐ๋ ๊ฐ ๋จ์ด๊ฐ ๊ฐ ์ ์ฌ์ ํด๋์ค(์ด๋ฆฐ์ด ๋๋ ์ฑ์ธ)์ ์ํ ํ๋ฅ ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํฉ๋๋ค. ์๋ก์ด ํ ์คํธ๊ฐ ์ฃผ์ด์ง๋ฉด, ํ ์คํธ์ ๋จ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ์ ์ฌ์ ํด๋์ค์ ํ๋ฅ ์ ๊ณ์ฐํ๊ณ ๊ฐ์ฅ ๋์ ํ๋ฅ ์ ๊ฐ์ง ํด๋์ค๋ฅผ ์ ํํฉ๋๋ค.
์ด ์์์ ๋ณผ ์ ์๋ฏ์ด, Naive Bayes ๋ถ๋ฅ๊ธฐ๋ ๋งค์ฐ ๊ฐ๋จํ๊ณ ๋น ๋ฅด์ง๋ง, ํน์ฑ์ด ๋ ๋ฆฝ์ ์ด๋ผ๊ณ ๊ฐ์ ํ๋๋ฐ, ์ด๋ ์ค์ ๋ฐ์ดํฐ์์๋ ํญ์ ๊ทธ๋ ์ง ์์ต๋๋ค.
Naive Bayes ๋ถ๋ฅ๊ธฐ์ ์ ํ
๋ฐ์ดํฐ์ ์ ํ๊ณผ ํน์ฑ์ ๋ถํฌ์ ๋ฐ๋ผ ์ฌ๋ฌ ์ ํ์ Naive Bayes ๋ถ๋ฅ๊ธฐ๊ฐ ์์ต๋๋ค:
- Gaussian Naive Bayes: ํน์ฑ์ด ๊ฐ์ฐ์์(์ ๊ท) ๋ถํฌ๋ฅผ ๋ฐ๋ฅธ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ฐ์ ๋ฐ์ดํฐ์ ์ ํฉํฉ๋๋ค.
- Multinomial Naive Bayes: ํน์ฑ์ด ๋คํญ ๋ถํฌ๋ฅผ ๋ฐ๋ฅธ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ํ ์คํธ ๋ถ๋ฅ์์ ๋จ์ด ์์ ๊ฐ์ ์ด์ฐ ๋ฐ์ดํฐ์ ์ ํฉํฉ๋๋ค.
- Bernoulli Naive Bayes: ํน์ฑ์ด ์ด์ง(0 ๋๋ 1)์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ํ ์คํธ ๋ถ๋ฅ์์ ๋จ์ด์ ์กด์ฌ ๋๋ ๋ถ์ฌ์ ๊ฐ์ ์ด์ง ๋ฐ์ดํฐ์ ์ ํฉํฉ๋๋ค.
- Categorical Naive Bayes: ํน์ฑ์ด ๋ฒ์ฃผํ ๋ณ์๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ์์๊ณผ ๋ชจ์์ ๋ฐ๋ผ ๊ณผ์ผ์ ๋ถ๋ฅํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฒ์ฃผํ ๋ฐ์ดํฐ์ ์ ํฉํฉ๋๋ค.
####ย Naive Bayes์ ์ฃผ์ ํน์ง:
-
๋ฌธ์ ์ ํ: ๋ถ๋ฅ(์ด์ง ๋๋ ๋ค์ค ํด๋์ค). ์ฌ์ด๋ฒ ๋ณด์์์ ํ ์คํธ ๋ถ๋ฅ ์์ (์คํธ, ํผ์ฑ ๋ฑ)์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
-
ํด์ ๊ฐ๋ฅ์ฑ: ์ค๊ฐ โ ๊ฒฐ์ ํธ๋ฆฌ๋งํผ ์ง์ ์ ์ผ๋ก ํด์ํ ์๋ ์์ง๋ง, ํ์ต๋ ํ๋ฅ (์: ์คํธ ์ด๋ฉ์ผ๊ณผ ์ผ๋ฐ ์ด๋ฉ์ผ์์ ๊ฐ์ฅ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋จ์ด)์ ๊ฒ์ฌํ ์ ์์ต๋๋ค. ํ์ํ ๊ฒฝ์ฐ ๋ชจ๋ธ์ ํํ(ํด๋์ค์ ๋ํ ๊ฐ ํน์ฑ์ ํ๋ฅ )๋ฅผ ์ดํดํ ์ ์์ต๋๋ค.
-
์ฅ์ : ๋งค์ฐ ๋น ๋ฅธ ํ๋ จ ๋ฐ ์์ธก, ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์์๋ (์ธ์คํด์ค ์ * ํน์ฑ ์์ ์ ํ). ํ๋ฅ ์ ์ ๋ขฐ์ฑ ์๊ฒ ์ถ์ ํ๊ธฐ ์ํด ์๋์ ์ผ๋ก ์ ์ ์์ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ฉฐ, ํนํ ์ ์ ํ ์ค๋ฌด๋ฉ์ด ์์ ๋ ๊ทธ๋ ์ต๋๋ค. ํน์ฑ์ด ๋ ๋ฆฝ์ ์ผ๋ก ํด๋์ค์ ์ฆ๊ฑฐ๋ฅผ ๊ธฐ์ฌํ ๋, ๊ธฐ์ค์ ์ผ๋ก์ ๋๋ผ์ธ ์ ๋๋ก ์ ํํฉ๋๋ค. ๊ณ ์ฐจ์ ๋ฐ์ดํฐ(์: ํ ์คํธ์์ ์์ฒ ๊ฐ์ ํน์ฑ)์ ์ ์๋ํฉ๋๋ค. ์ค๋ฌด๋ฉ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ๋ ๊ฒ ์ธ์ ๋ณต์กํ ์กฐ์ ์ด ํ์ํ์ง ์์ต๋๋ค.
-
์ ํ ์ฌํญ: ๋ ๋ฆฝ์ฑ ๊ฐ์ ์ ํน์ฑ์ด ๋์ ์๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ ์ ํ๋๋ฅผ ์ ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋คํธ์ํฌ ๋ฐ์ดํฐ์์
src_bytes์dst_bytes์ ๊ฐ์ ํน์ฑ์ด ์๊ด๊ด๊ณ๊ฐ ์์ ์ ์์ผ๋ฉฐ, Naive Bayes๋ ๊ทธ ์ํธ์์ฉ์ ํฌ์ฐฉํ์ง ๋ชปํฉ๋๋ค. ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ์ปค์ง๋ฉด, ํน์ฑ ์์กด์ฑ์ ํ์ตํ๋ ๋ ํํ๋ ฅ์ด ๋ฐ์ด๋ ๋ชจ๋ธ(์: ์์๋ธ ๋๋ ์ ๊ฒฝ๋ง)์ด Naive Bayes๋ฅผ ์ด์ํ ์ ์์ต๋๋ค. ๋ํ, ๊ณต๊ฒฉ์ ์๋ณํ๋ ๋ฐ ํน์ ํน์ฑ ์กฐํฉ์ด ํ์ํ ๊ฒฝ์ฐ(๊ฐ๋ณ ํน์ฑ์ด ๋ ๋ฆฝ์ ์ผ๋ก๋ง ํ์ํ ๊ฒ์ด ์๋), Naive Bayes๋ ์ด๋ ค์์ ๊ฒช์ ๊ฒ์ ๋๋ค.
Tip
์ฌ์ด๋ฒ ๋ณด์์์์ ์ฌ์ฉ ์ฌ๋ก: ๊ณ ์ ์ ์ธ ์ฌ์ฉ์ ์คํธ ํ์ง์ ๋๋ค โ Naive Bayes๋ ์ด๊ธฐ ์คํธ ํํฐ์ ํต์ฌ์ผ๋ก, ํน์ ํ ํฐ(๋จ์ด, ๊ตฌ๋ฌธ, IP ์ฃผ์)์ ๋น๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฉ์ผ์ด ์คํธ์ผ ํ๋ฅ ์ ๊ณ์ฐํ์ต๋๋ค. ๋ํ ํผ์ฑ ์ด๋ฉ์ผ ํ์ง ๋ฐ URL ๋ถ๋ฅ์ ์ฌ์ฉ๋๋ฉฐ, ํน์ ํค์๋๋ ํน์ฑ(์: URL์ โlogin.phpโ ๋๋ URL ๊ฒฝ๋ก์
@)์ ์กด์ฌ๊ฐ ํผ์ฑ ํ๋ฅ ์ ๊ธฐ์ฌํฉ๋๋ค. ์ ์ฑ ์ฝ๋ ๋ถ์์์๋ ํน์ API ํธ์ถ์ด๋ ์ํํธ์จ์ด์ ๊ถํ์ ์กด์ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฑ ์ฝ๋์ธ์ง ์์ธกํ๋ Naive Bayes ๋ถ๋ฅ๊ธฐ๋ฅผ ์์ํ ์ ์์ต๋๋ค. ๋ ๋ฐ์ ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ข ์ข ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ด์ง๋ง, Naive Bayes๋ ์๋์ ๋จ์์ฑ ๋๋ถ์ ์ฌ์ ํ ์ข์ ๊ธฐ์ค์ ์ผ๋ก ๋จ์ ์์ต๋๋ค.
์์ -- ํผ์ฑ ํ์ง๋ฅผ ์ํ Naive Bayes:
Naive Bayes๋ฅผ ์์ฐํ๊ธฐ ์ํด, NSL-KDD ์นจ์ ๋ฐ์ดํฐ์ (์ด์ง ๋ ์ด๋ธ ํฌํจ)์์ Gaussian Naive Bayes๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. Gaussian NB๋ ๊ฐ ํน์ฑ์ด ํด๋์ค๋ณ๋ก ์ ๊ท ๋ถํฌ๋ฅผ ๋ฐ๋ฅธ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ง์ ๋คํธ์ํฌ ํน์ฑ์ด ์ด์ฐ์ ์ด๊ฑฐ๋ ๋งค์ฐ ์๊ณก๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ต์ ์ธ ์ ํ์ด์ง๋ง, ์ฐ์ ํน์ฑ ๋ฐ์ดํฐ์ Naive Bayes๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด์ง ํน์ฑ ์งํฉ(์: ํธ๋ฆฌ๊ฑฐ๋ ๊ฒฝ๊ณ ์ธํธ)์์ Bernoulli NB๋ฅผ ์ ํํ ์๋ ์์ง๋ง, ์ฐ์์ฑ์ ์ํด ์ฌ๊ธฐ์๋ NSL-KDD๋ฅผ ๊ณ ์ํ๊ฒ ์ต๋๋ค. ```python import pandas as pd from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score1. Load NSL-KDD data
col_names = [ # 41ย features + 2ย targets โdurationโ,โprotocol_typeโ,โserviceโ,โflagโ,โsrc_bytesโ,โdst_bytesโ,โlandโ, โwrong_fragmentโ,โurgentโ,โhotโ,โnum_failed_loginsโ,โlogged_inโ, โnum_compromisedโ,โroot_shellโ,โsu_attemptedโ,โnum_rootโ,โnum_file_creationsโ, โnum_shellsโ,โnum_access_filesโ,โnum_outbound_cmdsโ,โis_host_loginโ, โis_guest_loginโ,โcountโ,โsrv_countโ,โserror_rateโ,โsrv_serror_rateโ, โrerror_rateโ,โsrv_rerror_rateโ,โsame_srv_rateโ,โdiff_srv_rateโ, โsrv_diff_host_rateโ,โdst_host_countโ,โdst_host_srv_countโ, โdst_host_same_srv_rateโ,โdst_host_diff_srv_rateโ, โdst_host_same_src_port_rateโ,โdst_host_srv_diff_host_rateโ, โdst_host_serror_rateโ,โdst_host_srv_serror_rateโ,โdst_host_rerror_rateโ, โdst_host_srv_rerror_rateโ,โclassโ,โdifficulty_levelโ ]
train_url = โhttps://raw.githubusercontent.com/Mamcose/NSL-KDD-Network-Intrusion-Detection/master/NSL_KDD_Train.csvโ test_url = โhttps://raw.githubusercontent.com/Mamcose/NSL-KDD-Network-Intrusion-Detection/master/NSL_KDD_Test.csvโ
df_train = pd.read_csv(train_url, header=None, names=col_names) df_test = pd.read_csv(test_url, header=None, names=col_names)
2. Preprocess (encode categorical features, prepare binary labels)
from sklearn.preprocessing import LabelEncoder for col in [โprotocol_typeโ, โserviceโ, โflagโ]: le = LabelEncoder() le.fit(pd.concat([df_train[col], df_test[col]], axis=0)) df_train[col] = le.transform(df_train[col]) df_test[col] = le.transform(df_test[col]) X_train = df_train.drop(columns=[โclassโ, โdifficulty_levelโ], errors=โignoreโ) y_train = df_train[โclassโ].apply(lambda x: 0 if x.strip().lower() == โnormalโ else 1) X_test = df_test.drop(columns=[โclassโ, โdifficulty_levelโ], errors=โignoreโ) y_test = df_test[โclassโ].apply(lambda x: 0 if x.strip().lower() == โnormalโ else 1)
3. Train Gaussian Naive Bayes
model = GaussianNB() model.fit(X_train, y_train)
4. Evaluate on test set
y_pred = model.predict(X_test)
For ROC AUC, need probability of class 1:
y_prob = model.predict_proba(X_test)[:, 1] if hasattr(model, โpredict_probaโ) else y_pred print(fโAccuracy: {accuracy_score(y_test, y_pred):.3f}โ) print(fโPrecision: {precision_score(y_test, y_pred):.3f}โ) print(fโRecall: {recall_score(y_test, y_pred):.3f}โ) print(fโF1-score: {f1_score(y_test, y_pred):.3f}โ) print(fโROC AUC: {roc_auc_score(y_test, y_prob):.3f}โ)
โโโ Accuracy: 0.450 Precision: 0.937 Recall: 0.037 F1-score: 0.071 ROC AUC: 0.867 โโโ
์ด ์ฝ๋๋ ๊ณต๊ฒฉ์ ํ์งํ๊ธฐ ์ํด Naive Bayes ๋ถ๋ฅ๊ธฐ๋ฅผ ํ๋ จ์ํต๋๋ค. Naive Bayes๋ ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก `P(service=http | Attack)` ๋ฐ `P(Service=http | Normal)`๊ณผ ๊ฐ์ ๊ฐ์ ๊ณ์ฐํ๋ฉฐ, ํน์ฑ ๊ฐ์ ๋
๋ฆฝ์ฑ์ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฌํ ํ๋ฅ ์ ์ฌ์ฉํ์ฌ ๊ด์ฐฐ๋ ํน์ฑ์ ๋ฐ๋ผ ์๋ก์ด ์ฐ๊ฒฐ์ ์ ์ ๋๋ ๊ณต๊ฒฉ์ผ๋ก ๋ถ๋ฅํฉ๋๋ค. NSL-KDD์์ NB์ ์ฑ๋ฅ์ ๋ ๊ณ ๊ธ ๋ชจ๋ธ๋งํผ ๋์ง ์์ ์ ์์ง๋ง(ํน์ฑ ๋
๋ฆฝ์ฑ์ด ์๋ฐฐ๋๊ธฐ ๋๋ฌธ์), ์ข
์ข
๊ด์ฐฎ๊ณ ๊ทน๋์ ์๋์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ์ค์๊ฐ ์ด๋ฉ์ผ ํํฐ๋ง์ด๋ URL์ ์ด๊ธฐ ๋ถ๋ฅ์ ๊ฐ์ ์๋๋ฆฌ์ค์์๋ Naive Bayes ๋ชจ๋ธ์ด ์์ ์ฌ์ฉ์ด ์ ์ผ๋ฉด์ ๋ช
๋ฐฑํ ์
์์ ์ธ ์ฌ๋ก๋ฅผ ๋น ๋ฅด๊ฒ ํ๋๊ทธํ ์ ์์ต๋๋ค.
</details>
### k-์ต๊ทผ์ ์ด์ (k-NN)
k-์ต๊ทผ์ ์ด์์ ๊ฐ์ฅ ๊ฐ๋จํ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์
๋๋ค. ์ด๋ **๋น๋ชจ์์ , ์ธ์คํด์ค ๊ธฐ๋ฐ** ๋ฐฉ๋ฒ์ผ๋ก, ํ๋ จ ์ธํธ์ ์์ ์์ ์ ์ฌ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์์ธก์ ์ํํฉ๋๋ค. ๋ถ๋ฅ๋ฅผ ์ํ ์์ด๋์ด๋: ์๋ก์ด ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ๋ถ๋ฅํ๊ธฐ ์ํด ํ๋ จ ๋ฐ์ดํฐ์์ **k**๊ฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ํฌ์ธํธ(์ฆ, "๊ฐ์ฅ ๊ฐ๊น์ด ์ด์")๋ฅผ ์ฐพ์ ๊ทธ ์ด์๋ค ์ค ๋ค์์ ํด๋์ค๋ฅผ ํ ๋นํ๋ ๊ฒ์
๋๋ค. "๊ฐ๊น์"์ ๊ฑฐ๋ฆฌ ๋ฉํธ๋ฆญ์ ์ํด ์ ์๋๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์ซ์ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ(๋ค๋ฅธ ์ ํ์ ํน์ฑ์ด๋ ๋ฌธ์ ์ ๋ํด ๋ค๋ฅธ ๊ฑฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
K-NN์ *๋ช
์์ ์ธ ํ๋ จ์ด ํ์ํ์ง ์์ต๋๋ค* -- "ํ๋ จ" ๋จ๊ณ๋ ๋ฐ์ดํฐ์
์ ์ ์ฅํ๋ ๊ฒ๋ฟ์
๋๋ค. ๋ชจ๋ ์์
์ ์ฟผ๋ฆฌ(์์ธก) ์ค์ ๋ฐ์ํฉ๋๋ค: ์๊ณ ๋ฆฌ์ฆ์ ์ฟผ๋ฆฌ ํฌ์ธํธ์์ ๋ชจ๋ ํ๋ จ ํฌ์ธํธ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ํฌ์ธํธ๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค. ์ด๋ก ์ธํด ์์ธก ์๊ฐ์ **ํ๋ จ ์ํ ์์ ์ ํ์ **์ด๋ฉฐ, ์ด๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ์
์ ๋ํด ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค. ๋ฐ๋ผ์ k-NN์ ๋ ์์ ๋ฐ์ดํฐ์
์ด๋ ๋ฉ๋ชจ๋ฆฌ์ ์๋๋ฅผ ๋จ์ํจ๊ณผ ๊ตํํ ์ ์๋ ์๋๋ฆฌ์ค์ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค.
๋จ์ํจ์๋ ๋ถ๊ตฌํ๊ณ k-NN์ ๋งค์ฐ ๋ณต์กํ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ๋ชจ๋ธ๋งํ ์ ์์ต๋๋ค(์ฌ์ค์ ๊ฒฐ์ ๊ฒฝ๊ณ๋ ์์ ์ ๋ถํฌ์ ์ํด ๊ฒฐ์ ๋๋ ์ด๋ค ํํ๋ ๋ ์ ์์ต๋๋ค). ๊ฒฐ์ ๊ฒฝ๊ณ๊ฐ ๋งค์ฐ ๋ถ๊ท์นํ๊ณ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๋ ์ ์๋ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค -- ๋ณธ์ง์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ "์ค์ค๋ก ๋งํ๊ฒ" ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ณ ์ฐจ์์์๋ ๊ฑฐ๋ฆฌ ๋ฉํธ๋ฆญ์ด ๋ ์๋ฏธ ์๊ฒ ๋ ์ ์์ผ๋ฉฐ(์ฐจ์์ ์ ์ฃผ), ์ํ ์๊ฐ ๋ง์ง ์์ผ๋ฉด ์ด ๋ฐฉ๋ฒ์ด ์ด๋ ค์์ ๊ฒช์ ์ ์์ต๋๋ค.
*์ฌ์ด๋ฒ ๋ณด์์์์ ์ฌ์ฉ ์ฌ๋ก:* k-NN์ ์ด์ ํ์ง์ ์ ์ฉ๋์์ต๋๋ค -- ์๋ฅผ ๋ค์ด, ์นจ์
ํ์ง ์์คํ
์ ๋๋ถ๋ถ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์(์ด์ ์ด๋ฒคํธ)์ด ์
์์ ์ด์๋ค๋ฉด ๋คํธ์ํฌ ์ด๋ฒคํธ๋ฅผ ์
์์ ์ด๋ผ๊ณ ๋ ์ด๋ธ์ ๋ถ์ผ ์ ์์ต๋๋ค. ์ ์ ํธ๋ํฝ์ด ํด๋ฌ์คํฐ๋ฅผ ํ์ฑํ๊ณ ๊ณต๊ฒฉ์ด ์ด์์น์ธ ๊ฒฝ์ฐ, K-NN ์ ๊ทผ ๋ฐฉ์(k=1 ๋๋ ์์ k)์ ๋ณธ์ง์ ์ผ๋ก **๊ฐ์ฅ ๊ฐ๊น์ด ์ด์ ์ด์ ํ์ง**๋ฅผ ์ํํฉ๋๋ค. K-NN์ ์ด์ง ํน์ฑ ๋ฒกํฐ๋ฅผ ํตํด ์
์ฑ์ฝ๋ ํจ๋ฐ๋ฆฌ๋ฅผ ๋ถ๋ฅํ๋ ๋ฐ์๋ ์ฌ์ฉ๋์์ต๋๋ค: ์๋ก์ด ํ์ผ์ด ํน์ ์
์ฑ์ฝ๋ ํจ๋ฐ๋ฆฌ์ ์๋ ค์ง ์ธ์คํด์ค์ ๋งค์ฐ ๊ฐ๊น์ด ๊ฒฝ์ฐ ํด๋น ์
์ฑ์ฝ๋ ํจ๋ฐ๋ฆฌ๋ก ๋ถ๋ฅ๋ ์ ์์ต๋๋ค. ์ค์ ๋ก k-NN์ ๋ ํ์ฅ ๊ฐ๋ฅํ ์๊ณ ๋ฆฌ์ฆ๋งํผ ์ผ๋ฐ์ ์ด์ง ์์ง๋ง, ๊ฐ๋
์ ์ผ๋ก ๊ฐ๋จํ๊ณ ๋๋๋ก ๊ธฐ์ค์ ๋๋ ์๊ท๋ชจ ๋ฌธ์ ์ ์ฌ์ฉ๋ฉ๋๋ค.
#### **k-NN์ ์ฃผ์ ํน์ฑ:**
- **๋ฌธ์ ์ ํ:** ๋ถ๋ฅ(ํ๊ท ๋ณํ๋ ์กด์ฌ). ์ด๋ *๊ฒ์ผ๋ฅธ ํ์ต* ๋ฐฉ๋ฒ์
๋๋ค -- ๋ช
์์ ์ธ ๋ชจ๋ธ ์ ํฉ์ด ์์ต๋๋ค.
- **ํด์ ๊ฐ๋ฅ์ฑ:** ๋ฎ์์์ ์ค๊ฐ -- ์ ์ญ ๋ชจ๋ธ์ด๋ ๊ฐ๊ฒฐํ ์ค๋ช
์ด ์์ง๋ง, ๊ฒฐ์ ์ ์ํฅ์ ๋ฏธ์น ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์์ ์ดํด๋ด์ผ๋ก์จ ๊ฒฐ๊ณผ๋ฅผ ํด์ํ ์ ์์ต๋๋ค(์: "์ด ๋คํธ์ํฌ ํ๋ฆ์ ์ด 3๊ฐ์ ์๋ ค์ง ์
์์ ํ๋ฆ๊ณผ ์ ์ฌํ๊ธฐ ๋๋ฌธ์ ์
์์ ์ผ๋ก ๋ถ๋ฅ๋์์ต๋๋ค"). ๋ฐ๋ผ์ ์ค๋ช
์ ์์ ๊ธฐ๋ฐ์ด ๋ ์ ์์ต๋๋ค.
- **์ฅ์ :** ๊ตฌํ ๋ฐ ์ดํด๊ฐ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ๋ฐ์ดํฐ ๋ถํฌ์ ๋ํ ๊ฐ์ ์ ํ์ง ์์ต๋๋ค(๋น๋ชจ์์ ). ๋ค์ค ํด๋์ค ๋ฌธ์ ๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๊ฒฐ์ ๊ฒฝ๊ณ๊ฐ ๋งค์ฐ ๋ณต์กํ ์ ์๋ค๋ ์ ์์ **์ ์์ **์
๋๋ค.
- **์ ํ ์ฌํญ:** ๋๊ท๋ชจ ๋ฐ์ดํฐ์
์ ๋ํด ์์ธก์ด ๋๋ฆด ์ ์์ต๋๋ค(๋ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํด์ผ ํจ). ๋ฉ๋ชจ๋ฆฌ ์ง์ฝ์ ์
๋๋ค -- ๋ชจ๋ ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ณ ์ฐจ์ ํน์ฑ ๊ณต๊ฐ์์๋ ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค. ๋ชจ๋ ํฌ์ธํธ๊ฐ ๊ฑฐ์ ๋๋ฑํ ๊ฑฐ๋ฆฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ "๊ฐ์ฅ ๊ฐ๊น์ด" ๊ฐ๋
์ด ๋ ์๋ฏธ ์๊ฒ ๋ฉ๋๋ค. *k* (์ด์์ ์)๋ฅผ ์ ์ ํ ์ ํํด์ผ ํฉ๋๋ค -- ๋๋ฌด ์์ k๋ ๋
ธ์ด์ฆ๊ฐ ๋ง๊ณ , ๋๋ฌด ํฐ k๋ ๋ค๋ฅธ ํด๋์ค์ ๊ด๋ จ ์๋ ํฌ์ธํธ๋ฅผ ํฌํจํ ์ ์์ต๋๋ค. ๋ํ, ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ด ์ค์ผ์ผ์ ๋ฏผ๊ฐํ๊ธฐ ๋๋ฌธ์ ํน์ฑ์ ์ ์ ํ ์ค์ผ์ผ๋ง๋์ด์ผ ํฉ๋๋ค.
<details>
<summary>์์ -- ํผ์ฑ ํ์ง๋ฅผ ์ํ k-NN:</summary>
๋ค์ NSL-KDD(์ด์ง ๋ถ๋ฅ)๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค. k-NN์ ๊ณ์ฐ์ ์ผ๋ก ๋ฌด๊ฒ๊ธฐ ๋๋ฌธ์, ์ด ์์ฐ์์ ๋ค๋ฃจ๊ธฐ ์ฝ๊ฒ ํ๋ จ ๋ฐ์ดํฐ์ ํ์ ์งํฉ์ ์ฌ์ฉํ ๊ฒ์
๋๋ค. ์ ์ฒด 125k์์ 20,000๊ฐ์ ํ๋ จ ์ํ์ ์ ํํ๊ณ k=5 ์ด์์ ์ฌ์ฉํ ๊ฒ์
๋๋ค. ํ๋ จ ํ(์ฌ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ), ํ
์คํธ ์ธํธ์์ ํ๊ฐํ ๊ฒ์
๋๋ค. ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ ์ํด ํน์ฑ์ ์ค์ผ์ผ๋งํ์ฌ ๋จ์ผ ํน์ฑ์ด ์ค์ผ์ผ๋ก ์ธํด ์ง๋ฐฐํ์ง ์๋๋ก ํ ๊ฒ์
๋๋ค.
```python
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
# 1. Load NSL-KDD and preprocess similarly
col_names = [ # 41ย features + 2ย targets
"duration","protocol_type","service","flag","src_bytes","dst_bytes","land",
"wrong_fragment","urgent","hot","num_failed_logins","logged_in",
"num_compromised","root_shell","su_attempted","num_root","num_file_creations",
"num_shells","num_access_files","num_outbound_cmds","is_host_login",
"is_guest_login","count","srv_count","serror_rate","srv_serror_rate",
"rerror_rate","srv_rerror_rate","same_srv_rate","diff_srv_rate",
"srv_diff_host_rate","dst_host_count","dst_host_srv_count",
"dst_host_same_srv_rate","dst_host_diff_srv_rate",
"dst_host_same_src_port_rate","dst_host_srv_diff_host_rate",
"dst_host_serror_rate","dst_host_srv_serror_rate","dst_host_rerror_rate",
"dst_host_srv_rerror_rate","class","difficulty_level"
]
train_url = "https://raw.githubusercontent.com/Mamcose/NSL-KDD-Network-Intrusion-Detection/master/NSL_KDD_Train.csv"
test_url = "https://raw.githubusercontent.com/Mamcose/NSL-KDD-Network-Intrusion-Detection/master/NSL_KDD_Test.csv"
df_train = pd.read_csv(train_url, header=None, names=col_names)
df_test = pd.read_csv(test_url, header=None, names=col_names)
from sklearn.preprocessing import LabelEncoder
for col in ['protocol_type', 'service', 'flag']:
le = LabelEncoder()
le.fit(pd.concat([df_train[col], df_test[col]], axis=0))
df_train[col] = le.transform(df_train[col])
df_test[col] = le.transform(df_test[col])
X = df_train.drop(columns=['class', 'difficulty_level'], errors='ignore')
y = df_train['class'].apply(lambda x: 0 if x.strip().lower() == 'normal' else 1)
# Use a random subset of the training data for K-NN (to reduce computation)
X_train = X.sample(n=20000, random_state=42)
y_train = y[X_train.index]
# Use the full test set for evaluation
X_test = df_test.drop(columns=['class', 'difficulty_level'], errors='ignore')
y_test = df_test['class'].apply(lambda x: 0 if x.strip().lower() == 'normal' else 1)
# 2. Feature scaling for distance-based model
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 3. Train k-NN classifier (store data)
model = KNeighborsClassifier(n_neighbors=5, n_jobs=-1)
model.fit(X_train, y_train)
# 4. Evaluate on test set
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]
print(f"Accuracy: {accuracy_score(y_test, y_pred):.3f}")
print(f"Precision: {precision_score(y_test, y_pred):.3f}")
print(f"Recall: {recall_score(y_test, y_pred):.3f}")
print(f"F1-score: {f1_score(y_test, y_pred):.3f}")
print(f"ROC AUC: {roc_auc_score(y_test, y_prob):.3f}")
"""
Accuracy: 0.780
Precision: 0.972
Recall: 0.632
F1-score: 0.766
ROC AUC: 0.837
"""
k-NN ๋ชจ๋ธ์ ํ๋ จ ์ธํธ์ 5๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฐ๊ฒฐ์ ์ดํด๋ณด์ ์ฐ๊ฒฐ์ ๋ถ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ทธ ์ด์ ์ค 4๊ฐ๊ฐ ๊ณต๊ฒฉ(์ด์์น)์ด๊ณ 1๊ฐ๊ฐ ์ ์์ธ ๊ฒฝ์ฐ, ์๋ก์ด ์ฐ๊ฒฐ์ ๊ณต๊ฒฉ์ผ๋ก ๋ถ๋ฅ๋ฉ๋๋ค. ์ฑ๋ฅ์ ํฉ๋ฆฌ์ ์ผ ์ ์์ง๋ง, ์ข ์ข ๋์ผํ ๋ฐ์ดํฐ์์ ์ ์กฐ์ ๋ Random Forest๋ SVM๋งํผ ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ k-NN์ ํด๋์ค ๋ถํฌ๊ฐ ๋งค์ฐ ๋ถ๊ท์นํ๊ณ ๋ณต์กํ ๋ ๋น์ ๋ฐํ ์ ์์ผ๋ฉฐ, ํจ๊ณผ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์กฐํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ์ด๋ฒ ๋ณด์์์ k-NN( k=1 ๋๋ ์์ k)์ ์๋ฅผ ๋ค์ด ์๋ ค์ง ๊ณต๊ฒฉ ํจํด์ ํ์งํ๋ ๋ฐ ์ฌ์ฉ๋๊ฑฐ๋ ๋ ๋ณต์กํ ์์คํ ์ ๊ตฌ์ฑ ์์๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค(์: ํด๋ฌ์คํฐ๋ง ํ ํด๋ฌ์คํฐ ๋ฉค๋ฒ์ญ์ ๋ฐ๋ผ ๋ถ๋ฅ).
Gradient Boosting Machines (์: XGBoost)
Gradient Boosting Machines๋ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ์ ๋ํด ๊ฐ์ฅ ๊ฐ๋ ฅํ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ ๋๋ค. Gradient boosting์ ์ฝํ ํ์ต์(์ข ์ข ๊ฒฐ์ ํธ๋ฆฌ)์ ์์๋ธ์ ์์ฐจ์ ์ผ๋ก ๊ตฌ์ถํ๋ ๊ธฐ์ ์ ์๋ฏธํ๋ฉฐ, ๊ฐ ์๋ก์ด ๋ชจ๋ธ์ ์ด์ ์์๋ธ์ ์ค๋ฅ๋ฅผ ์์ ํฉ๋๋ค. ๋๋ฌด๋ฅผ ๋ณ๋ ฌ๋ก ๊ตฌ์ถํ๊ณ ํ๊ท ํํ๋ bagging(Random Forests)๊ณผ ๋ฌ๋ฆฌ, boosting์ ๋๋ฌด๋ฅผ ํ๋์ฉ ๊ตฌ์ถํ๋ฉฐ, ๊ฐ ๋๋ฌด๋ ์ด์ ๋๋ฌด๊ฐ ์๋ชป ์์ธกํ ์ธ์คํด์ค์ ๋ ์ง์คํฉ๋๋ค.
์ต๊ทผ ๋ช ๋ ๋์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๊ตฌํ์ XGBoost, LightGBM, CatBoost๋ก, ๋ชจ๋ gradient boosting decision tree (GBDT) ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ด๋ค์ ๊ธฐ๊ณ ํ์ต ๋ํ์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ๋งค์ฐ ์ฑ๊ณต์ ์ด์์ผ๋ฉฐ, ์ข ์ข ํ ํ์ ๋ฐ์ดํฐ์ ์์ ์ต์ฒจ๋จ ์ฑ๋ฅ์ ๋ฌ์ฑํฉ๋๋ค. ์ฌ์ด๋ฒ ๋ณด์์์ ์ฐ๊ตฌ์์ ์ค๋ฌด์๋ ์ ์ฑ ์ฝ๋ ํ์ง(ํ์ผ ๋๋ ๋ฐํ์ ๋์์์ ์ถ์ถํ ๊ธฐ๋ฅ ์ฌ์ฉ) ๋ฐ ๋คํธ์ํฌ ์นจ์ ํ์ง์ ๊ฐ์ ์์ ์ gradient boosted trees๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์๋ฅผ ๋ค์ด, gradient boosting ๋ชจ๋ธ์ โ๋ง์ SYN ํจํท๊ณผ ๋น์ ์์ ์ธ ํฌํธ -> ์ค์บ ๊ฐ๋ฅ์ฑโ๊ณผ ๊ฐ์ ๋ง์ ์ฝํ ๊ท์น(ํธ๋ฆฌ)์ ๊ฒฐํฉํ์ฌ ๋ง์ ๋ฏธ์ธํ ํจํด์ ๊ณ ๋ คํ๋ ๊ฐ๋ ฅํ ๋ณตํฉ ํ์ง๊ธฐ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
๋ถ์คํธ๋ ํธ๋ฆฌ๊ฐ ์ ์ด๋ ๊ฒ ํจ๊ณผ์ ์ผ๊น์? ์ํ์ค์ ๊ฐ ํธ๋ฆฌ๋ ํ์ฌ ์์๋ธ์ ์์ธก์ ์์ฌ ์ค๋ฅ (๊ธฐ์ธ๊ธฐ)์ ๋ํด ํ๋ จ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ธ์ด ์ฝํ ์์ญ์ ์ ์ง์ ์ผ๋ก **โ๋ถ์คํธโ**ํฉ๋๋ค. ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ ํ์ต์๋ก ์ฌ์ฉํ๋ฉด ์ต์ข ๋ชจ๋ธ์ด ๋ณต์กํ ์ํธ์์ฉ๊ณผ ๋น์ ํ ๊ด๊ณ๋ฅผ ํฌ์ฐฉํ ์ ์์ต๋๋ค. ๋ํ, boosting์ ๋ณธ์ง์ ์ผ๋ก ๋ด์ฅ๋ ์ ๊ทํ ํํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค: ๋ง์ ์์ ํธ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ณ (๊ธฐ์ฌ๋๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด ํ์ต๋ฅ ์ ์ฌ์ฉํ์ฌ) ์ผ๋ฐ์ ์ผ๋ก ์ ์ ํ ๋งค๊ฐ๋ณ์๊ฐ ์ ํ๋๋ฉด ํฐ ๊ณผ์ ํฉ ์์ด ์ ์ผ๋ฐํ๋ฉ๋๋ค.
Gradient Boosting์ ์ฃผ์ ํน์ฑ:
-
๋ฌธ์ ์ ํ: ์ฃผ๋ก ๋ถ๋ฅ ๋ฐ ํ๊ท. ๋ณด์์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ฅ(์: ์ฐ๊ฒฐ ๋๋ ํ์ผ์ ์ด์ง ๋ถ๋ฅ). ์ด์ง, ๋ค์ค ํด๋์ค(์ ์ ํ ์์ค์ ์ฌ์ฉ) ๋ฐ ์์ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
-
ํด์ ๊ฐ๋ฅ์ฑ: ๋ฎ์์์ ์ค๊ฐ. ๋จ์ผ ๋ถ์คํธ๋ ํธ๋ฆฌ๋ ์์ง๋ง ์ ์ฒด ๋ชจ๋ธ์ ์๋ฐฑ ๊ฐ์ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์์ด ์ ์ฒด์ ์ผ๋ก ์ธ๊ฐ์ด ํด์ํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌ๋ Random Forest์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ๋ฅ ์ค์๋ ์ ์๋ฅผ ์ ๊ณตํ ์ ์์ผ๋ฉฐ, SHAP(SHapley Additive exPlanations)์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ ์์ธก์ ์ด๋ ์ ๋ ํด์ํ ์ ์์ต๋๋ค.
-
์ฅ์ : ๊ตฌ์กฐํ๋/ํ ํ์ ๋ฐ์ดํฐ์ ๋ํด ์ข ์ข ์ต๊ณ ์ฑ๋ฅ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ๋ณต์กํ ํจํด๊ณผ ์ํธ์์ฉ์ ํ์งํ ์ ์์ต๋๋ค. ๋ชจ๋ธ ๋ณต์ก์ฑ์ ์กฐ์ ํ๊ณ ๊ณผ์ ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ง์ ์กฐ์ ๋ ธ๋ธ(ํธ๋ฆฌ ์, ํธ๋ฆฌ ๊น์ด, ํ์ต๋ฅ , ์ ๊ทํ ํญ)๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํ๋ ๊ตฌํ์ ์๋๋ฅผ ์ต์ ํํ์ต๋๋ค(์: XGBoost๋ 2์ฐจ ๊ธฐ์ธ๊ธฐ ์ ๋ณด์ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค). ์ ์ ํ ์์ค ํจ์์ ์ํ ๊ฐ์ค์น๋ฅผ ์กฐ์ ํ๋ฉด ๋ถ๊ท ํ ๋ฐ์ดํฐ๋ฅผ ๋ ์ ์ฒ๋ฆฌํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
-
์ ํ ์ฌํญ: ๋ ๊ฐ๋จํ ๋ชจ๋ธ๋ณด๋ค ์กฐ์ ์ด ๋ณต์กํฉ๋๋ค; ํธ๋ฆฌ๊ฐ ๊น๊ฑฐ๋ ํธ๋ฆฌ ์๊ฐ ๋ง์ผ๋ฉด ํ๋ จ์ด ๋๋ฆด ์ ์์ต๋๋ค(๊ทธ๋ฌ๋ ์ฌ์ ํ ๋์ผํ ๋ฐ์ดํฐ์์ ๋น๊ต ๊ฐ๋ฅํ ๊น์ ์ ๊ฒฝ๋ง์ ํ๋ จํ๋ ๊ฒ๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ๋น ๋ฆ ๋๋ค). ์กฐ์ ํ์ง ์์ผ๋ฉด ๋ชจ๋ธ์ด ๊ณผ์ ํฉํ ์ ์์ต๋๋ค(์: ์ถฉ๋ถํ ์ ๊ทํ ์์ด ๋๋ฌด ๋ง์ ๊น์ ํธ๋ฆฌ). ๋ง์ ํ์ดํผํ๋ผ๋ฏธํฐ๋ก ์ธํด gradient boosting์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ๋ ๋ง์ ์ ๋ฌธ ์ง์์ด๋ ์คํ์ด ํ์ํ ์ ์์ต๋๋ค. ๋ํ, ํธ๋ฆฌ ๊ธฐ๋ฐ ๋ฐฉ๋ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋งค์ฐ ํฌ์ํ ๊ณ ์ฐจ์ ๋ฐ์ดํฐ๋ฅผ ์ ํ ๋ชจ๋ธ์ด๋ Naive Bayes๋งํผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ์ง ์์ต๋๋ค(๊ทธ๋ฌ๋ ์ฌ์ ํ ์ ์ฉํ ์ ์์ผ๋ฉฐ, ์๋ฅผ ๋ค์ด ํ ์คํธ ๋ถ๋ฅ์์ ์ฌ์ฉํ ์ ์์ง๋ง ๊ธฐ๋ฅ ์์ง๋์ด๋ง ์์ด๋ ์ฒซ ๋ฒ์งธ ์ ํ์ด ์๋ ์ ์์ต๋๋ค).
Tip
์ฌ์ด๋ฒ ๋ณด์์ ์ฌ์ฉ ์ฌ๋ก: ๊ฒฐ์ ํธ๋ฆฌ๋ ๋๋ค ํฌ๋ ์คํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฑฐ์ ๋ชจ๋ ๊ณณ์์ gradient boosting ๋ชจ๋ธ์ด ๋ ๋์ ์ ํ๋๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Microsoft์ ์ ์ฑ ์ฝ๋ ํ์ง ๋ํ์์๋ ์ด์ง ํ์ผ์์ ์์ง๋์ด๋ง๋ ๊ธฐ๋ฅ์ ๋ํด XGBoost๋ฅผ ๋ง์ด ์ฌ์ฉํ์ต๋๋ค. ๋คํธ์ํฌ ์นจ์ ํ์ง ์ฐ๊ตฌ๋ ์ข ์ข GBDT์์ ์ต๊ณ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค(์: CIC-IDS2017 ๋๋ UNSW-NB15 ๋ฐ์ดํฐ์ ์์ XGBoost). ์ด๋ฌํ ๋ชจ๋ธ์ ๋ค์ํ ๊ธฐ๋ฅ(ํ๋กํ ์ฝ ์ ํ, ํน์ ์ด๋ฒคํธ์ ๋น๋, ํธ๋ํฝ์ ํต๊ณ์ ๊ธฐ๋ฅ ๋ฑ)์ ์์งํ์ฌ ์ํ์ ํ์งํ ์ ์์ต๋๋ค. ํผ์ฑ ํ์ง์์๋ gradient boosting์ด URL์ ์ดํ์ ๊ธฐ๋ฅ, ๋๋ฉ์ธ ํํ ๊ธฐ๋ฅ ๋ฐ ํ์ด์ง ์ฝํ ์ธ ๊ธฐ๋ฅ์ ๊ฒฐํฉํ์ฌ ๋งค์ฐ ๋์ ์ ํ๋๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์์๋ธ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ์ดํฐ์ ๋ง์ ๋ชจ์๋ฆฌ ์ฌ๋ก์ ๋ฏธ์ธํ ๋ถ๋ถ์ ํฌ๊ดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์์ -- ํผ์ฑ ํ์ง๋ฅผ ์ํ XGBoost:
ํผ์ฑ ๋ฐ์ดํฐ์ ์์ gradient boosting ๋ถ๋ฅ๊ธฐ๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ๊ฐ๋จํ๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์งํ๊ธฐ ์ํด `sklearn.ensemble.GradientBoostingClassifier`(๋๋ฆฌ์ง๋ง ๊ฐ๋จํ ๊ตฌํ)๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ ๋์ ์ฑ๋ฅ๊ณผ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ํด `xgboost` ๋๋ `lightgbm` ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ธ์ ํ๋ จํ๊ณ ์ด์ ๊ณผ ์ ์ฌํ๊ฒ ํ๊ฐํ ๊ฒ์ ๋๋ค. ```python import pandas as pd from sklearn.datasets import fetch_openml from sklearn.model_selection import train_test_split from sklearn.ensemble import GradientBoostingClassifier from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score1๏ธโฃ Load the โPhishingโฏWebsitesโ data directly from OpenML
data = fetch_openml(data_id=4534, as_frame=True) # or data_name=โPhishingWebsitesโ df = data.frame
2๏ธโฃ Separate features/target & make sure everything is numeric
X = df.drop(columns=[โResultโ]) y = df[โResultโ].astype(int).apply(lambda v: 1 if v == 1 else 0) # map {-1,1} โ {0,1}
(If any column is still objectโtyped, coerce it to numeric.)
X = X.apply(pd.to_numeric, errors=โcoerceโ).fillna(0)
3๏ธโฃ Train/test split
X_train, X_test, y_train, y_test = train_test_split( X.values, y, test_size=0.20, random_state=42 )
4๏ธโฃ Gradientย Boosting model
model = GradientBoostingClassifier( n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42 ) model.fit(X_train, y_train)
5๏ธโฃ Evaluation
y_pred = model.predict(X_test) y_prob = model.predict_proba(X_test)[:, 1]
print(fโAccuracy: {accuracy_score(y_test, y_pred):.3f}โ) print(fโPrecision: {precision_score(y_test, y_pred):.3f}โ) print(fโRecall: {recall_score(y_test, y_pred):.3f}โ) print(fโF1โscore: {f1_score(y_test, y_pred):.3f}โ) print(fโROCย AUC: {roc_auc_score(y_test, y_prob):.3f}โ)
โโโ Accuracy: 0.951 Precision: 0.949 Recall: 0.965 F1โscore: 0.957 ROC AUC: 0.990 โโโ
๊ทธ๋๋์ธํธ ๋ถ์คํ
๋ชจ๋ธ์ ์ด ํผ์ฑ ๋ฐ์ดํฐ์
์์ ๋งค์ฐ ๋์ ์ ํ๋์ AUC๋ฅผ ๋ฌ์ฑํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค(๋ฌธํ์์ ๋ณผ ์ ์๋ฏ์ด, ์ด๋ฌํ ๋ฐ์ดํฐ์์ ์ ์ ํ ์กฐ์ ์ ํตํด ์ด๋ฌํ ๋ชจ๋ธ์ ์ข
์ข
95% ์ด์์ ์ ํ๋๋ฅผ ์ด๊ณผํ ์ ์์ต๋๋ค. ์ด๋ GBDT๊ฐ *"ํ ํ ๋ฐ์ดํฐ์
์ ๋ํ ์ต์ฒจ๋จ ๋ชจ๋ธ"*๋ก ๊ฐ์ฃผ๋๋ ์ด์ ๋ฅผ ๋ณด์ฌ์ค๋๋ค -- ์ด๋ค์ ์ข
์ข
๋ณต์กํ ํจํด์ ํฌ์ฐฉํ์ฌ ๋ ๊ฐ๋จํ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ ๋ฐํํฉ๋๋ค. ์ฌ์ด๋ฒ ๋ณด์ ๋งฅ๋ฝ์์ ์ด๋ ๋ ์ ์ ์ค์๋ก ๋ ๋ง์ ํผ์ฑ ์ฌ์ดํธ๋ ๊ณต๊ฒฉ์ ์ก๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค. ๋ฌผ๋ก , ๊ณผ์ ํฉ์ ์ฃผ์ํด์ผ ํฉ๋๋ค -- ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ต์ฐจ ๊ฒ์ฆ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ๊ณ ๋ฐฐํฌ๋ฅผ ์ํ ๋ชจ๋ธ ๊ฐ๋ฐ ์ ๊ฒ์ฆ ์ธํธ์์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
</details>
### ๋ชจ๋ธ ๊ฒฐํฉ: ์์๋ธ ํ์ต ๋ฐ ์คํํน
์์๋ธ ํ์ต์ **์ฌ๋ฌ ๋ชจ๋ธ์ ๊ฒฐํฉํ์ฌ** ์ ์ฒด ์ฑ๋ฅ์ ํฅ์์ํค๋ ์ ๋ต์
๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ํน์ ์์๋ธ ๋ฐฉ๋ฒ์ ๋ณด์์ต๋๋ค: ๋๋ค ํฌ๋ ์คํธ(๋ฐฐ๊น
์ ํตํ ํธ๋ฆฌ์ ์์๋ธ)์ ๊ทธ๋๋์ธํธ ๋ถ์คํ
(์์ฐจ์ ๋ถ์คํ
์ ํตํ ํธ๋ฆฌ์ ์์๋ธ). ๊ทธ๋ฌ๋ ์์๋ธ์ **ํฌํ ์์๋ธ**์ด๋ **์คํ ์ผ๋ฐํ(์คํํน)**์ ๊ฐ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์์ฑ๋ ์ ์์ต๋๋ค. ์ฃผ์ ์์ด๋์ด๋ ์๋ก ๋ค๋ฅธ ๋ชจ๋ธ์ด ์๋ก ๋ค๋ฅธ ํจํด์ ํฌ์ฐฉํ๊ฑฐ๋ ์๋ก ๋ค๋ฅธ ์ฝ์ ์ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์
๋๋ค; ์ด๋ฅผ ๊ฒฐํฉํจ์ผ๋ก์จ ์ฐ๋ฆฌ๋ **๊ฐ ๋ชจ๋ธ์ ์ค๋ฅ๋ฅผ ๋ค๋ฅธ ๋ชจ๋ธ์ ๊ฐ์ ์ผ๋ก ๋ณด์ํ ์ ์์ต๋๋ค**.
- **ํฌํ ์์๋ธ:** ๊ฐ๋จํ ํฌํ ๋ถ๋ฅ๊ธฐ์์๋ ์ฌ๋ฌ ๋ค์ํ ๋ชจ๋ธ(์: ๋ก์ง์คํฑ ํ๊ท, ๊ฒฐ์ ํธ๋ฆฌ, SVM)์ ํ๋ จ์ํค๊ณ ์ต์ข
์์ธก์ ๋ํด ํฌํํ๊ฒ ํฉ๋๋ค(๋ถ๋ฅ๋ฅผ ์ํ ๋ค์๊ฒฐ ํฌํ). ์ฐ๋ฆฌ๊ฐ ํฌํ์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ๋ค๋ฉด(์: ๋ ์ ํํ ๋ชจ๋ธ์ ๋ ๋์ ๊ฐ์ค์น), ์ด๋ ๊ฐ์ค ํฌํ ๋ฐฉ์์
๋๋ค. ์ด๋ ๊ฐ๋ณ ๋ชจ๋ธ์ด ํฉ๋ฆฌ์ ์ผ๋ก ์ข๊ณ ๋
๋ฆฝ์ ์ผ ๋ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค -- ์์๋ธ์ ๋ค๋ฅธ ๋ชจ๋ธ์ด ์ด๋ฅผ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ ๋ชจ๋ธ์ ์ค์ ์ํ์ ์ค์
๋๋ค. ์ด๋ ๋จ์ผ ์๊ฒฌ๋ณด๋ค ์ ๋ฌธ๊ฐ ํจ๋์ ๊ฐ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
- **์คํํน(์คํ ์์๋ธ):** ์คํํน์ ํ ๊ฑธ์ ๋ ๋์๊ฐ๋๋ค. ๋จ์ํ ํฌํ ๋์ , **๋ฉํ ๋ชจ๋ธ**์ ํ๋ จ์์ผ **๊ธฐ๋ณธ ๋ชจ๋ธ์ ์์ธก์ ์ต์ ์ผ๋ก ๊ฒฐํฉํ๋ ๋ฐฉ๋ฒ์ ํ์ต**ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, 3๊ฐ์ ์๋ก ๋ค๋ฅธ ๋ถ๋ฅ๊ธฐ(๊ธฐ๋ณธ ํ์ต์)๋ฅผ ํ๋ จ์ํจ ํ, ๊ทธ๋ค์ ์ถ๋ ฅ(๋๋ ํ๋ฅ )์ ๋ฉํ ๋ถ๋ฅ๊ธฐ(์ข
์ข
๋ก์ง์คํฑ ํ๊ท์ ๊ฐ์ ๊ฐ๋จํ ๋ชจ๋ธ)์ ํน์ง์ผ๋ก ์ฌ์ฉํ์ฌ ์ต์ ์ ํผํฉ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค. ๋ฉํ ๋ชจ๋ธ์ ๊ณผ์ ํฉ์ ํผํ๊ธฐ ์ํด ๊ฒ์ฆ ์ธํธ์์ ๋๋ ๊ต์ฐจ ๊ฒ์ฆ์ ํตํด ํ๋ จ๋ฉ๋๋ค. ์คํํน์ *์ด๋ค ๋ชจ๋ธ์ ์ด๋ค ์ํฉ์์ ๋ ์ ๋ขฐํ ์ง๋ฅผ ํ์ตํจ์ผ๋ก์จ* ๊ฐ๋จํ ํฌํ๋ณด๋ค ์ข
์ข
๋ ๋์ ์ฑ๋ฅ์ ๋ฐํํ ์ ์์ต๋๋ค. ์ฌ์ด๋ฒ ๋ณด์์์๋ ํ ๋ชจ๋ธ์ด ๋คํธ์ํฌ ์ค์บ์ ์ก๋ ๋ฐ ๋ ๋์ ๋ฐ๋ฉด, ๋ค๋ฅธ ๋ชจ๋ธ์ ์
์ฑ์ฝ๋ ๋น์ฝ์ ์ก๋ ๋ฐ ๋ ๋์ ์ ์์ต๋๋ค; ์คํํน ๋ชจ๋ธ์ ๊ฐ ๋ชจ๋ธ์ ์ ์ ํ ์์กดํ๋ ๋ฐฉ๋ฒ์ ํ์ตํ ์ ์์ต๋๋ค.
ํฌํ๋ ์คํํน์ด๋ ์์๋ธ์ **์ ํ๋**์ ๊ฐ๊ฑด์ฑ์ **ํฅ์์ํค๋ ๊ฒฝํฅ์ด ์์ต๋๋ค**. ๋จ์ ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๊ณ ๋๋๋ก ํด์ ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ํ๋ค๋ ๊ฒ์
๋๋ค(๊ทธ๋ฌ๋ ๊ฒฐ์ ํธ๋ฆฌ์ ํ๊ท ๊ณผ ๊ฐ์ ์ผ๋ถ ์์๋ธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ ํ ์ผ๋ถ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค, ์: ํน์ง ์ค์๋). ์ค์ ๋ก ์ด์ ์ ์ฝ์ด ํ์ฉ๋๋ค๋ฉด, ์์๋ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ํ์ง์จ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ฌ์ด๋ฒ ๋ณด์ ์ฑ๋ฆฐ์ง(๋ฐ ์ผ๋ฐ์ ์ผ๋ก Kaggle ๋ํ)์์ ๋ง์ ์ฐ์น ์๋ฃจ์
์ด ์์๋ธ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ง์ง๋ง ์ฑ๋ฅ์ ๋์ด๋ด๊ณ ์์ต๋๋ค.
<details>
<summary>์์ -- ํผ์ฑ ํ์ง๋ฅผ ์ํ ํฌํ ์์๋ธ:</summary>
๋ชจ๋ธ ์คํํน์ ์ค๋ช
ํ๊ธฐ ์ํด, ํผ์ฑ ๋ฐ์ดํฐ์
์์ ๋
ผ์ํ ๋ช ๊ฐ์ง ๋ชจ๋ธ์ ๊ฒฐํฉํด ๋ณด๊ฒ ์ต๋๋ค. ๋ก์ง์คํฑ ํ๊ท, ๊ฒฐ์ ํธ๋ฆฌ ๋ฐ k-NN์ ๊ธฐ๋ณธ ํ์ต์๋ก ์ฌ์ฉํ๊ณ , ๋๋ค ํฌ๋ ์คํธ๋ฅผ ๋ฉํ ํ์ต์๋ก ์ฌ์ฉํ์ฌ ๊ทธ๋ค์ ์์ธก์ ์ง๊ณํฉ๋๋ค. ๋ฉํ ํ์ต์๋ ๊ธฐ๋ณธ ํ์ต์์ ์ถ๋ ฅ(ํ๋ จ ์ธํธ์์ ๊ต์ฐจ ๊ฒ์ฆ ์ฌ์ฉ)์ ๋ํด ํ๋ จ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์คํ ๋ชจ๋ธ์ด ๊ฐ๋ณ ๋ชจ๋ธ๋งํผ ์ ์ํํ๊ฑฐ๋ ์ฝ๊ฐ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ผ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
```python
import pandas as pd
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import StackingClassifier, RandomForestClassifier
from sklearn.metrics import (accuracy_score, precision_score,
recall_score, f1_score, roc_auc_score)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 1๏ธโฃ LOAD DATASET (OpenML idย 4534)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
data = fetch_openml(data_id=4534, as_frame=True) # โPhishingWebsitesโ
df = data.frame
# Target mapping: 1 โ legitimate (0), 0/โ1 โ phishing (1)
y = (df["Result"].astype(int) != 1).astype(int)
X = df.drop(columns=["Result"])
# Train / test split (stratified to keep class balance)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.20, random_state=42, stratify=y)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 2๏ธโฃ DEFINE BASE LEARNERS
# โข LogisticRegression and kโNN need scaling โ wrap them
# in a Pipeline(StandardScaler โ model) so that scaling
# happens inside each CV fold of StackingClassifier.
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
base_learners = [
('lr', make_pipeline(StandardScaler(),
LogisticRegression(max_iter=1000,
solver='lbfgs',
random_state=42))),
('dt', DecisionTreeClassifier(max_depth=5, random_state=42)),
('knn', make_pipeline(StandardScaler(),
KNeighborsClassifier(n_neighbors=5)))
]
# Metaโlearner (levelโ2 model)
meta_learner = RandomForestClassifier(n_estimators=50, random_state=42)
stack_model = StackingClassifier(
estimators = base_learners,
final_estimator = meta_learner,
cv = 5, # 5โfold CV to create metaโfeatures
passthrough = False # only base learnersโ predictions go to metaโlearner
)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 3๏ธโฃ TRAIN ENSEMBLE
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
stack_model.fit(X_train, y_train)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 4๏ธโฃ EVALUATE
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
y_pred = stack_model.predict(X_test)
y_prob = stack_model.predict_proba(X_test)[:, 1] # P(phishing)
print(f"Accuracy : {accuracy_score(y_test, y_pred):.3f}")
print(f"Precision: {precision_score(y_test, y_pred):.3f}")
print(f"Recall : {recall_score(y_test, y_pred):.3f}")
print(f"F1โscore : {f1_score(y_test, y_pred):.3f}")
print(f"ROCย AUC : {roc_auc_score(y_test, y_prob):.3f}")
"""
Accuracy : 0.954
Precision: 0.951
Recall : 0.946
F1โscore : 0.948
ROC AUC : 0.992
"""
์คํ ์์๋ธ์ ๊ธฐ๋ณธ ๋ชจ๋ธ์ ์ํธ ๋ณด์์ ์ธ ๊ฐ์ ์ ํ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ก์ง์คํฑ ํ๊ท๋ ๋ฐ์ดํฐ์ ์ ํ์ ์ธ ์ธก๋ฉด์ ์ฒ๋ฆฌํ ์ ์๊ณ , ๊ฒฐ์ ํธ๋ฆฌ๋ ํน์ ๊ท์น๊ณผ ๊ฐ์ ์ํธ์์ฉ์ ํฌ์ฐฉํ ์ ์์ผ๋ฉฐ, k-NN์ ํน์ฑ ๊ณต๊ฐ์ ์ง์ญ ์ด์์์ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ฐํํ ์ ์์ต๋๋ค. ๋ฉํ ๋ชจ๋ธ(์ฌ๊ธฐ์๋ ๋๋ค ํฌ๋ ์คํธ)์ ์ด๋ฌํ ์ ๋ ฅ์ ๊ฐ์ค์น๋ฅผ ํ์ตํ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ธ ๋ฉํธ๋ฆญ์ ์ข ์ข ๋จ์ผ ๋ชจ๋ธ์ ๋ฉํธ๋ฆญ๋ณด๋ค ๊ฐ์ ๋ ๊ฒฐ๊ณผ(๋น๋ก ์ฝ๊ฐ์ผ์ง๋ผ๋)๋ฅผ ๋ณด์ฌ์ค๋๋ค. ํผ์ฑ ์์ ์์ ๋ก์ง์คํฑ ํ๊ท๊ฐ F1 ์ ์ 0.95, ๊ฒฐ์ ํธ๋ฆฌ๊ฐ 0.94๋ฅผ ๊ธฐ๋กํ๋ค๋ฉด, ์คํ์ ๊ฐ ๋ชจ๋ธ์ด ์ค๋ฅ๋ฅผ ๋ฒํ๋ ๋ถ๋ถ์ ๋ณด์ํ์ฌ 0.96์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์์๋ธ ๋ฐฉ๋ฒ์ *โ์ฌ๋ฌ ๋ชจ๋ธ์ ๊ฒฐํฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ๋์ ์ผ๋ฐํ๋ฅผ ์ด๋๋คโ*๋ ์๋ฆฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ฌ์ด๋ฒ ๋ณด์์์๋ ์ฌ๋ฌ ํ์ง ์์ง(ํ๋๋ ๊ท์น ๊ธฐ๋ฐ, ํ๋๋ ๋จธ์ ๋ฌ๋, ํ๋๋ ์ด์ ํ์ง ๊ธฐ๋ฐ)์ ๋๊ณ , ๊ทธ๋ค์ ๊ฒฝ๊ณ ๋ฅผ ์ง๊ณํ๋ ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ์ฌ โ ์ฌ์ค์ ์์๋ธ์ ํ ํํ โ ๋ ๋์ ์ ๋ขฐ๋๋ก ์ต์ข ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค. ์ด๋ฌํ ์์คํ ์ ๋ฐฐํฌํ ๋๋ ์ถ๊ฐ๋ ๋ณต์ก์ฑ์ ๊ณ ๋ คํ๊ณ ์์๋ธ์ด ๊ด๋ฆฌํ๊ฑฐ๋ ์ค๋ช ํ๊ธฐ ์ด๋ ค์์ง์ง ์๋๋ก ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ํ์ฑ ์ธก๋ฉด์์ ์์๋ธ๊ณผ ์คํํน์ ๋ชจ๋ธ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค.
References
- https://madhuramiah.medium.com/logistic-regression-6e55553cc003
- https://www.geeksforgeeks.org/decision-tree-introduction-example/
- https://rjwave.org/ijedr/viewpaperforall.php?paper=IJEDR1703132
- https://www.ibm.com/think/topics/support-vector-machine
- https://en.m.wikipedia.org/wiki/Naive_Bayes_spam_filtering
- https://medium.com/@rupalipatelkvc/gbdt-demystified-how-lightgbm-xgboost-and-catboost-work-9479b7262644
- https://zvelo.com/ai-and-machine-learning-in-cybersecurity/
- https://medium.com/@chaandram/linear-regression-explained-28d5bf1934ae
- https://cybersecurity.springeropen.com/articles/10.1186/s42400-021-00103-8
- https://www.ibm.com/think/topics/knn
- https://www.ibm.com/think/topics/knn
- https://arxiv.org/pdf/2101.02552
- https://cybersecurity-magazine.com/how-deep-learning-enhances-intrusion-detection-systems/
- https://cybersecurity-magazine.com/how-deep-learning-enhances-intrusion-detection-systems/
- https://medium.com/@sarahzouinina/ensemble-learning-boosting-model-performance-by-combining-strengths-02e56165b901
- https://medium.com/@sarahzouinina/ensemble-learning-boosting-model-performance-by-combining-strengths-02e56165b901
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


