선릉역 1번 출구
[adventofcyber2023] - Day_15_Machine learning Jingle Bell SPAM: Machine Learning Saves the Day! 본문
[adventofcyber2023] - Day_15_Machine learning Jingle Bell SPAM: Machine Learning Saves the Day!
choideu 2023. 12. 17. 09:59Story: 지난 몇주 동안 best festival company 직원들은 많은 스팸을 받아, 기존 스팸 탐지기를 고쳐 스팸 메일을 막으려고 한다.
목표: machine learning pipeline의 다양한 단계 이해, machine learning 분류 및 학습 모델, 데이터 세트를 훈련 데이터와 테스트 데이터로 분할하기
1. Jupyter Notebook
- 실시간으로 코드를 실행하므로 데이터 분석, 기계 학습 및 과학 연구에 사용됨
2. 머신러닝 파이프라인
- ML 모델 구축 및 배포와 관련된 일련의 단계를 의미
- 해당 단계를 통해 데이터가 원시 형식에서 예측 및 통찰력으로 효율적으로 흐름
- Ingestion > Cleaning > Preprocessing > Modeling Deployment
1) 필수 라이브러리 가져오기
import numpy as np
import pandas as pd
2) 데이터 수집
- 머신러닝에 사용할 raw 데이터를 다양한 소스에서 수집하는 프로세스
- Pandas를 통해 다양한 소스에서 수집된 데이터를 로드함 csv 형식임
data = pd.read_csv("emails_dataset.csv")
3) 데이터 세트 테스트 및 확인
print(data.head())
4) DataFrame은 직관적이고 읽기 쉬운 구조화된 표 형식의 데이터 표현을 제공함
- 아래 명령을 사용하여 pandas 라이브러리를 사용하여 데이터를 프레임으로 변환
df = pd.DataFrame(data)
print(df)
5) 데이터 전처리
- 원시 데이터를 기계 학습에 적합한 구조화된 형식으로 변환하는 데 사용되는 기술
기술 | 설명 |
cleaning | 오류를 수정 / 누락된 값 채우기/ 노이즈 완화 / 이상값 처리 |
normalization | 숫자 데이터를 균일한 범위로 스케일링 |
standardization | 평균, 표준 편차 데이터 크기 조정 |
feature extraction | 텍스트, 이미지 등 임의의 데이터를 숫자로 변환 특징 |
dimenstionality reduction | 주 변수 집합을 구해 고려 중인 변수의 수를 줄임 |
discretization | 연속형 변수를 이산형 변수로 변환 |
text preprocessing | 토큰화, 형태소 분석, 표 제어 추출 |
imputation | 결측값을 평균, 중위수, 최빈값 또는 상수와 같은 통계적 값으로 대체 |
feature engineering | 새로운 기능을 생성하거나 기존 기능을 수정하여 모델 개선 |
6) CountVectorizer() 활용
- 머신러닝 모델은 텍스트가 아닌 숫자를 이해하므로, 텍스트를 숫자 형식으로 변환해야함
- python sciket-learn 라이브러리에서 제공하는 CountVectorizer 클래스를 활용하여 텍스트를 토큰 개수 행렬로 변환하여 수행
from sklearn.feature_extraction.text import CountVectorizer
7) 데이터 세트 분할(train, test)
from sklearn.model_selection import train_test_split
8) model training
모델 | 설명 |
나이브 베이즈 분류기 | 특징 사이의 독립성을 가정한 베이즈 정리에 기반한 확률적 분류기, 고차원 텍스트 데이터에 적합 |
SVM | 특징 공간에서 서로 다른 클래스를 분리할 수 있는 최적의 초평면을 찾는 분류기로 커널 함수와 함께 사용할 경우 비선형 및 고차원 데이터와잘 작동함 |
로지스틱 회귀 | 로지스틱 함수를 사용해 이항 종속 변수를 모형화하는 통계 모형 |
의사결정 트리 | 결정과 그로 인한 가능한 결과에 대한 트리와 같은 그래프를 사용함 이해하기 쉽지만, 적절한 가지치기가 없으면 overfitting되기 쉬움 |
랜덤 포레스트 | 일반적으로 예측 정확도와 과적합 제어를 향사시키기 위해 "배깅" 방법으로 훈련된 의사 결정 트리의 앙상블 |
GBM | 앙상블 학습 방법은 단계별 방식으로 강력한 예측 모델을 구축하는 것으로, 올바르게 조정하면 랜덤 포레스트를 능가하는 것으로 알려짐 |
K-최근접이웃(KNN) | 데이터 포인트가 k개의 가장 가까운 이웃 중에서 가장 일반적인 클래스에 할당된 상태에서 이웃의 다수결을 기준으로 각 데이터 포인틀르 분류하는 방법 |
9) Naive Bayes를 사용한 모델 훈련
- 특정 확률을 사용하는 통계 방법으로 스팸 및 스팸이 아닌 이메일에 나타나는 단어를 사용해 새로운 이메일이 스팸인지 아닌지 여부를 결정함
- 작동 방식
- Naive Bayes 알고리즘은 각 이메일의 단어를 살펴보고 스팸/비스팸 이메일에 각 단어가 얼마나 자주 나타나는지 계산함
- 이메일에 ㅍ포함된 단어를 기반으로 이메일이 스팸일 확률을 계산
- 예시: "free"는 스팸에서도 흔하게 사용되는 단어로, 스팸 확률이 높아짐
- 즉 모든 단어를 고려해서 이메일이 스팸 및 햄일 확률을 전반적으로 계산해 스팸 여부를 가림
10) Navie Bayes를 사용해 모델 학습
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
clf.fit(X_train, y_train)
11) 모델 평가
12) 모델 테스트
- 새 메시지를 분류하고 스팸인지 비스팸인지 판단해보기
message = vectorizer.transform(["Today's Offer! Claim ur £150 worth of discount vouchers! Text YES to 85023 now! SavaMob, member offers mobile! T Cs 08717898035. £3.00 Sub. 16 . Unsub reply X "])
prediction = clf.predict(message)
print("The email is :", prediction[0])
+ challenge