집돌이 공대남 IT

데이터로 미래를 보다: 범죄 예측 머신러닝 모델 만들기 본문

IT/파이썬

데이터로 미래를 보다: 범죄 예측 머신러닝 모델 만들기

집공이 2023. 7. 27. 12:00

안녕하세요 공대남입니다!

현실에서 범죄를 예측할 수 있다면 얼마나 좋을까요?

범죄 예측 프로그램을 만들기 위한 실습 과정을 아래와 같이 상세하게 설명해보겠습니다.

이 예제에서는 Python을 사용하며, 대표적인 머신러닝 라이브러리인 scikit-learn을 사용합니다.

 

1단계: 데이터 수집

먼저, 범죄 데이터를 수집해야 합니다. 이 데이터는 국가, 도시, 지역 당 범죄율, 인구, 경제 상태, 교육 수준 등 여러 가지 요인을 포함할 수 있습니다. 공공 데이터 포털, Kaggle 등에서 이러한 데이터를 찾을 수 있습니다.

 

2단계: 데이터 전처리

수집한 데이터를 적절하게 전처리해야 합니다. 누락된 값을 채우거나, 이상치를 제거하거나, 범주형 변수를 숫자로 변환하는 등의 작업을 포함합니다.

import pandas as pd
from sklearn.preprocessing import LabelEncoder

# 데이터 로드
data = pd.read_csv('crime_data.csv')

# 결측치 처리
data = data.fillna(method='ffill')

# 범주형 데이터 숫자로 변환
le = LabelEncoder()
data['Category'] = le.fit_transform(data['Category'])

 

3단계: 학습 데이터와 테스트 데이터 나누기

전처리한 데이터를 학습 데이터와 테스트 데이터로 나눕니다.

from sklearn.model_selection import train_test_split

X = data.drop('Category', axis=1) # 타겟 변수 제외한 나머지를 특성 변수로 사용
y = data['Category'] # 타겟 변수

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

 

4단계: 모델 학습

이제 머신러닝 모델을 학습시킬 차례입니다. 이 예제에서는 로지스틱 회귀 모델을 사용하겠습니다.

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(X_train, y_train)

 

5단계: 모델 평가

학습한 모델의 성능을 평가합니다.

from sklearn.metrics import classification_report

predictions = model.predict(X_test)
print(classification_report(y_test, predictions))

이제 범죄 예측 모델이 준비되었습니다!

물론, 실제 문제에서는 모델의 성능을 더욱 향상시키기 위해 여러 가지 최적화 기법을 사용하게 될 것입니다.

이에는 모델의 하이퍼파라미터 튜닝, 다른 모델 시도, 앙상블 기법 사용 등이 포함될 수 있습니다. 

최적화 중 하나인 하이퍼파라미터 튜닝에 대해서 설명하려 합니다.

이 과정에서는 모델의 성능에 영향을 미치는 여러 매개변수들을 조정하며 최적의 세팅을 찾아봅니다.

 

하이퍼파라미터 튜닝

하이퍼파라미터는 머신러닝 모델의 성능에 영향을 미치는 매개변수들입니다. 이 값들은 학습 과정에서 자동으로 학습되는 것이 아니라, 사람이 직접 설정해주어야 합니다.

가장 기본적인 하이퍼파라미터 튜닝 기법은 그리드 검색(Grid Search)과 랜덤 검색(Random Search)입니다.

 

1단계: 그리드 검색(Grid Search)

그리드 검색은 모든 가능한 하이퍼파라미터의 조합을 시도해보는 것입니다. 예를 들어, 로지스틱 회귀 모델의 경우 C 값과 penalty 값을 변경해가며 최적의 조합을 찾아볼 수 있습니다.

from sklearn.model_selection import GridSearchCV

parameters = {'C': [0.1, 1, 10, 100], 
              'penalty': ['l1', 'l2']}

grid_search = GridSearchCV(LogisticRegression(), parameters)
grid_search.fit(X_train, y_train)

# 최적의 파라미터 확인
print(grid_search.best_params_)

 

2단계: 랜덤 검색(Random Search)

그리드 검색이 모든 가능한 조합을 시도하는 반면, 랜덤 검색은 특정 분포에서 랜덤하게 하이퍼파라미터를 샘플링하여 사용합니다. 이 방법은 그리드 검색보다는 덜 꼼꼼하지만, 많은 수의 하이퍼파라미터를 빠르게 탐색하는 데 유용합니다.

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform

parameters = {'C': uniform(0, 100), 
              'penalty': ['l1', 'l2']}

random_search = RandomizedSearchCV(LogisticRegression(), parameters)
random_search.fit(X_train, y_train)

# 최적의 파라미터 확인
print(random_search.best_params_)

하이퍼파라미터를 최적화한 후, 다시 모델을 학습시키고 평가하면 보다 개선된 성능을 얻을 수 있습니다. 그러나 주의할 점은 모델의 복잡성이 증가하여 과적합(overfitting)이 일어날 수 있다는 점입니다. 이를 방지하기 위해서는 교차 검증(cross-validation) 같은 기법을 활용하면 좋습니다.