12
10월Random Forest
은행에서 새로운 고객의 예금 여부 예측하기
은행 데이터를 통해 고객의 특성을 바탕으로 새로운 고객이 예금을 할 것인지의 여부를 random forest 모델을 통해 예측해보겠습니다.
CSV파일 불러오기
csv파일을 불러오기 전에 먼저 pandas라는 패키지가 설치되어 있어야 합니다.
패키지 불러오기 (import)
import <패키지 이름>을 통해 패키지를 불러올 수 있습니다.
import pandas 라고 입력하게 되면 pandas라는 패키지를 불러옵니다. 또한, pandas라는 이름으로 해당 패키지에 접근을 하게 됩니다.
pandas라는 이름을 계속 쓸 수도 있지만 더 짧다면 코드를 빨리 쓸 수 있게 될 것입니다.
import pandas as pd 라고 입력하게 되면 pandas라는 패키지를 불러오고, pd라는 이름으로 해당 패키지에 접근을 하게 됩니다.
pandas 패키지를 통해 우리는 csv파일을 불러올 수 있습니다.
import pandas as pd
pd.read_csv를 사용해서 csv파일 읽기
pandas안에 있는 read_csv를 통해서 csv파일을 읽을 수 있습니다.
csv파일은 comma seperated value로, 콤마로 분리된 값입니다. 따라서 csv파일은 기본적으로 comma(,)로 구분되어 있습니다.
여기서, comma와 같이 값을 분리하는 기호를 delimiter(구분자)라고 합니다.
어떤 데이터는 csv파일 임에도 comma로 구분되어 있지 않고 다른 기호로 구분되어있기도 합니다.
이럴 경우, delimiter라는 옵션을 통해 구분자를 직접 지정해주기도 합니다.(delimiter 옵션의 default값(기본값)은 comma입니다.)
비슷하게, read_excel을 통해 excel파일을, read_sql을 통해 sql파일을, read_sas를 통해 sas파일을 읽을 수 있습니다.
또한, 읽은 데이터를 변수에 할당해주어야 합니다.
data = pd.read_csv('bank.csv',delimiter=';')
iloc라는 기능을 통해 인덱스를 가지고 원하는 행, 열을 뽑아낼 수 있습니다.
data.iloc[원하는 행, 원하는 열]
전체를 뽑고싶다면, data.iloc[:,:] 이고, 1~3행, 1~5행을 뽑고 싶다면 data.iloc[1:3,1:5] 이고, 전체 행과 마지막 열을 뽑고 싶다면 data.iloc[:,-1]과 같이 사용할 수 있습니다.
우리가 사용하는 데이터셋 마지막 열을 y(label)이고 나머지는 x(attributes)입니다. 따라서 x에는 마지막 행을 제외한 모든 행을 사용하고, y에는 마지막 행만 사용합니다
x = data.iloc[:,:-1] y = data.iloc[:,-1] print('나누기 전 x의 길이 : '+ str(len(x))) print('나누기 전 y의 길이 : '+str(len(y)))
dummy화 시키기, label 인코딩 하기
우리가 쓸 bank 데이터를 보게되면, job, martial, education등과 y에는 문자가 포함되어 있습니다.
기본적으로 컴퓨터는 이런 문자가 무엇을 의미하는지 알 수 없습니다.
따라서 문자를 숫자로 바꾸어 주는 작업을 해야하는데 이를 인코딩이라고 합니다.
예를 들어, job의 unemployed와 services, management를 0,1,2로 바꾸어 주면 될까요?
정답은 아닙니다.
왜냐하면 연속적인 의미를 가지는 변수가 아니기 때문입니다. management가 unemployee보다 큰 값이라고 볼 수는 없습니다.
따라서 더미 변수를 만들어 주어야 합니다.
더미변수란 0과 1로 코딩된 것을 의미합니다.
즉, job_unemployee, job_services, job_management, job_blue-collar과 같은 행을 새로 만들어 주어야 하고, 0번 행은 unemployee행의 1의 값으로 job_services, job_management, job_blue-collar에는 0의 값으로 채워지게 됩니다.
이를 모두 수작업으로 할 수 없으니 pandas의 모듈을 사용해보겠습니다.
또한, label인코더를 사용하여 y값도 숫자값으로 바꾸어 주겠습니다.
참고로 y값은 계산되어 나오는 수식의 값이이 때문에 더미화를 하지 않고 단순히 숫자로 대치합니다.
data.head() #head()옵션을 통해 5개의 행만 볼 수 있습니다.
import sklearn.preprocessing le = sklearn.preprocessing.LabelEncoder() #라벨 인코더를 만듭니다.
le.fit(y) #라벨 인코더에 y를 적용합니다.
le.classes_ #y의 class를 볼 수 있습니다. y의 class에는 'no'와 'yes'가 있습니다.
new_y = le.transform(y) #전체 y에서 'no'는 0으로 'yes'는 1로 new_y라는 변수에 대치되었습니다.
new_x = pd.get_dummies(x) #x의 더미화가 필요한 모든 변수를 찾아 알아서 더미변수로 만들어 new_x에 할당합니다.
new_x.head() #51개의 열로 바뀌었습니다.
new_y #yes,no 값이 아닌 0과 1로 바뀌었습니다.
train test 나누기
분석을 하기 앞서, 모델에 학습을 시킬 데이터와 모델의 성능을 검증할 데이터를 분리해야 합니다.
일반적으로 전체 데이터셋에서 70%를 학습으로, 30%를 검증으로 사용합니다.
이와 같이 train과 test를 나누기 위해 sklearn.model_selection을 import합니다.
import sklearn.model_selection
x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(new_x,new_y,test_size = 0.3) print('나눈 후 x_train의 길이 : '+ str(len(x_train))) print('나눈 후 y_train의 길이 : '+ str(len(y_train))) print('나눈 후 x_test의 길이 : '+ str(len(x_test))) print('나눈 후 y_test의 길이 : '+ str(len(y_test)))
은행 데이터 분석
import sklearn.ensemble
clf = sklearn.ensemble.RandomForestClassifier(n_estimators= 100, min_samples_split=2)
clf.fit(X=x_train,y=y_train)
y_predict = clf.predict(x_test) #y_predict 값에 x_test를 통해 예측한 값이 할당됩니다.
y_predict
모델의 검증
우리는 test데이터중에서 x_test로 모델을 통해 예측한 y_predict값과 실제값인 y_test을 가지고 있습니다.
y_test중에서 y_predict가 얼마나 잘 맞췄는지 본다면 이 모델의 정확도를 알 수 있을 것입니다.
import sklearn.metrics
sklearn.metrics.accuracy_score(y_test, y_predict) #accuracy_score을 통해 단순히 몇개를 맞추었는지 알 수 있습니다.
print(sklearn.metrics.classification_report(y_test, y_predict)) #classification_report를 통해 precision, recall fsocre를 알 수 있습니다.
Leave A Comment